On Sat, 9 Feb 2013 17:26:04 +0530 Arvind R <[email protected]> said:

cedric - comments?

> Hi,
> I needed to "swallow" an elm_player in my clip preparation program. In
> the process, I completed the mouse support for the player widget.
> 1. Modified in player.edc:
>       incorporated a volume attenuator using a diskelector.
>       added a check-box for mute
>       added a label widget 'billboard' to display length-time_remaing info
> 2. Modified in elm_widget_player.h:
>       instance data
> 3. Modified in elc_player.c:
>      The stop button now opens a fileselector. Cancel continues with
> the current media and a selection switches media.
>      Enabled label for slider to numerically indicate play position
>      Placed to the right of forward button - a 'billboard', volume
> attenuator, mute checkbox.
> Tested (r83733) the player widget to be complete w.r.t. to mouse
> control - load a new file, seek forward/backward, rewind, lower
> volume, mute and a blinking billboard.
> Not touched is the keyboard interface - which seems to be duplicated
> in the video widget. The "space" button used to play/pause media gets
> confused with the selection of currently focused widget.
> Problem not resolved (no clue) is that when the player is left in play
> mode and I switch to the VT, play stops after some seconds with
> gstreamer/xine engines. E17 vanishes off 'top'. Resuming X causes a
> rush of frames before stablising.
> Patch, applicable after the '3 small corrections' set posted to r83733
> follows.
> 
> Arvind
> ---
> diff -uprN a/data/themes/widgets/player.edc b/data/themes/widgets/player.edc
> --- a/data/themes/widgets/player.edc  2012-07-25 16:41:51.000000000
> +0530 +++ b/data/themes/widgets/player.edc    2013-02-06
> 12:24:53.000000000 +0530 @@ -4,12 +4,26 @@ group {
>     min: 20 10;
> 
>     parts {
> +      part { name: "media_player/background"; type: RECT;
> +          description {  state: "default" 0.0;
> +             color: 240 255 240 64;
> +                     rel1 {
> +                        relative: 0.0 0.0;
> +                        offset: 2 2;
> +                     }
> +                     rel2 {
> +                        relative: 1.0 1.0;
> +                        offset: -2 -2;
> +                     }
> +              }
> +       }
>        part { name: "media_player/slider"; type: SWALLOW;
>           description { state: "default" 0.0;
>              fixed: 0 1;
> +            rel1.relative: 0.1 0.0;
>              rel1.offset: 2 2;
> -            rel2.offset: 2 -3;
> -            rel2.relative: 1.0 0.0;
> +            rel2.offset: -2 -3;
> +            rel2.relative: 0.90 0.0;
>              align: 0.5 0.0;
>           }
>        }
> @@ -19,13 +33,13 @@ group {
>              min: BSZ BSZ;
>              align: 0.0 1.0;
>              rel1 {
> -               to_y: "media_player/slider";
> -               offset: 2 2;
> +               to: "media_player/slider";
> +               offset: -20 -4;
>                 relative: 0.0 1.0;
>              }
>              rel2 {
>                 relative: 0.0 1.0;
> -               offset: 2 -3;
> +               offset: 42 -3;
>              }
>           }
>        }
> @@ -125,13 +139,61 @@ group {
>        }
>        part { name: "media_player/forward"; type: SWALLOW;
>           description { state: "default" 0.0;
> +            fixed: 1 1;
>              min: BSZ BSZ;
>              align: 0.0 1.0;
>              rel1 { to: "media_player/next";
>                 offset: 2 0;
>                 relative: 1.0 0.0;
>              }
> -            rel2.offset: -3 -3;
> +            rel2 { to: "media_player/next";
> +               offset: 2 -1;
> +               relative: 1.0 1.0;
> +            }
> +         }
> +      }
> +      part { name: "media_player/billboard"; type: SWALLOW;
> +         description { state: "default" 0.0;
> +            fixed: 1 1;
> +            rel1 {
> +                        to_x: "media_player/volume";
> +               offset: -140 0;
> +               relative: 0.0 0.5;
> +            }
> +            rel2 { to_x: "media_player/volume";
> +               offset: -40 -3;
> +               relative: 0.0 1.0;
> +            }
> +         }
> +      }
> +      part { name: "media_player/volume"; type: SWALLOW;
> +         description { state: "default" 0.0;
> +            fixed: 0 1;
> +            rel1 {
> +                        to_y: "media_player/slider";
> +                        offset: 10 -3;
> +               relative: 0.60 1.0;
> +            }
> +            rel2 {
> +                        to_x: "media_player/mute";
> +                        offset: -15 -3;
> +               relative: 0.0 1.0;
> +            }
> +            align: 0.5 0.0;
> +         }
> +      }
> +      part { name: "media_player/mute"; type: SWALLOW;
> +         description { state: "default" 0.0;
> +            fixed: 1 1;
> +            align: 0.5 0.0;
> +            rel1 { to_y: "media_player/slider";
> +                        offset: -65 -3;
> +               relative: 0.95 1.0;
> +            }
> +            rel2 {
> +                        offset: -25 -3;
> +               relative: 0.95 1.0;
> +                     }
>           }
>        }
>     }
> @@ -142,6 +204,11 @@ group {
>           after: "pause/0";
>        }
>        program {
> +         signal: "elm,player,stop";
> +         source: "elm";
> +         after: "play/0";
> +      }
> +      program {
>           signal: "elm,player,play";
>           source: "elm";
>           after: "play/0";
> diff -uprN a/src/lib/elc_player.c b/src/lib/elc_player.c
> --- a/src/lib/elc_player.c    2013-02-06 23:22:03.000000000 +0530
> +++ b/src/lib/elc_player.c    2013-02-06 22:48:22.000000000 +0530
> @@ -34,6 +34,15 @@ static const Evas_Smart_Cb_Description _
>  };
> 
>  #ifdef HAVE_EMOTION
> +static void _stop(void *, Evas_Object *, void *);
> +static void _pause(void *, Evas_Object *, void *);
> +static void _play(void *, Evas_Object *, void *);
> +static void _forward(void *, Evas_Object *, void *);
> +static void _prev(void *, Evas_Object *, void *);
> +static void _rewind(void *, Evas_Object *, void *);
> +static void _next(void *, Evas_Object *, void *);
> +static void _mute_audio(void *, Evas_Object *, void *);
> +
>  static void
>  _elm_player_smart_event(Eo *obj, void *_pd, va_list *list)
>  {
> @@ -47,60 +56,72 @@ _elm_player_smart_event(Eo *obj, void *_
>     Evas_Event_Key_Down *ev = event_info;
> 
>     Elm_Player_Smart_Data *sd = _pd;
> +   Elm_Object_Item *itm;
> 
>     if (elm_widget_disabled_get(obj)) return;
>     if (type != EVAS_CALLBACK_KEY_DOWN) return;
>     if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
>     if (!sd->video) return;
> 
> +   if ((!strcmp(ev->keyname, "Up")) ||
> +       ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
> +     {
> +              itm = elm_diskselector_selected_item_get(sd->volume);
> +          itm = elm_diskselector_item_prev_get(itm);
> +              if (itm)
> +                 elm_diskselector_item_selected_set(itm, EINA_TRUE);
> +      } else
> +   if ((!strcmp(ev->keyname, "Down")) ||
> +       ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
> +     {
> +              itm = elm_diskselector_selected_item_get(sd->volume);
> +          itm = elm_diskselector_item_next_get(itm);
> +              if (itm)
> +                 elm_diskselector_item_selected_set(itm, EINA_TRUE);
> +      } else
>     if ((!strcmp(ev->keyname, "Left")) ||
>         ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
>       {
> -        double current, last;
> -
> -        current = elm_video_play_position_get(sd->video);
> -        last = elm_video_play_length_get(sd->video);
> -
> -        if (current < last)
> -          {
> -             current -= last / 100;
> -             elm_video_play_position_set(sd->video, current);
> -          }
> -
> -        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> -        if (ret) *ret = EINA_TRUE;
> -        return;
> -     }
> +         _prev(obj, NULL, NULL);
> +     } else
>     if ((!strcmp(ev->keyname, "Right")) ||
>         ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
>       {
> -        double current, last;
> -
> -        current = elm_video_play_position_get(sd->video);
> -        last = elm_video_play_length_get(sd->video);
> -
> -        if (current > 0)
> -          {
> -             current += last / 100;
> -             if (current < 0) current = 0;
> -             elm_video_play_position_set(sd->video, current);
> -          }
> -
> -        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> -        if (ret) *ret = EINA_TRUE;
> -        return;
> -     }
> -   if (!strcmp(ev->keyname, "space"))
> +         _forward(obj, NULL, NULL);
> +     } else
> +   if (!strcmp(ev->keyname, "p")) /* somebody is processing "space" */
>       {
>          if (elm_video_is_playing_get(sd->video))
> -          elm_video_pause(sd->video);
> +          _pause(obj, NULL, NULL);
>          else
> -          elm_video_play(sd->video);
> -        ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> -        if (ret) *ret = EINA_TRUE;
> -        return;
> +          _play(obj, NULL, NULL);
> +     } else
> +   if (!strcmp(ev->keyname, "m"))
> +     {
> +      elm_check_state_set(sd->mute,
> +         !elm_check_state_get(sd->mute));
> +     _mute_audio(obj, NULL, NULL);
> +     } else
> +   if (!strcmp(ev->keyname, "s") || /* for Stop */
> +       !strcmp(ev->keyname, "f") || /* for File */
> +       !strcmp(ev->keyname, "n"))   /* for Next */
> +     {
> +        _stop(obj, NULL, NULL);
> +     } else
> +   if (!strcmp(ev->keyname, "bracketleft"))
> +     {
> +         _rewind(obj, NULL, NULL);
> +      } else
> +   if (!strcmp(ev->keyname, "bracketright"))
> +     {
> +         _next(obj, NULL, NULL);
> +      } else {
> +        fprintf(stderr, "keyname: '%s' not handled\n", ev->keyname);
> +             return;
>       }
> -   fprintf(stderr, "keyname: '%s' not handle\n", ev->keyname);
> +   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
> +   if (ret) *ret = EINA_TRUE;
> +   fprintf(stderr, "keyname: '%s' handled\n", ev->keyname);
>  }
> 
> 
> @@ -153,6 +174,53 @@ _elm_player_smart_sizing_eval(Eo *obj, v
>  }
> 
>  static void
> +_update_volume(void *data,
> +               Evas_Object *disksel __UNUSED__,
> +               void *event_info)
> +{
> + Elm_Object_Item *item = event_info;
> + const char *key;
> + const double        *pval;
> +
> +   ELM_PLAYER_DATA_GET(data, sd);
> +
> +   key = elm_object_item_part_text_get(item, NULL);
> +   pval = eina_hash_find(sd->volume_vals, key);
> +   elm_video_audio_level_set (sd->video, *pval);
> +}
> +
> +static void
> +_mute_audio(void *data,
> +               Evas_Object *obj __UNUSED__,
> +               void *event_info __UNUSED__)
> +{
> +   ELM_PLAYER_DATA_GET(data, sd);
> +   elm_video_audio_mute_set
> +      (sd->video, elm_check_state_get(sd->mute));
> +}
> +
> +static char * _double_to_time(double);
> +
> +static void
> +_show_billboard(void *data,
> +               Evas_Object *obj __UNUSED__,
> +               void *event_info __UNUSED__)
> +{
> +   char *msg;
> +
> +   ELM_PLAYER_DATA_GET(data, sd);
> +
> +   strcpy(sd->msg, _double_to_time(sd->length));
> +   msg = strrchr(sd->msg, '.');
> +   *msg = 0;
> +   if (sd->frames == 30) {
> +    strcat(msg, "  ");
> +    strcat(msg, _double_to_time(sd->length - sd->pos));
> +   }
> +   elm_object_text_set(sd->billboard, sd->msg);
> +}
> +
> +static void
>  _update_slider(void *data,
>                 Evas_Object *obj __UNUSED__,
>                 void *event_info __UNUSED__)
> @@ -163,12 +231,38 @@ _update_slider(void *data,
>     ELM_PLAYER_DATA_GET(data, sd);
> 
>     seekable = elm_video_is_seekable_get(sd->video);
> +   if (seekable == sd->disabled)
> +    elm_object_disabled_set(sd->slider, !seekable);
> +
>     length = elm_video_play_length_get(sd->video);
> -   pos = elm_video_play_position_get(sd->video);
> 
> -   elm_object_disabled_set(sd->slider, !seekable);
> -   elm_slider_min_max_set(sd->slider, 0, length);
> -   elm_slider_value_set(sd->slider, pos);
> +   if (sd->length != length) {
> +     sd->length = length;
> +     elm_slider_min_max_set(sd->slider, 0, length);
> +   }
> +
> +   if (sd->frames < 0) {
> +     pos = elm_video_play_position_get(sd->video);
> +     if (fabs(sd->pos - pos) >= 0.1) {
> +             sd->pos = pos;
> +             sd->frames = 30;
> +             elm_slider_value_set(sd->slider, pos);
> +     }
> +   }
> +
> +   if(sd->frames == 10 || sd->frames == 30)
> +    _show_billboard(data, NULL, NULL);
> +}
> +
> +static void
> +_frame_decoded_cb(void *data,
> +               Evas_Object *obj __UNUSED__,
> +               void *event_info __UNUSED__)
> +{
> +   ELM_PLAYER_DATA_GET(data, sd);
> +   /* do not update slider on every frame */
> +   if (--sd->frames < 0)
> +     _update_slider(data, obj, event_info);
>  }
> 
>  static void
> @@ -176,9 +270,24 @@ _update_position(void *data,
>                   Evas_Object *obj __UNUSED__,
>                   void *event_info __UNUSED__)
>  {
> +   /*
> +    * called wnenever the value of the slider is changed.
> +     *  - irespective of user drags
> +     *    or
> +     *    internal increments larger than the slider resolution.
> +     * the 2nd case causes an inadvertent repositioning of stream
> +     * which some engines respond to (xine).
> +     * This is a feedback loop that needs to be broken.
> +     */
> +   double pos;
> +
>     ELM_PLAYER_DATA_GET(data, sd);
> 
> -   elm_video_play_position_set(sd->video, elm_slider_value_get(sd->slider));
> +   pos = elm_slider_value_get(sd->slider);
> +   if (fabs(sd->pos - pos) >= 0.1) {
> +     elm_video_play_position_set(sd->video, pos);
> +     sd->pos = pos;
> +   }
>  }
> 
>  static void
> @@ -240,6 +349,8 @@ _pause(void *data,
> 
>     elm_layout_signal_emit(data, "elm,button,pause", "elm");
>     evas_object_smart_callback_call(data, SIG_PAUSE_CLICKED, NULL);
> +   sd->frames = 30;
> +   _show_billboard(data, NULL, NULL);
>  }
> 
>  static void
> @@ -285,12 +396,86 @@ _rewind(void *data,
>  }
> 
>  static void
> +_file_chosen(void *data,
> +             Evas_Object *obj __UNUSED__,
> +                      void *event_info)
> +{
> + const char *file = (const char *) event_info;
> + Evas_Object *del;
> +
> +   ELM_PLAYER_DATA_GET(data, sd);
> +
> +   if (file)   {
> +     eina_stringshare_replace(&sd->path, file);
> +    elm_video_file_set(sd->video, file);
> +    elm_video_play_position_set(sd->video, 0);
> +   }
> +   elm_video_play(sd->video);
> +
> +   if (sd->inwin) {
> +    evas_object_hide(sd->filesel_win);
> +    evas_object_lower(sd->filesel_win);
> +   }
> +   else {
> +    del = sd->filesel_win;
> +     sd->filesel_win = NULL;
> +     sd->filesel = NULL;
> +     evas_object_del(del);
> +   }
> +}
> +
> +static void
> +_new_fileselector(Evas_Object *obj)
> +{
> +   ELM_PLAYER_DATA_GET(obj, sd);
> +
> +   sd->filesel = elm_fileselector_add(sd->filesel_win);
> +   elm_fileselector_is_save_set(sd->filesel, EINA_FALSE);
> +   elm_fileselector_mode_set(sd->filesel, ELM_FILESELECTOR_LIST); /*
> GRID is unprintable */
> +   elm_fileselector_buttons_ok_cancel_set(sd->filesel, EINA_TRUE);
> +   elm_fileselector_path_set(sd->filesel, eina_stringshare_add(sd->path));
> +   evas_object_size_hint_weight_set(sd->filesel, EVAS_HINT_EXPAND,
> EVAS_HINT_EXPAND);
> +   evas_object_size_hint_align_set(sd->filesel, EVAS_HINT_FILL,
> EVAS_HINT_FILL);
> +   evas_object_smart_callback_add(sd->filesel, "done", _file_chosen, obj);
> +}
> +
> +static void
> +_new_win(Evas_Object *obj)
> +{
> + Evas_Object *bg;
> +
> +   ELM_PLAYER_DATA_GET(obj, sd);
> +   sd->filesel_win = elm_win_add(NULL, "player_fileselector",
> ELM_WIN_DIALOG_BASIC);
> +   elm_win_title_set(sd->filesel_win, "Clip Selection");
> +   elm_win_autodel_set(sd->filesel_win, EINA_TRUE);
> +   evas_object_smart_callback_add(sd->filesel_win, "delete,request",
> _file_chosen, obj);
> +
> +   bg = elm_bg_add(sd->filesel_win);
> +   elm_win_resize_object_add(sd->filesel_win, bg);
> +   evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> +   evas_object_show(bg);
> +
> +   evas_object_resize(sd->filesel_win, 400, 400);
> +   _new_fileselector(obj);
> +}
> +
> +static void
>  _stop(void *data,
>        Evas_Object *obj __UNUSED__,
>        void *event_info __UNUSED__)
>  {
> +   ELM_PLAYER_DATA_GET(data, sd);
> +
>     elm_layout_signal_emit(data, "elm,button,stop", "elm");
>     evas_object_smart_callback_call(data, SIG_STOP_CLICKED, NULL);
> +
> +   if (sd->inwin)
> +     elm_win_inwin_activate(sd->filesel_win);
> +   else {
> +    _new_win(data);
> +    elm_win_resize_object_add(sd->filesel_win, sd->filesel);
> +   }
> +   elm_object_text_set(sd->billboard, "Play Stopped");
>  }
> 
>  static void
> @@ -307,11 +492,15 @@ _play_finished(void *data,
>                 void *event_info __UNUSED__)
>  {
>     elm_layout_signal_emit(data, "elm,player,pause", "elm");
> +   ELM_PLAYER_DATA_GET(data, sd);
> +   elm_object_text_set(sd->billboard, "Play Finished");
>  }
> 
>  static void
>  _on_video_del(Elm_Player_Smart_Data *sd)
>  {
> +   elm_object_disabled_set(sd->mute, EINA_TRUE);
> +   elm_object_disabled_set(sd->volume, EINA_TRUE);
>     elm_object_disabled_set(sd->slider, EINA_TRUE);
>     elm_object_disabled_set(sd->forward, EINA_TRUE);
>     elm_object_disabled_set(sd->info, EINA_TRUE);
> @@ -367,22 +556,23 @@ static char *
>  _double_to_time(double value)
>  {
>     char buf[256];
> -   int ph, pm, ps, pf;
> +   unsigned ph, pm, ps;
> +   signed pf;
> 
> -   ph = value / 3600;
> -   pm = value / 60 - (ph * 60);
> -   ps = value - (pm * 60);
> -   pf = value * 100 - (ps * 100) - (pm * 60 * 100) - (ph * 60 * 60 * 100);
> +   ps = value;
> +   ph = ps / 3600;
> +   ps = ps - (ph * 3600);
> +   pm = ps / 60;
> +   ps = ps - (pm * 60);
> +   pf = (value * 10) - (10 * ((ph * 3600) + (pm * 60) + ps));
> +   if (pf < 0 )
> +    pf = 0;
> +   else
> +    if (pf >= 10) /* over/under flows do occur */
> +        pf = 9;
> 
> -   if (ph)
> -     snprintf(buf, sizeof(buf), "%i:%02i:%02i.%02i",
> +   snprintf(buf, sizeof(buf), "%u:%02u:%02u.%i",
>                ph, pm, ps, pf);
> -   else if (pm)
> -     snprintf(buf, sizeof(buf), "%02i:%02i.%02i",
> -              pm, ps, pf);
> -   else
> -     snprintf(buf, sizeof(buf), "%02i.%02i",
> -              ps, pf);
> 
>     return (char *)eina_stringshare_add(buf);
>  }
> @@ -393,6 +583,28 @@ _str_free(char *data)
>     eina_stringshare_del(data);
>  }
> 
> +static void
> +_new_fileselector_inwin(Elm_Player_Smart_Data *pd, Eo *obj)
> +{
> + Evas_Object *parent;
> +
> +   parent = pd->video;
> +   while((parent) && (strcmp(elm_widget_type_get(parent), "elm_win")))
> +     parent = elm_object_parent_widget_get(parent);
> +   if (parent) {
> +    pd->inwin = EINA_TRUE;
> +     pd->filesel_win = elm_win_inwin_add(parent);
> +    evas_object_hide(pd->filesel_win);
> +    evas_object_lower(pd->filesel_win);
> +    _new_fileselector(obj);
> +    elm_win_inwin_content_set(pd->filesel_win, pd->filesel);
> +   }
> +   else {
> +    pd->inwin = EINA_FALSE;
> +    pd->filesel_win = NULL;
> +   }
> +}
> +
>  /* a video object is never parented by a player one, just tracked.
>   * treating this special case here and delegating other objects to own
>   * layout */
> @@ -427,6 +639,7 @@ _elm_player_smart_content_set(Eo *obj, v
> 
>     if (!content) goto end;
> 
> +   _new_fileselector_inwin(sd, obj);
>     elm_object_disabled_set(sd->slider, EINA_FALSE);
>     elm_object_disabled_set(sd->forward, EINA_FALSE);
>     elm_object_disabled_set(sd->info, EINA_FALSE);
> @@ -436,6 +649,7 @@ _elm_player_smart_content_set(Eo *obj, v
>     elm_object_disabled_set(sd->prev, EINA_FALSE);
>     elm_object_disabled_set(sd->rewind, EINA_FALSE);
>     elm_object_disabled_set(sd->next, EINA_FALSE);
> +   elm_object_disabled_set(sd->stop, EINA_FALSE);
> 
>     sd->emotion = elm_video_emotion_get(sd->video);
>     emotion_object_priority_set(sd->emotion, EINA_TRUE);
> @@ -455,7 +669,7 @@ _elm_player_smart_content_set(Eo *obj, v
>     else elm_layout_signal_emit(obj, "elm,player,pause", "elm");
> 
>     evas_object_smart_callback_add(sd->emotion, "frame_decode",
> -                                  _update_slider, obj);
> +                                  _frame_decoded_cb, obj);
>     evas_object_smart_callback_add(sd->emotion, "frame_resize",
>                                    _update_slider, obj);
>     evas_object_smart_callback_add(sd->emotion, "length_change",
> @@ -475,6 +689,13 @@ end:
>  static void
>  _elm_player_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
>  {
> +#define ATTENUATOR_SIZE      6
> + static const char *att_keys[ATTENUATOR_SIZE] =
> +    {"0dB", "-1.5dB", "-3dB", "-6dB", "-12dB", "-20dB"};
> + static const double att_vals[ATTENUATOR_SIZE] =
> +    {1.0, 0.840896, 0.707107, 0.5, 0.353553, 0.1};
> + int i;
> +
>     eo_do_super(obj, evas_obj_smart_add());
> 
>     Elm_Player_Smart_Data *priv = _pd;
> @@ -490,12 +711,18 @@ _elm_player_smart_add(Eo *obj, void *_pd
>     priv->rewind = _player_button_add(obj, "media_player/rewind", _rewind);
>     priv->stop = _player_button_add(obj, "media_player/stop", _stop);
> 
> +   priv->disabled = EINA_TRUE;
> +   priv->length = 0.0;
> +   priv->frames = 0;
> +   priv->pos = 0.0;
> +
>     priv->slider = elm_slider_add(obj);
>     elm_slider_indicator_format_function_set
>       (priv->slider, _double_to_time, _str_free);
>     elm_slider_units_format_function_set
>       (priv->slider, _double_to_time, _str_free);
> -   elm_slider_min_max_set(priv->slider, 0, 0);
> +   elm_slider_unit_format_set(priv->slider, "%s");
> +   elm_slider_min_max_set(priv->slider, 0, 1);
>     elm_slider_value_set(priv->slider, 0);
>     elm_object_disabled_set(priv->slider, EINA_TRUE);
>     evas_object_size_hint_align_set(priv->slider, EVAS_HINT_FILL, 0.5);
> @@ -506,6 +733,38 @@ _elm_player_smart_add(Eo *obj, void *_pd
>     evas_object_smart_callback_add
>       (priv->slider, "changed", _update_position, obj);
> 
> +   priv->volume = elm_diskselector_add(obj);
> +   elm_diskselector_round_enabled_set(priv->volume, EINA_FALSE);
> +   elm_diskselector_side_text_max_length_set(priv->volume, 5);
> +   elm_object_disabled_set(priv->volume, EINA_FALSE);
> +   evas_object_size_hint_align_set(priv->volume, EVAS_HINT_FILL, 0.5);
> +   evas_object_size_hint_weight_set
> +     (priv->volume, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> +   priv->volume_vals = eina_hash_string_small_new(NULL);
> +   for (i = 0; i < ATTENUATOR_SIZE; i++) {
> +     eina_hash_direct_add(priv->volume_vals, att_keys[i], &att_vals
> [i]);
> +     elm_diskselector_item_append(priv->volume, att_keys[i], NULL,
> _update_volume, obj);
> +   }
> +   elm_layout_content_set(obj, "media_player/volume", priv->volume);
> +
> +   priv->mute = elm_check_add(obj);
> +   elm_object_text_set(priv->mute, "Mute");
> +   elm_check_state_set(priv->mute, EINA_FALSE);
> +   elm_layout_content_set(obj, "media_player/mute", priv->mute);
> +   evas_object_smart_callback_add
> +     (priv->mute, "changed", _mute_audio, obj);
> +
> +   priv->billboard = elm_label_add(obj);
> +   elm_label_line_wrap_set(priv->billboard, ELM_WRAP_NONE);
> +   evas_object_size_hint_align_set(priv->billboard, EVAS_HINT_FILL,
> EVAS_HINT_FILL);
> +   evas_object_size_hint_weight_set(priv->billboard,
> EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
> +   elm_object_text_set(priv->billboard, "No Media");
> +   elm_layout_content_set(obj, "media_player/billboard", priv->billboard);
> +
> +   priv->path = eina_stringshare_add("/");
> +   priv->inwin = EINA_FALSE;
> +   priv->filesel_win = NULL;
> +
>     elm_layout_sizing_eval(obj);
>     elm_widget_can_focus_set(obj, EINA_TRUE);
>  }
> diff -uprN a/src/lib/elm_widget_player.h b/src/lib/elm_widget_player.h
> --- a/src/lib/elm_widget_player.h     2012-11-26 12:02:53.000000000 +0530
> +++ b/src/lib/elm_widget_player.h     2013-02-06 11:17:07.000000000 +0530
> @@ -33,6 +33,20 @@ struct _Elm_Player_Smart_Data
>     Evas_Object          *rewind;
>     Evas_Object          *stop;
>     Evas_Object          *slider;
> +   Evas_Object          *volume;
> +   Evas_Object          *mute;
> +   Evas_Object          *billboard;
> +   Evas_Object          *filesel;
> +   Evas_Object          *filesel_win;
> +
> +   Eina_Hash    *volume_vals; /* volume attenutator presets */
> +   Eina_Bool    disabled;     /* used for only-when-must changes */
> +   double       length;       /*         --- ditto ---           */
> +   short        frames;       /* used to reduce update frequency */
> +   double       pos;          /* inter-callback communication to
> break slider feedback loop */
> +   Eina_Bool    inwin;        /* inwin mode for filesel */
> +   const char   *path;        /* chosen file */
> +   char         msg[32];      /* buffer for billboard */
>  };
> 
>  /**
> 
> ------------------------------------------------------------------------------
> Free Next-Gen Firewall Hardware Offer
> Buy your Sophos next-gen firewall before the end March 2013 
> and get the hardware for free! Learn more.
> http://p.sf.net/sfu/sophos-d2d-feb
> _______________________________________________
> enlightenment-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/enlightenment-users
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]


------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
enlightenment-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-users

Reply via email to