jeyzu pushed a commit to branch devs/jeyzu/mixer.

commit 4dbaae89bed398fba18245a0f48619a1082b14a0
Author: Jérémy Zurcher <[email protected]>
Date:   Fri Mar 1 09:37:22 2013 +0100

    mixer: cleanup card and channel selection code path
    
    _populate_channel_editor:
       use app->sys_card_name instead of
    e_mod_mixer_card_name_get _populate_channels:
       select default channel or first one
    _create_cards:
       do not reselect card and channel
    e_mixer_app_dialog_select:
       cleanup, remove unused _find_card_by_name and _find_channel_by_name
    _mixer_popup_cb_mixer:
       do not modifiy current selection on popup
---
 src/modules/mixer/app_mixer.c  | 133 ++++++++++++++---------------------------
 src/modules/mixer/e_mod_main.c |   3 +-
 2 files changed, 46 insertions(+), 90 deletions(-)

diff --git a/src/modules/mixer/app_mixer.c b/src/modules/mixer/app_mixer.c
index fdb06b4..dd4f8ce 100644
--- a/src/modules/mixer/app_mixer.c
+++ b/src/modules/mixer/app_mixer.c
@@ -5,7 +5,7 @@ extern const char _e_mixer_Name[];
 typedef struct E_Mixer_App_Dialog_Data
 {
    E_Mixer_System       *sys;
-   const char           *card;
+   const char           *sys_card_name;
    const char           *channel_name;
    int                   lock_sliders;
    Eina_List            *cards;
@@ -161,19 +161,14 @@ _populate_channel_editor(E_Mixer_App_Dialog_Data *app)
 {
    struct e_mixer_app_ui_channel_editor *ui = &app->ui.channel_editor;
    E_Mixer_Channel_State state;
-   const char *card_name;
 
-   card_name = e_mod_mixer_card_name_get(app->card);
-
-   if (!card_name)
+   if ((!app->sys_card_name) || (!app->channel_name))
      {
         _disable_channel_editor(app);
         return;
      }
 
-   e_widget_entry_text_set(ui->card, card_name);
-   eina_stringshare_del(card_name);
-
+   e_widget_entry_text_set(ui->card, app->sys_card_name);
    e_widget_entry_text_set(ui->channel, app->channel_name);
 
    if (e_mod_mixer_channel_is_boost(app->channel_info))
@@ -257,7 +252,7 @@ _populate_channels(E_Mixer_App_Dialog_Data *app)
    Eina_List *l;
    Evas_Object *ilist;
    int header_input;
-   int i;
+   int i, selected;
 
    ilist = app->ui.channels.list;
    edje_freeze();
@@ -266,18 +261,16 @@ _populate_channels(E_Mixer_App_Dialog_Data *app)
 
    if (app->sys)
      e_mod_mixer_del(app->sys);
-   app->sys = e_mod_mixer_new(app->card);
+   app->sys = e_mod_mixer_new(app->sys_card_name);
    if (_mixer_using_default)
      e_mixer_system_callback_set(app->sys, _cb_system_update, app);
 
-   eina_stringshare_del(app->channel_name);
-   app->channel_name = e_mod_mixer_channel_default_name_get(app->sys);
-
    if (app->channel_infos)
      e_mod_mixer_channel_infos_free(app->channel_infos);
    app->channel_infos = e_mod_mixer_channel_infos_get(app->sys);
 
    i = 0;
+   selected = 0;
    header_input = 0;
    for (l = app->channel_infos; l; l = l->next, i++)
      {
@@ -300,33 +293,29 @@ _populate_channels(E_Mixer_App_Dialog_Data *app)
         info->app = app;
         e_widget_ilist_append(ilist, NULL, info->name, _cb_channel_selected,
                               info, info->name);
-        if (app->channel_name && info->name &&
+        if ((selected == 0) && app->channel_name && info->name &&
             (strcmp(app->channel_name, info->name) == 0))
           {
              e_widget_ilist_selected_set(ilist, i);
              app->channel_info = info;
+             selected = 1;
           }
      }
 
+   if ((selected == 0) && (i > 0))
+     e_widget_ilist_selected_set(ilist, 0);
+   else
+     app->channel_name = NULL;
+
    e_widget_ilist_go(ilist);
    e_widget_ilist_thaw(ilist);
    edje_thaw();
 }
 
 static void
-select_card(E_Mixer_App_Dialog_Data *app)
-{
-   _populate_channels(app);
-   if (e_widget_ilist_count(app->ui.channels.list) > 0)
-     e_widget_ilist_selected_set(app->ui.channels.list, 1);
-   else
-     _disable_channel_editor(app);
-}
-
-static void
 _cb_card_selected(void *data)
 {
-   select_card(data);
+   _populate_channels(data);
 }
 
 static void
@@ -336,12 +325,11 @@ _create_cards(E_Dialog *dialog __UNUSED__, Evas *evas, 
E_Mixer_App_Dialog_Data *
    const char *card;
    Eina_List *l;
 
-   app->card = e_mod_mixer_card_default_get();
    app->cards = e_mod_mixer_card_names_get();
    if (eina_list_count(app->cards) < 2)
      return;
 
-   ui->list = e_widget_ilist_add(evas, 32, 32, &app->card);
+   ui->list = e_widget_ilist_add(evas, 32, 32, &app->sys_card_name);
    e_widget_size_min_set(ui->list, 180, 100);
    e_widget_ilist_go(ui->list);
    EINA_LIST_FOREACH(app->cards, l, card)
@@ -442,12 +430,6 @@ _create_ui(E_Dialog *dialog, E_Mixer_App_Dialog_Data *app)
    _create_channels(dialog, evas, app);
    _create_channel_editor(dialog, evas, app);
 
-   if (ui->cards.list)
-     e_widget_ilist_selected_set(ui->cards.list, 0);
-   else
-     select_card(app);
-   e_widget_ilist_selected_set(ui->channels.list, 1);
-
    e_widget_size_min_get(ui->hlayout, &mw, &mh);
    if (mw < 300)
      mw = 300;
@@ -462,8 +444,9 @@ _mixer_app_dialog_del(E_Dialog *dialog, 
E_Mixer_App_Dialog_Data *app)
    if (app->del.func)
      app->del.func(dialog, app->del.data);
 
-   eina_stringshare_del(app->card);
-   eina_stringshare_del(app->channel_name);
+   if ((!app->ui.cards.list) && (app->ui.channels.list))
+     eina_stringshare_del(app->sys_card_name);
+
    if (app->cards)
      e_mod_mixer_card_names_free(app->cards);
    if (app->channel_infos)
@@ -527,77 +510,49 @@ e_mixer_app_dialog_new(E_Container *con, void 
(*func)(E_Dialog *dialog, void *da
    return dialog;
 }
 
-static inline int
-_find_card_by_name(E_Mixer_App_Dialog_Data *app, const char *card_name)
+int
+e_mixer_app_dialog_select(E_Dialog *dialog, const char *sys_card_name, const 
char *channel_name)
 {
+   int n, i;
    Eina_List *l;
-   int i;
+   E_Mixer_App_Dialog_Data *app;
 
-   if (!card_name)
+   if (!dialog)
      return 0;
 
-   for (i = 0, l = app->cards; l; i++, l = l->next)
-     if (strcmp(card_name, l->data) == 0)
-       return i;
-
-   return -1;
-}
-
-static inline int
-_find_channel_by_name(E_Mixer_App_Dialog_Data *app, const char *channel_name)
-{
-   E_Mixer_Channel_Info *info;
-   Eina_List *l;
-   int i = 0;
-   int header_input;
+   if ((!sys_card_name) || (!channel_name))
+     return 0;
 
-   if (!channel_name)
+   app = dialog->data;
+   if (!app)
      return 0;
 
-   header_input = 0;
-   EINA_LIST_FOREACH(app->channel_infos, l, info)
+   n = -1;
+   for (i = 0, l = app->cards; l; i++, l = l->next)
      {
-        if (header_input != e_mod_mixer_channel_group_get(info))
+        if (strcmp(sys_card_name, l->data) == 0)
           {
-             header_input = e_mod_mixer_channel_group_get(info);
-             i++;
+             n = i;
+             break;
           }
-
-        if (strcmp(channel_name, info->name) == 0)
-          return i;
-
-        ++i;
      }
 
-   return -1;
-}
-
-int
-e_mixer_app_dialog_select(E_Dialog *dialog, const char *card_name, const char 
*channel_name)
-{
-   E_Mixer_App_Dialog_Data *app;
-   int n;
-
-   if (!dialog)
-     return 0;
-
-   if ((!card_name) || (!channel_name))
-     return 0;
+   if (n < 0)
+     {
+        /* FIXME device disappeared, very bad !! */
+        return 0;
+     }
 
-   app = dialog->data;
-   if (!app)
-     return 0;
+   /* app->channel_name will be overriden by selection in _populate_channels */
+   app->channel_name = channel_name;
 
-   n = _find_card_by_name(app, card_name);
-   if (n < 0)
-     return 0;
    if (app->ui.cards.list)
      e_widget_ilist_selected_set(app->ui.cards.list, n);
-
-   n = _find_channel_by_name(app, channel_name);
-   if (n < 0)
-     return 0;
-   e_widget_ilist_selected_set(app->ui.channels.list, n);
+   else if (app->ui.channels.list)
+     {
+        app->sys_card_name = eina_stringshare_add(sys_card_name);
+        _populate_channels(app);
+     }
 
    return 1;
 }
diff --git a/src/modules/mixer/e_mod_main.c b/src/modules/mixer/e_mod_main.c
index 7640740..27ea786 100644
--- a/src/modules/mixer/e_mod_main.c
+++ b/src/modules/mixer/e_mod_main.c
@@ -563,7 +563,8 @@ _mixer_popup_cb_mixer(void *data, void *data2 __UNUSED__)
    ctxt = mixer_mod->data;
    if (ctxt->mixer_dialog)
      {
-        _mixer_app_select_current(ctxt->mixer_dialog, inst);
+        /* maybe not update mixer dialog current selection */
+        /* _mixer_app_select_current(ctxt->mixer_dialog, inst); */
         e_dialog_show(ctxt->mixer_dialog);
         return;
      }

-- 

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb

Reply via email to