This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch main
in repository eradio.

View the commit online.

commit 461cdd1e3a3568ad95ab8584902b6a3ed26841f2
Author: politebot <[email protected]>
AuthorDate: Sat Oct 11 16:28:51 2025 -0500

    UI improvements
---
 src/appdata.h      |  8 +++--
 src/radio_player.c | 21 ++++++------
 src/ui.c           | 94 ++++++++++++++++++++++++------------------------------
 3 files changed, 59 insertions(+), 64 deletions(-)

diff --git a/src/appdata.h b/src/appdata.h
index 9e78507..a85feb2 100644
--- a/src/appdata.h
+++ b/src/appdata.h
@@ -21,13 +21,17 @@ typedef enum {
 typedef struct _AppData
 {
    Evas_Object *win;
+   Evas_Object *top_toolbar;
+   Evas_Object *main_box;
    Evas_Object *list;
    Evas_Object *emotion;
    Evas_Object *search_entry;
    Evas_Object *search_hoversel;
    Evas_Object *server_hoversel;
-   Evas_Object *play_pause_btn;
-   Evas_Object *stop_btn;
+   Evas_Object *controls_toolbar;
+   Elm_Object_Item *play_pause_item;
+   Elm_Object_Item *stop_item;
+   Evas_Object *separator;
    Evas_Object *statusbar;
    Evas_Object *search_btn;
    Evas_Object *load_more_btn;
diff --git a/src/radio_player.c b/src/radio_player.c
index 73bd2e1..97f226d 100644
--- a/src/radio_player.c
+++ b/src/radio_player.c
@@ -34,8 +34,8 @@ radio_player_play(AppData *ad, const char *url)
         emotion_object_file_set(ad->emotion, url);
         emotion_object_play_set(ad->emotion, EINA_TRUE);
         ad->playing = EINA_TRUE;
-        Evas_Object *ic = elm_object_part_content_get(ad->play_pause_btn, "icon");
-        elm_icon_standard_set(ic, "media-playback-pause");
+        if (ad->play_pause_item)
+          elm_toolbar_item_icon_set(ad->play_pause_item, "media-playback-pause");
      }
 }
 
@@ -45,8 +45,8 @@ radio_player_stop(AppData *ad)
    emotion_object_play_set(ad->emotion, EINA_FALSE);
    emotion_object_position_set(ad->emotion, 0.0);
    ad->playing = EINA_FALSE;
-   Evas_Object *ic = elm_object_part_content_get(ad->play_pause_btn, "icon");
-   elm_icon_standard_set(ic, "media-playback-start");
+   if (ad->play_pause_item)
+     elm_toolbar_item_icon_set(ad->play_pause_item, "media-playback-start");
 }
 
 void
@@ -54,12 +54,13 @@ radio_player_toggle_pause(AppData *ad)
 {
    ad->playing = !ad->playing;
    emotion_object_play_set(ad->emotion, ad->playing);
-
-   Evas_Object *ic = elm_object_part_content_get(ad->play_pause_btn, "icon");
-   if (ad->playing)
-     elm_icon_standard_set(ic, "media-playback-pause");
-   else
-     elm_icon_standard_set(ic, "media-playback-start");
+   if (ad->play_pause_item)
+     {
+        if (ad->playing)
+          elm_toolbar_item_icon_set(ad->play_pause_item, "media-playback-pause");
+        else
+          elm_toolbar_item_icon_set(ad->play_pause_item, "media-playback-start");
+     }
 }
 
 void
diff --git a/src/ui.c b/src/ui.c
index 1d90a15..ca3a37b 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -66,6 +66,7 @@ ui_create(AppData *ad)
    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(ad->win, box);
    evas_object_show(box);
+   ad->main_box = box;
 
    /* Toolbar at the top */
    Evas_Object *toolbar = elm_toolbar_add(ad->win);
@@ -76,6 +77,7 @@ ui_create(AppData *ad)
    evas_object_size_hint_align_set(toolbar, EVAS_HINT_FILL, 0);
    elm_box_pack_end(box, toolbar);
    evas_object_show(toolbar);
+   ad->top_toolbar = toolbar;
 
    /* Toolbar items */
    elm_toolbar_item_append(toolbar, "system-search", "Search", _tb_search_clicked_cb, ad);
@@ -88,16 +90,30 @@ ui_create(AppData *ad)
    elm_box_pack_end(box, ad->search_bar);
    evas_object_show(ad->search_bar);
 
+   // Row for search entry and button side-by-side
+   Evas_Object *search_row = elm_box_add(ad->win);
+   elm_box_horizontal_set(search_row, EINA_TRUE);
+   evas_object_size_hint_weight_set(search_row, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(search_row, EVAS_HINT_FILL, 0);
+   elm_box_pack_end(ad->search_bar, search_row);
+   evas_object_show(search_row);
+
    ad->search_entry = elm_entry_add(ad->win);
    elm_entry_single_line_set(ad->search_entry, EINA_TRUE);
    elm_entry_scrollable_set(ad->search_entry, EINA_TRUE);
-   evas_object_size_hint_weight_set(ad->search_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_size_hint_align_set(ad->search_entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(ad->search_entry, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(ad->search_entry, EVAS_HINT_FILL, 0.5);
    elm_object_part_text_set(ad->search_entry, "guide", "Search for stations...");
-   elm_box_pack_end(ad->search_bar, ad->search_entry);
+   elm_box_pack_end(search_row, ad->search_entry);
    evas_object_show(ad->search_entry);
    elm_object_focus_set(ad->search_entry, EINA_TRUE);
 
+   // Place Search button to the right of the entry
+   ad->search_btn = elm_button_add(ad->win);
+   elm_object_text_set(ad->search_btn, "Search");
+   elm_box_pack_end(search_row, ad->search_btn);
+   evas_object_show(ad->search_btn);
+
    // Filters toggle button
    ad->filters_toggle_btn = elm_button_add(ad->win);
    elm_object_text_set(ad->filters_toggle_btn, "Filters ▾");
@@ -110,7 +126,6 @@ ui_create(AppData *ad)
    elm_box_padding_set(ad->filters_box, 10, 10);
    evas_object_size_hint_weight_set(ad->filters_box, EVAS_HINT_EXPAND, 0);
    evas_object_size_hint_align_set(ad->filters_box, EVAS_HINT_FILL, 0);
-   elm_box_pack_end(ad->search_bar, ad->filters_box);
    evas_object_hide(ad->filters_box);
    ad->filters_visible = EINA_FALSE;
 
@@ -178,26 +193,6 @@ ui_create(AppData *ad)
    elm_box_pack_end(ad->filters_box, ad->server_hoversel);
    evas_object_show(ad->server_hoversel);
 
-   ad->search_btn = elm_button_add(ad->win);
-   elm_object_text_set(ad->search_btn, "Search");
-   elm_box_pack_end(ad->search_bar, ad->search_btn);
-   evas_object_show(ad->search_btn);
-
-   // Loading indicator (spinner)
-   ad->progressbar = elm_progressbar_add(ad->win);
-   elm_object_style_set(ad->progressbar, "wheel");
-   elm_progressbar_pulse_set(ad->progressbar, EINA_TRUE);
-   evas_object_size_hint_weight_set(ad->progressbar, 0.0, 0.0);
-   evas_object_size_hint_align_set(ad->progressbar, 0.5, 0.5);
-   elm_box_pack_end(ad->search_bar, ad->progressbar);
-   evas_object_hide(ad->progressbar);
-   ad->loading_requests = 0;
-
-   /* Separator */
-   Evas_Object *sep = elm_separator_add(ad->win);
-   elm_separator_horizontal_set(sep, EINA_TRUE);
-   elm_box_pack_end(box, sep);
-   evas_object_show(sep);
 
    ad->list = elm_list_add(ad->win);
    evas_object_size_hint_weight_set(ad->list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -205,14 +200,14 @@ ui_create(AppData *ad)
    elm_box_pack_end(box, ad->list);
    evas_object_show(ad->list);
 
-   Evas_Object *controls_hbox = elm_box_add(ad->win);
-   elm_box_horizontal_set(controls_hbox, EINA_TRUE);
-   elm_box_padding_set(controls_hbox, 10, 0);
-   elm_box_homogeneous_set(controls_hbox, EINA_TRUE);
-   evas_object_size_hint_weight_set(controls_hbox, EVAS_HINT_EXPAND, 0);
-   evas_object_size_hint_align_set(controls_hbox, EVAS_HINT_FILL, 0.5);
-   elm_box_pack_end(box, controls_hbox);
-   evas_object_show(controls_hbox);
+   ad->controls_toolbar = elm_toolbar_add(ad->win);
+   elm_toolbar_shrink_mode_set(ad->controls_toolbar, ELM_TOOLBAR_SHRINK_MENU);
+   elm_toolbar_homogeneous_set(ad->controls_toolbar, EINA_TRUE);
+   elm_object_style_set(ad->controls_toolbar, "transparent");
+   evas_object_size_hint_weight_set(ad->controls_toolbar, EVAS_HINT_EXPAND, 0);
+   evas_object_size_hint_align_set(ad->controls_toolbar, EVAS_HINT_FILL, 0.5);
+   elm_box_pack_end(box, ad->controls_toolbar);
+   evas_object_show(ad->controls_toolbar);
 
    ad->statusbar = elm_label_add(ad->win);
    elm_object_text_set(ad->statusbar, "");
@@ -222,31 +217,14 @@ ui_create(AppData *ad)
    elm_box_pack_end(box, ad->statusbar);
    evas_object_show(ad->statusbar);
 
-   Evas_Object *ic;
-
-   ad->play_pause_btn = elm_button_add(ad->win);
-   ic = elm_icon_add(ad->play_pause_btn);
-   elm_icon_standard_set(ic, "media-playback-start");
-   evas_object_size_hint_min_set(ic, 48, 48);
-   elm_object_part_content_set(ad->play_pause_btn, "icon", ic);
-   elm_box_pack_end(controls_hbox, ad->play_pause_btn);
-   evas_object_show(ad->play_pause_btn);
-
-   ad->stop_btn = elm_button_add(ad->win);
-   ic = elm_icon_add(ad->stop_btn);
-   elm_icon_standard_set(ic, "media-playback-stop");
-   evas_object_size_hint_min_set(ic, 48, 48);
-   elm_object_part_content_set(ad->stop_btn, "icon", ic);
-   elm_box_pack_end(controls_hbox, ad->stop_btn);
-   evas_object_show(ad->stop_btn);
+   ad->play_pause_item = elm_toolbar_item_append(ad->controls_toolbar, "media-playback-start", "Play/Pause", _play_pause_btn_clicked_cb, ad);
+   ad->stop_item = elm_toolbar_item_append(ad->controls_toolbar, "media-playback-stop", "Stop", _stop_btn_clicked_cb, ad);
 
    ad->load_more_btn = elm_button_add(ad->win);
    elm_object_text_set(ad->load_more_btn, "Load More");
-   elm_box_pack_end(controls_hbox, ad->load_more_btn);
+   elm_box_pack_end(box, ad->load_more_btn);
    evas_object_hide(ad->load_more_btn); // Hide by default
 
-   evas_object_smart_callback_add(ad->play_pause_btn, "clicked", _play_pause_btn_clicked_cb, ad);
-   evas_object_smart_callback_add(ad->stop_btn, "clicked", _stop_btn_clicked_cb, ad);
    evas_object_smart_callback_add(ad->search_btn, "clicked", _search_btn_clicked_cb, ad);
    evas_object_smart_callback_add(ad->search_entry, "activated", _search_entry_activated_cb, ad);
    evas_object_smart_callback_add(ad->list, "selected", _list_item_selected_cb, ad);
@@ -274,11 +252,15 @@ _filters_toggle_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *e
    if (ad->filters_visible)
    {
       elm_object_text_set(ad->filters_toggle_btn, "Filters ▴");
+      if (ad->search_bar && ad->filters_box && ad->filters_toggle_btn)
+        elm_box_pack_after(ad->search_bar, ad->filters_box, ad->filters_toggle_btn);
       evas_object_show(ad->filters_box);
    }
    else
    {
       elm_object_text_set(ad->filters_toggle_btn, "Filters ▾");
+      if (ad->search_bar && ad->filters_box)
+        elm_box_unpack(ad->search_bar, ad->filters_box);
       evas_object_hide(ad->filters_box);
    }
 }
@@ -339,7 +321,11 @@ _tb_favorites_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_i
 {
    AppData *ad = data;
    ad->view_mode = VIEW_FAVORITES;
+   // Remove search bar from layout entirely in Favorites view
+   if (ad->main_box && ad->search_bar)
+     elm_box_unpack(ad->main_box, ad->search_bar);
    evas_object_hide(ad->search_bar);
+   if (ad->separator) evas_object_hide(ad->separator);
    ui_set_load_more_button_visibility(ad, EINA_FALSE);
    favorites_rebuild_station_list(ad);
    station_list_populate(ad, ad->favorites_stations, EINA_TRUE);
@@ -350,7 +336,11 @@ _tb_search_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info
 {
    AppData *ad = data;
    ad->view_mode = VIEW_SEARCH;
+   // Reinsert search bar right after the top toolbar to restore layout
+   if (ad->main_box && ad->search_bar && ad->top_toolbar)
+     elm_box_pack_after(ad->main_box, ad->search_bar, ad->top_toolbar);
    evas_object_show(ad->search_bar);
+   if (ad->separator) evas_object_show(ad->separator);
    ui_set_load_more_button_visibility(ad, EINA_FALSE);
    if (ad->stations)
      station_list_populate(ad, ad->stations, EINA_TRUE);

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to