diff -r cb885ee44618 -r e180d01c6808 maemo-ui-old/src/mmyth_epg_grid_view.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/maemo-ui-old/src/mmyth_epg_grid_view.c Fri Sep 14 21:18:38 2007 +0100 @@ -0,0 +1,243 @@ +#include +#include +#include +#include +#include + +#include "mmyth_epg_grid_view.h" +#include "mmyth_epg_grid_widget.h" + +/* + * Service genre + */ +#define GENRE_MIN 0 +#define GENRE_MAX 10 +#define GENRE_UNDEFINED 0 +#define GENRE_MOVIE 1 +#define GENRE_NEWS 2 +#define GENRE_SHOW 3 +#define GENRE_SPORTS 4 +#define GENRE_CHILDREN 5 +#define GENRE_MUSIC 6 +#define GENRE_CULTURE 7 +#define GENRE_SOCIAL 8 +#define GENRE_EDUCATION 9 +#define GENRE_LEISURE 10 + +#define NRO_HOURS 3 + +/* + * Function prototypes + */ +static void update_service_details(MMythEpgGridWidget * object, + gpointer arg1, gpointer user_data); +static gboolean key_press_epg_grid_view(GtkWidget * widget, + GdkEventKey * event, + gpointer user_data); + +static GtkWidget *mmyth_epg_grid_widget = NULL; + +/* + * is a GtkEventBox + */ +static GtkWidget *program_details_area = NULL; +static GtkWidget *details_main_hbox = NULL; +static GtkWidget *details_vbox = NULL; +static GtkWidget *details_logo_vbox = NULL; + +/* + * update signal callback from MMythEpgGridWidget + */ +static void +update_service_details(MMythEpgGridWidget * object, gpointer arg1, + gpointer user_data) +{ + g_return_if_fail(arg1 != NULL); + + EpgGridItem *epg_grid_item = (EpgGridItem *) arg1; + + gchar sel_prog_desc[100] = ""; + gchar time_buffer[50]; + + /* + * FIXME: get first content from content_list + */ + GMythProgramInfo *proginfo = + (GMythProgramInfo *) epg_grid_item->proginfo; + + if (proginfo) { + GString *prog_name = proginfo->title; + GString *service_name = proginfo->chanid; + + if (details_vbox != NULL) + gtk_container_remove(GTK_CONTAINER(details_main_hbox), + details_vbox); + + /* + * update service description + */ + strcat(sel_prog_desc, service_name->str); + strcat(sel_prog_desc, ""); + + GtkWidget *fst_line_lbl = gtk_label_new(NULL); + gtk_misc_set_alignment(GTK_MISC(fst_line_lbl), 0.0, 0.0); + gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc); + + /* + * freeing char[] + */ + sel_prog_desc[0] = 0; + strcat(sel_prog_desc, "\t"); + strcat(sel_prog_desc, prog_name->str); + + struct tm loctime_start, + loctime_end; + + // Convert it to local time representation. + /* + * FIXME: conversion from time to localtime is different in + * different machines + */ + long int schedule_start_time = proginfo->startts->tv_sec; + long int schedule_end_time = proginfo->endts->tv_sec; + + if (localtime_r(&schedule_start_time, &loctime_start) == NULL) { + g_warning("localtime_r error in mmyth_epg_grid_view!\n"); + } +#if 0 + fprintf(stderr, asctime(loctime_start)); +#endif + + strftime(time_buffer, 100, " %H:%M - ", &loctime_start); + strcat(sel_prog_desc, time_buffer); + + if (localtime_r(&schedule_end_time, &loctime_end) == NULL) { + g_warning("localtime_r error in mmyth_epg_grid_view!\n"); + } +#if 0 + fprintf(stderr, asctime(loctime_end)); +#endif + + strftime(time_buffer, 100, "%H:%M\n", &loctime_end); + strcat(sel_prog_desc, time_buffer); + + GtkWidget *snd_line_lbl = gtk_label_new(NULL); + gtk_misc_set_alignment(GTK_MISC(snd_line_lbl), 0.0, 0.0); + gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc); + + // add the current selected program description to the label + details_vbox = gtk_vbox_new(FALSE, 0); + GtkWidget *fst_line_hbox = gtk_hbox_new(FALSE, 0); + + gtk_box_pack_start(GTK_BOX(fst_line_hbox), + fst_line_lbl, FALSE, FALSE, 6); + gtk_box_pack_start(GTK_BOX(details_vbox), + fst_line_hbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(details_vbox), + snd_line_lbl, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(details_main_hbox), + details_vbox, FALSE, FALSE, 0); + + gtk_widget_show_all(details_main_hbox); + } +} + +/* + * Callback for hardware keys + */ +static gboolean +key_press_epg_grid_view(GtkWidget * widget, + GdkEventKey * event, gpointer user_data) +{ + MMythEpgGridWidget *mmyth_epg_grid_widget = + (MMythEpgGridWidget *) user_data; + + return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget, + event); +} + +GtkWidget * +epg_grid_view_new(MMythUi * mmyth_ui) +{ + GtkWidget *scrolled_window; + scrolled_window = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + + gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL, + &main_bg_color); + + GtkWidget *main_vbox = gtk_vbox_new(FALSE, 0); + // gtk_container_set_border_width(main_vbox, 4); + + GtkWidget *details_event_box = gtk_event_box_new(); + gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL, + &main_bg_color); + + program_details_area = gtk_vbox_new(FALSE, 0); + gtk_container_add(GTK_CONTAINER(details_event_box), + program_details_area); + gtk_container_set_border_width(GTK_CONTAINER(program_details_area), 4); + + details_main_hbox = gtk_hbox_new(FALSE, 10); + + gtk_box_pack_start(GTK_BOX(program_details_area), + details_main_hbox, FALSE, FALSE, 0); + + details_logo_vbox = gtk_vbox_new(FALSE, 0); + + GtkWidget *details_desc_vbox = gtk_vbox_new(FALSE, 0); + + gtk_box_pack_start(GTK_BOX(details_main_hbox), + details_desc_vbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(details_main_hbox), + details_logo_vbox, FALSE, FALSE, 0); + + gtk_widget_set_size_request(program_details_area, -1, 120); + + mmyth_epg_grid_widget = mmyth_epg_grid_widget_new(); + g_signal_connect(mmyth_epg_grid_widget, "selection_updated", + G_CALLBACK(update_service_details), NULL); + + /* + * select by default the first service + */ + /* + * depends on mount services + */ + if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) { + GList *fst_service = (GList *) + MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model-> + data; + mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET + (mmyth_epg_grid_widget), + fst_service); + } + + gtk_box_pack_start(GTK_BOX(main_vbox), + details_event_box, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(main_vbox), + gtk_hseparator_new(), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(main_vbox), + mmyth_epg_grid_widget, FALSE, FALSE, 0); + + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW + (scrolled_window), main_vbox); + + /* + * Add hardware button listener to application + */ + g_signal_connect(mmyth_ui->main_window, "key_press_event", + G_CALLBACK(key_press_epg_grid_view), + mmyth_epg_grid_widget); + + gtk_widget_show_all(scrolled_window); + + return scrolled_window; +} + +/* + * DVBHScheduleEvent * mmyth_epg_grid_view_get_selected_schedule() { + * return mmyth_epg_grid_get_selected_schedule + * (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)); } + */