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