1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/maemo-ui-old/src/mmyth_epg_grid_view.c Fri Feb 01 14:30:21 2008 +0000
1.3 @@ -0,0 +1,243 @@
1.4 +#include <string.h>
1.5 +#include <stdlib.h>
1.6 +#include <gtk/gtk.h>
1.7 +#include <gdk/gdkkeysyms.h>
1.8 +#include <time.h>
1.9 +
1.10 +#include "mmyth_epg_grid_view.h"
1.11 +#include "mmyth_epg_grid_widget.h"
1.12 +
1.13 +/*
1.14 + * Service genre
1.15 + */
1.16 +#define GENRE_MIN 0
1.17 +#define GENRE_MAX 10
1.18 +#define GENRE_UNDEFINED 0
1.19 +#define GENRE_MOVIE 1
1.20 +#define GENRE_NEWS 2
1.21 +#define GENRE_SHOW 3
1.22 +#define GENRE_SPORTS 4
1.23 +#define GENRE_CHILDREN 5
1.24 +#define GENRE_MUSIC 6
1.25 +#define GENRE_CULTURE 7
1.26 +#define GENRE_SOCIAL 8
1.27 +#define GENRE_EDUCATION 9
1.28 +#define GENRE_LEISURE 10
1.29 +
1.30 +#define NRO_HOURS 3
1.31 +
1.32 +/*
1.33 + * Function prototypes
1.34 + */
1.35 +static void update_service_details(MMythEpgGridWidget * object,
1.36 + gpointer arg1, gpointer user_data);
1.37 +static gboolean key_press_epg_grid_view(GtkWidget * widget,
1.38 + GdkEventKey * event,
1.39 + gpointer user_data);
1.40 +
1.41 +static GtkWidget *mmyth_epg_grid_widget = NULL;
1.42 +
1.43 +/*
1.44 + * is a GtkEventBox
1.45 + */
1.46 +static GtkWidget *program_details_area = NULL;
1.47 +static GtkWidget *details_main_hbox = NULL;
1.48 +static GtkWidget *details_vbox = NULL;
1.49 +static GtkWidget *details_logo_vbox = NULL;
1.50 +
1.51 +/*
1.52 + * update signal callback from MMythEpgGridWidget
1.53 + */
1.54 +static void
1.55 +update_service_details(MMythEpgGridWidget * object, gpointer arg1,
1.56 + gpointer user_data)
1.57 +{
1.58 + g_return_if_fail(arg1 != NULL);
1.59 +
1.60 + EpgGridItem *epg_grid_item = (EpgGridItem *) arg1;
1.61 +
1.62 + gchar sel_prog_desc[100] = "<big><b>";
1.63 + gchar time_buffer[50];
1.64 +
1.65 + /*
1.66 + * FIXME: get first content from content_list
1.67 + */
1.68 + GMythProgramInfo *proginfo =
1.69 + (GMythProgramInfo *) epg_grid_item->proginfo;
1.70 +
1.71 + if (proginfo) {
1.72 + GString *prog_name = proginfo->title;
1.73 + GString *service_name = proginfo->chanid;
1.74 +
1.75 + if (details_vbox != NULL)
1.76 + gtk_container_remove(GTK_CONTAINER(details_main_hbox),
1.77 + details_vbox);
1.78 +
1.79 + /*
1.80 + * update service description
1.81 + */
1.82 + strcat(sel_prog_desc, service_name->str);
1.83 + strcat(sel_prog_desc, "</b></big>");
1.84 +
1.85 + GtkWidget *fst_line_lbl = gtk_label_new(NULL);
1.86 + gtk_misc_set_alignment(GTK_MISC(fst_line_lbl), 0.0, 0.0);
1.87 + gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc);
1.88 +
1.89 + /*
1.90 + * freeing char[]
1.91 + */
1.92 + sel_prog_desc[0] = 0;
1.93 + strcat(sel_prog_desc, "\t");
1.94 + strcat(sel_prog_desc, prog_name->str);
1.95 +
1.96 + struct tm loctime_start,
1.97 + loctime_end;
1.98 +
1.99 + // Convert it to local time representation.
1.100 + /*
1.101 + * FIXME: conversion from time to localtime is different in
1.102 + * different machines
1.103 + */
1.104 + long int schedule_start_time = proginfo->startts->tv_sec;
1.105 + long int schedule_end_time = proginfo->endts->tv_sec;
1.106 +
1.107 + if (localtime_r(&schedule_start_time, &loctime_start) == NULL) {
1.108 + g_warning("localtime_r error in mmyth_epg_grid_view!\n");
1.109 + }
1.110 +#if 0
1.111 + fprintf(stderr, asctime(loctime_start));
1.112 +#endif
1.113 +
1.114 + strftime(time_buffer, 100, " %H:%M - ", &loctime_start);
1.115 + strcat(sel_prog_desc, time_buffer);
1.116 +
1.117 + if (localtime_r(&schedule_end_time, &loctime_end) == NULL) {
1.118 + g_warning("localtime_r error in mmyth_epg_grid_view!\n");
1.119 + }
1.120 +#if 0
1.121 + fprintf(stderr, asctime(loctime_end));
1.122 +#endif
1.123 +
1.124 + strftime(time_buffer, 100, "%H:%M\n", &loctime_end);
1.125 + strcat(sel_prog_desc, time_buffer);
1.126 +
1.127 + GtkWidget *snd_line_lbl = gtk_label_new(NULL);
1.128 + gtk_misc_set_alignment(GTK_MISC(snd_line_lbl), 0.0, 0.0);
1.129 + gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc);
1.130 +
1.131 + // add the current selected program description to the label
1.132 + details_vbox = gtk_vbox_new(FALSE, 0);
1.133 + GtkWidget *fst_line_hbox = gtk_hbox_new(FALSE, 0);
1.134 +
1.135 + gtk_box_pack_start(GTK_BOX(fst_line_hbox),
1.136 + fst_line_lbl, FALSE, FALSE, 6);
1.137 + gtk_box_pack_start(GTK_BOX(details_vbox),
1.138 + fst_line_hbox, FALSE, FALSE, 0);
1.139 + gtk_box_pack_start(GTK_BOX(details_vbox),
1.140 + snd_line_lbl, FALSE, FALSE, 0);
1.141 + gtk_box_pack_start(GTK_BOX(details_main_hbox),
1.142 + details_vbox, FALSE, FALSE, 0);
1.143 +
1.144 + gtk_widget_show_all(details_main_hbox);
1.145 + }
1.146 +}
1.147 +
1.148 +/*
1.149 + * Callback for hardware keys
1.150 + */
1.151 +static gboolean
1.152 +key_press_epg_grid_view(GtkWidget * widget,
1.153 + GdkEventKey * event, gpointer user_data)
1.154 +{
1.155 + MMythEpgGridWidget *mmyth_epg_grid_widget =
1.156 + (MMythEpgGridWidget *) user_data;
1.157 +
1.158 + return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget,
1.159 + event);
1.160 +}
1.161 +
1.162 +GtkWidget *
1.163 +epg_grid_view_new(MMythUi * mmyth_ui)
1.164 +{
1.165 + GtkWidget *scrolled_window;
1.166 + scrolled_window = gtk_scrolled_window_new(NULL, NULL);
1.167 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
1.168 + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1.169 +
1.170 + gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL,
1.171 + &main_bg_color);
1.172 +
1.173 + GtkWidget *main_vbox = gtk_vbox_new(FALSE, 0);
1.174 + // gtk_container_set_border_width(main_vbox, 4);
1.175 +
1.176 + GtkWidget *details_event_box = gtk_event_box_new();
1.177 + gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL,
1.178 + &main_bg_color);
1.179 +
1.180 + program_details_area = gtk_vbox_new(FALSE, 0);
1.181 + gtk_container_add(GTK_CONTAINER(details_event_box),
1.182 + program_details_area);
1.183 + gtk_container_set_border_width(GTK_CONTAINER(program_details_area), 4);
1.184 +
1.185 + details_main_hbox = gtk_hbox_new(FALSE, 10);
1.186 +
1.187 + gtk_box_pack_start(GTK_BOX(program_details_area),
1.188 + details_main_hbox, FALSE, FALSE, 0);
1.189 +
1.190 + details_logo_vbox = gtk_vbox_new(FALSE, 0);
1.191 +
1.192 + GtkWidget *details_desc_vbox = gtk_vbox_new(FALSE, 0);
1.193 +
1.194 + gtk_box_pack_start(GTK_BOX(details_main_hbox),
1.195 + details_desc_vbox, FALSE, FALSE, 0);
1.196 + gtk_box_pack_start(GTK_BOX(details_main_hbox),
1.197 + details_logo_vbox, FALSE, FALSE, 0);
1.198 +
1.199 + gtk_widget_set_size_request(program_details_area, -1, 120);
1.200 +
1.201 + mmyth_epg_grid_widget = mmyth_epg_grid_widget_new();
1.202 + g_signal_connect(mmyth_epg_grid_widget, "selection_updated",
1.203 + G_CALLBACK(update_service_details), NULL);
1.204 +
1.205 + /*
1.206 + * select by default the first service
1.207 + */
1.208 + /*
1.209 + * depends on mount services
1.210 + */
1.211 + if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) {
1.212 + GList *fst_service = (GList *)
1.213 + MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model->
1.214 + data;
1.215 + mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET
1.216 + (mmyth_epg_grid_widget),
1.217 + fst_service);
1.218 + }
1.219 +
1.220 + gtk_box_pack_start(GTK_BOX(main_vbox),
1.221 + details_event_box, FALSE, FALSE, 0);
1.222 + gtk_box_pack_start(GTK_BOX(main_vbox),
1.223 + gtk_hseparator_new(), FALSE, FALSE, 0);
1.224 + gtk_box_pack_start(GTK_BOX(main_vbox),
1.225 + mmyth_epg_grid_widget, FALSE, FALSE, 0);
1.226 +
1.227 + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW
1.228 + (scrolled_window), main_vbox);
1.229 +
1.230 + /*
1.231 + * Add hardware button listener to application
1.232 + */
1.233 + g_signal_connect(mmyth_ui->main_window, "key_press_event",
1.234 + G_CALLBACK(key_press_epg_grid_view),
1.235 + mmyth_epg_grid_widget);
1.236 +
1.237 + gtk_widget_show_all(scrolled_window);
1.238 +
1.239 + return scrolled_window;
1.240 +}
1.241 +
1.242 +/*
1.243 + * DVBHScheduleEvent * mmyth_epg_grid_view_get_selected_schedule() {
1.244 + * return mmyth_epg_grid_get_selected_schedule
1.245 + * (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)); }
1.246 + */