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.