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 1658af79d11fee01a51ddaede130622ee3b7f560
Author: politebot <[email protected]>
AuthorDate: Sat Oct 11 16:47:48 2025 -0500

    UI improvements
---
 src/appdata.h      |  1 +
 src/http.c         | 26 ++++--------------
 src/http.h         |  2 +-
 src/station_list.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 src/station_list.h |  3 ++-
 src/ui.c           | 27 +++++++++----------
 6 files changed, 95 insertions(+), 42 deletions(-)

diff --git a/src/appdata.h b/src/appdata.h
index a85feb2..bced639 100644
--- a/src/appdata.h
+++ b/src/appdata.h
@@ -51,4 +51,5 @@ typedef struct _AppData
    Eina_List *favorites_stations;
    ViewMode view_mode;
    int search_offset;
+   int displayed_stations_count;
 } AppData;
diff --git a/src/http.c b/src/http.c
index 4d0f0b5..5b7d676 100644
--- a/src/http.c
+++ b/src/http.c
@@ -88,7 +88,7 @@ http_shutdown(void)
 }
 
 void
-http_search_stations(AppData *ad, const char *search_term, const char *search_type, const char *order, Eina_Bool reverse, int offset, int limit, Eina_Bool new_search)
+http_search_stations(AppData *ad, const char *search_term, const char *search_type, const char *order, Eina_Bool reverse, Eina_Bool new_search)
 {
    Ecore_Con_Url *url;
    Station_Download_Context *d_ctx;
@@ -98,8 +98,6 @@ http_search_stations(AppData *ad, const char *search_term, const char *search_ty
    d_ctx = calloc(1, sizeof(Station_Download_Context));
    d_ctx->base.type = DOWNLOAD_TYPE_STATIONS;
    d_ctx->base.ad = ad;
-   d_ctx->offset = offset;
-   d_ctx->limit = limit;
    d_ctx->new_search = new_search;
    _populate_station_request(d_ctx, ad, search_type, search_term, order, reverse);
    _issue_station_request(&url, d_ctx);
@@ -149,7 +147,7 @@ _search_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_inf
    const char *order = elm_object_text_get(ad->sort_hoversel);
    Eina_Bool reverse = elm_check_state_get(ad->reverse_check);
    ad->search_offset = 0; // Reset offset for a new search
-   http_search_stations(ad, search_term, search_type, order, reverse, ad->search_offset, 100, EINA_TRUE);
+   http_search_stations(ad, search_term, search_type, order, reverse, EINA_TRUE);
 }
 
 void
@@ -338,21 +336,7 @@ _handle_station_list_complete(Ecore_Con_Event_Url_Complete *ev)
 
     favorites_apply_to_stations(ad);
     if (ad->view_mode == VIEW_SEARCH)
-      station_list_populate(ad, ad->stations, d_ctx->new_search);
-
-    // Determine if "Load More" button should be visible
-    if (d_ctx->new_search)
-    {
-        if (xpathObj->nodesetval->nodeNr > 0)
-            ui_set_load_more_button_visibility(ad, EINA_TRUE);
-        else
-            ui_set_load_more_button_visibility(ad, EINA_FALSE);
-    }
-    else
-    {
-        if (xpathObj->nodesetval->nodeNr == 0)
-            ui_set_load_more_button_visibility(ad, EINA_FALSE);
-    }
+      station_list_populate(ad, d_ctx->new_search);
 
     eina_list_free(d_ctx->servers);
     free(d_ctx);
@@ -532,8 +516,8 @@ static void _issue_station_request(Ecore_Con_Url **url_out, Station_Download_Con
 
    // Add sorting and pagination params
    char other_params[512];
-   snprintf(other_params, sizeof(other_params), "&offset=%d&limit=%d&order=%s&reverse=%s",
-            d_ctx->offset, d_ctx->limit, d_ctx->order, d_ctx->reverse ? "true" : "false");
+   snprintf(other_params, sizeof(other_params), "&limit=%d&order=%s&reverse=%s",
+            100000, d_ctx->order, d_ctx->reverse ? "true" : "false");
 
    strncat(query_params, other_params, sizeof(query_params) - strlen(query_params) - 1);
 
diff --git a/src/http.h b/src/http.h
index 37f2072..8eb438d 100644
--- a/src/http.h
+++ b/src/http.h
@@ -4,7 +4,7 @@
 
 void http_init(AppData *ad);
 void http_shutdown(void);
-void http_search_stations(AppData *ad, const char *search_term, const char *search_type, const char *order, Eina_Bool reverse, int offset, int limit, Eina_Bool new_search);
+void http_search_stations(AppData *ad, const char *search_term, const char *search_type, const char *order, Eina_Bool reverse, Eina_Bool new_search);
 void http_download_icon(AppData *ad, Elm_Object_Item *list_item, const char *url);
 void _search_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
 void _search_entry_activated_cb(void *data, Evas_Object *obj, void *event_info);
diff --git a/src/station_list.c b/src/station_list.c
index f93c715..b19949d 100644
--- a/src/station_list.c
+++ b/src/station_list.c
@@ -3,6 +3,7 @@
 #include "radio_player.h"
 #include "http.h"
 #include "favorites.h"
+#include "ui.h"
 
 static void _favorite_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
 static void _favorite_remove_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
@@ -40,16 +41,24 @@ station_list_clear(AppData *ad)
 }
 
 void
-station_list_populate(AppData *ad, Eina_List *stations, Eina_Bool new_search)
+station_list_populate(AppData *ad, Eina_Bool new_search)
 {
     Eina_List *l;
     Station *st;
+    int i = 0;
 
     if (new_search)
-      station_list_clear(ad);
-
-    EINA_LIST_FOREACH(stations, l, st)
     {
+      station_list_clear(ad);
+      ad->displayed_stations_count = 0;
+    }
+
+    Eina_List *stations_to_display = eina_list_nth_list(ad->stations, ad->displayed_stations_count);
+
+    EINA_LIST_FOREACH(stations_to_display, l, st)
+    {
+        if (i >= 100) break;
+
         Evas_Object *icon = elm_icon_add(ad->win);
         elm_icon_standard_set(icon, "radio");
         Evas_Object *fav_btn = NULL;
@@ -105,7 +114,16 @@ station_list_populate(AppData *ad, Eina_List *stations, Eina_Bool new_search)
                   http_download_icon(ad, li, st->favicon);
                }
           }
+        i++;
     }
+    ad->displayed_stations_count += i;
+
+    if (ad->displayed_stations_count < eina_list_count(ad->stations))
+        ui_set_load_more_button_visibility(ad, EINA_TRUE);
+    else
+        ui_set_load_more_button_visibility(ad, EINA_FALSE);
+
+
     evas_object_smart_callback_add(ad->list, "selected", _list_item_selected_cb, ad);
     elm_list_go(ad->list);
 }
@@ -159,7 +177,57 @@ _favorite_remove_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *
 
     // Rebuild favorites list to reflect removal
     favorites_rebuild_station_list(ctx->ad);
-    station_list_populate(ctx->ad, ctx->ad->favorites_stations, EINA_TRUE);
+    station_list_populate_favorites(ctx->ad);
 
     free(ctx);
 }
+
+void
+station_list_populate_favorites(AppData *ad)
+{
+    Eina_List *l;
+    Station *st;
+
+    station_list_clear(ad);
+
+    EINA_LIST_FOREACH(ad->favorites_stations, l, st)
+    {
+        Evas_Object *icon = elm_icon_add(ad->win);
+        elm_icon_standard_set(icon, "radio");
+        Evas_Object *fav_btn = elm_button_add(ad->win);
+        evas_object_size_hint_min_set(fav_btn, 60, 30);
+        evas_object_propagate_events_set(fav_btn, EINA_FALSE);
+        elm_object_text_set(fav_btn, "Remove");
+
+        Elm_Object_Item *li = elm_list_item_append(ad->list, st->name, icon,
+        fav_btn, NULL, NULL);
+        elm_object_item_data_set(li, st);
+
+        typedef struct {
+            AppData *ad;
+            Elm_Object_Item *li;
+        } FavCtx;
+        FavCtx *ctx = calloc(1, sizeof(FavCtx));
+        ctx->ad = ad;
+        ctx->li = li;
+        evas_object_smart_callback_add(fav_btn, "clicked", _favorite_remove_btn_clicked_cb, ctx);
+
+        if (st->favicon && st->favicon[0] && st->stationuuid)
+        {
+            char cache_path[PATH_MAX];
+            const char *home = getenv("HOME");
+            snprintf(cache_path, sizeof(cache_path), "%s/.cache/eradio/favicons/%s", home, st->stationuuid);
+
+            if (ecore_file_exists(cache_path))
+            {
+                elm_image_file_set(icon, cache_path, NULL);
+            }
+            else
+            {
+                http_download_icon(ad, li, st->favicon);
+            }
+        }
+    }
+    evas_object_smart_callback_add(ad->list, "selected", _list_item_selected_cb, ad);
+    elm_list_go(ad->list);
+}
diff --git a/src/station_list.h b/src/station_list.h
index 00ae1a9..fae4dce 100644
--- a/src/station_list.h
+++ b/src/station_list.h
@@ -2,6 +2,7 @@
 
 #include "appdata.h"
 
-void station_list_populate(AppData *ad, Eina_List *stations, Eina_Bool new_search);
+void station_list_populate(AppData *ad, Eina_Bool new_search);
+void station_list_populate_favorites(AppData *ad);
 void station_list_clear(AppData *ad);
 void _list_item_selected_cb(void *data, Evas_Object *obj, void *event_info);
diff --git a/src/ui.c b/src/ui.c
index ca3a37b..0718a40 100644
--- a/src/ui.c
+++ b/src/ui.c
@@ -200,6 +200,11 @@ ui_create(AppData *ad)
    elm_box_pack_end(box, ad->list);
    evas_object_show(ad->list);
 
+   ad->load_more_btn = elm_button_add(ad->win);
+   elm_object_text_set(ad->load_more_btn, "Load More");
+   elm_box_pack_end(box, ad->load_more_btn);
+   evas_object_hide(ad->load_more_btn); // Hide by default
+
    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);
@@ -220,11 +225,6 @@ ui_create(AppData *ad)
    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(box, ad->load_more_btn);
-   evas_object_hide(ad->load_more_btn); // Hide by default
-
    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);
@@ -235,7 +235,7 @@ ui_create(AppData *ad)
    ad->search_offset = 0; // Initialize offset
    evas_object_show(ad->search_bar);
    if (ad->stations)
-     station_list_populate(ad, ad->stations, EINA_TRUE);
+     station_list_populate(ad, EINA_TRUE);
    else
      station_list_clear(ad);
 
@@ -320,6 +320,8 @@ static void
 _tb_favorites_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    AppData *ad = data;
+   if (ad->view_mode == VIEW_FAVORITES) return;
+
    ad->view_mode = VIEW_FAVORITES;
    // Remove search bar from layout entirely in Favorites view
    if (ad->main_box && ad->search_bar)
@@ -328,13 +330,15 @@ _tb_favorites_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_i
    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);
+   station_list_populate_favorites(ad);
 }
 
 static void
 _tb_search_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    AppData *ad = data;
+   if (ad->view_mode == VIEW_SEARCH) return;
+
    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)
@@ -343,7 +347,7 @@ _tb_search_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info
    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);
+     station_list_populate(ad, EINA_TRUE);
    else
      station_list_clear(ad);
 }
@@ -352,12 +356,7 @@ static void
 _load_more_btn_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    AppData *ad = data;
-   const char *search_term = elm_object_text_get(ad->search_entry);
-   const char *search_type = elm_object_text_get(ad->search_hoversel);
-   const char *order = elm_object_text_get(ad->sort_hoversel);
-   Eina_Bool reverse = elm_check_state_get(ad->reverse_check);
-   ad->search_offset += 100; // Increment offset for next page
-   http_search_stations(ad, search_term, search_type, order, reverse, ad->search_offset, 100, EINA_FALSE);
+   station_list_populate(ad, EINA_FALSE);
 }
 
 void ui_set_load_more_button_visibility(AppData *ad, Eina_Bool visible)

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

Reply via email to