maemo-ui/src/mmyth_epg_grid_view.c
author renatofilho
Thu Jul 05 13:43:24 2007 +0100 (2007-07-05)
branchtrunk
changeset 786 a4529d0f8ede
parent 244 c88244670b08
permissions -rw-r--r--
[svn r792] fixed bug on live
renatofilho@20
     1
#include <string.h>
renatofilho@20
     2
#include <stdlib.h>
renatofilho@20
     3
#include <gtk/gtk.h>
renatofilho@20
     4
#include <gdk/gdkkeysyms.h>
renatofilho@20
     5
#include <time.h>
renatofilho@20
     6
renatofilho@20
     7
#include "mmyth_epg_grid_view.h"
renatofilho@20
     8
#include "mmyth_epg_grid_widget.h"
renatofilho@20
     9
renatofilho@754
    10
/*
renatofilho@754
    11
 * Service genre 
renatofilho@754
    12
 */
renatofilho@20
    13
#define GENRE_MIN               0
renatofilho@20
    14
#define GENRE_MAX               10
renatofilho@20
    15
#define GENRE_UNDEFINED         0
renatofilho@20
    16
#define GENRE_MOVIE             1
renatofilho@20
    17
#define GENRE_NEWS              2
renatofilho@20
    18
#define GENRE_SHOW              3
renatofilho@20
    19
#define GENRE_SPORTS            4
renatofilho@20
    20
#define GENRE_CHILDREN          5
renatofilho@20
    21
#define GENRE_MUSIC             6
renatofilho@20
    22
#define GENRE_CULTURE           7
renatofilho@20
    23
#define GENRE_SOCIAL            8
renatofilho@20
    24
#define GENRE_EDUCATION         9
renatofilho@20
    25
#define GENRE_LEISURE           10
renatofilho@20
    26
renatofilho@20
    27
#define NRO_HOURS 3
renatofilho@20
    28
renatofilho@754
    29
/*
renatofilho@754
    30
 * Function prototypes
renatofilho@754
    31
 */
renatofilho@754
    32
static void     update_service_details(MMythEpgGridWidget * object,
renatofilho@754
    33
                                       gpointer arg1, gpointer user_data);
renatofilho@754
    34
static gboolean key_press_epg_grid_view(GtkWidget * widget,
renatofilho@754
    35
                                        GdkEventKey * event,
renatofilho@20
    36
                                        gpointer user_data);
renatofilho@20
    37
renatofilho@20
    38
static GtkWidget *mmyth_epg_grid_widget = NULL;
renatofilho@20
    39
renatofilho@754
    40
/*
renatofilho@754
    41
 * is a GtkEventBox 
renatofilho@754
    42
 */
renatofilho@20
    43
static GtkWidget *program_details_area = NULL;
renatofilho@20
    44
static GtkWidget *details_main_hbox = NULL;
renatofilho@20
    45
static GtkWidget *details_vbox = NULL;
renatofilho@20
    46
static GtkWidget *details_logo_vbox = NULL;
renatofilho@20
    47
renatofilho@754
    48
/*
renatofilho@754
    49
 * update signal callback from MMythEpgGridWidget 
renatofilho@754
    50
 */
renatofilho@20
    51
static void
renatofilho@754
    52
update_service_details(MMythEpgGridWidget * object, gpointer arg1,
renatofilho@754
    53
                       gpointer user_data)
renatofilho@20
    54
{
renatofilho@754
    55
    g_return_if_fail(arg1 != NULL);
renatofilho@20
    56
renatofilho@754
    57
    EpgGridItem    *epg_grid_item = (EpgGridItem *) arg1;
renatofilho@20
    58
renatofilho@754
    59
    gchar           sel_prog_desc[100] = "<big><b>";
renatofilho@754
    60
    gchar           time_buffer[50];
renatofilho@20
    61
renatofilho@754
    62
    /*
renatofilho@754
    63
     * FIXME: get first content from content_list
renatofilho@754
    64
     */
renatofilho@754
    65
    GMythProgramInfo *proginfo =
renatofilho@754
    66
        (GMythProgramInfo *) epg_grid_item->proginfo;
renatofilho@754
    67
renatofilho@754
    68
    if (proginfo) {
renatofilho@754
    69
        GString        *prog_name = proginfo->title;
renatofilho@754
    70
        GString        *service_name = proginfo->chanid;
renatofilho@754
    71
renatofilho@754
    72
        if (details_vbox != NULL)
renatofilho@754
    73
            gtk_container_remove(GTK_CONTAINER(details_main_hbox),
renatofilho@754
    74
                                 details_vbox);
renatofilho@754
    75
renatofilho@754
    76
        /*
renatofilho@754
    77
         * update service description 
renatofilho@754
    78
         */
renatofilho@20
    79
        strcat(sel_prog_desc, service_name->str);
renatofilho@20
    80
        strcat(sel_prog_desc, "</b></big>");
renatofilho@20
    81
renatofilho@754
    82
        GtkWidget      *fst_line_lbl = gtk_label_new(NULL);
renatofilho@754
    83
        gtk_misc_set_alignment(GTK_MISC(fst_line_lbl), 0.0, 0.0);
renatofilho@754
    84
        gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc);
renatofilho@754
    85
renatofilho@754
    86
        /*
renatofilho@754
    87
         * freeing char[] 
renatofilho@754
    88
         */
renatofilho@20
    89
        sel_prog_desc[0] = 0;
renatofilho@20
    90
        strcat(sel_prog_desc, "\t");
renatofilho@754
    91
        strcat(sel_prog_desc, prog_name->str);
renatofilho@754
    92
renatofilho@754
    93
        struct tm       loctime_start,
renatofilho@754
    94
                        loctime_end;
renatofilho@754
    95
renatofilho@20
    96
        // Convert it to local time representation. 
renatofilho@754
    97
        /*
renatofilho@754
    98
         * FIXME: conversion from time to localtime is different in
renatofilho@754
    99
         * different machines 
renatofilho@754
   100
         */
renatofilho@754
   101
        long int        schedule_start_time = proginfo->startts->tv_sec;
renatofilho@754
   102
        long int        schedule_end_time = proginfo->endts->tv_sec;
renatofilho@754
   103
renatofilho@20
   104
        if (localtime_r(&schedule_start_time, &loctime_start) == NULL) {
renatofilho@754
   105
            g_warning("localtime_r error in mmyth_epg_grid_view!\n");
renatofilho@20
   106
        }
renatofilho@754
   107
#if 0
renatofilho@754
   108
        fprintf(stderr, asctime(loctime_start));
renatofilho@754
   109
#endif
renatofilho@754
   110
renatofilho@754
   111
        strftime(time_buffer, 100, "  %H:%M - ", &loctime_start);
renatofilho@754
   112
        strcat(sel_prog_desc, time_buffer);
renatofilho@754
   113
renatofilho@20
   114
        if (localtime_r(&schedule_end_time, &loctime_end) == NULL) {
renatofilho@754
   115
            g_warning("localtime_r error in mmyth_epg_grid_view!\n");
renatofilho@20
   116
        }
renatofilho@754
   117
#if 0
renatofilho@754
   118
        fprintf(stderr, asctime(loctime_end));
renatofilho@754
   119
#endif
renatofilho@20
   120
renatofilho@754
   121
        strftime(time_buffer, 100, "%H:%M\n", &loctime_end);
renatofilho@754
   122
        strcat(sel_prog_desc, time_buffer);
renatofilho@754
   123
renatofilho@754
   124
        GtkWidget      *snd_line_lbl = gtk_label_new(NULL);
renatofilho@754
   125
        gtk_misc_set_alignment(GTK_MISC(snd_line_lbl), 0.0, 0.0);
renatofilho@754
   126
        gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc);
renatofilho@754
   127
renatofilho@20
   128
        // add the current selected program description to the label
renatofilho@20
   129
        details_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754
   130
        GtkWidget      *fst_line_hbox = gtk_hbox_new(FALSE, 0);
renatofilho@754
   131
renatofilho@754
   132
        gtk_box_pack_start(GTK_BOX(fst_line_hbox),
renatofilho@754
   133
                           fst_line_lbl, FALSE, FALSE, 6);
renatofilho@754
   134
        gtk_box_pack_start(GTK_BOX(details_vbox),
renatofilho@754
   135
                           fst_line_hbox, FALSE, FALSE, 0);
renatofilho@754
   136
        gtk_box_pack_start(GTK_BOX(details_vbox),
renatofilho@754
   137
                           snd_line_lbl, FALSE, FALSE, 0);
renatofilho@754
   138
        gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754
   139
                           details_vbox, FALSE, FALSE, 0);
renatofilho@754
   140
renatofilho@20
   141
        gtk_widget_show_all(details_main_hbox);
renatofilho@754
   142
    }
renatofilho@20
   143
}
renatofilho@20
   144
renatofilho@754
   145
/*
renatofilho@754
   146
 * Callback for hardware keys 
renatofilho@754
   147
 */
renatofilho@754
   148
static          gboolean
renatofilho@754
   149
key_press_epg_grid_view(GtkWidget * widget,
renatofilho@20
   150
                        GdkEventKey * event, gpointer user_data)
renatofilho@20
   151
{
renatofilho@754
   152
    MMythEpgGridWidget *mmyth_epg_grid_widget =
renatofilho@754
   153
        (MMythEpgGridWidget *) user_data;
renatofilho@20
   154
renatofilho@754
   155
    return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget,
renatofilho@754
   156
                                           event);
renatofilho@20
   157
}
renatofilho@20
   158
renatofilho@754
   159
GtkWidget      *
renatofilho@754
   160
epg_grid_view_new(MMythUi * mmyth_ui)
renatofilho@20
   161
{
renatofilho@754
   162
    GtkWidget      *scrolled_window;
renatofilho@754
   163
    scrolled_window = gtk_scrolled_window_new(NULL, NULL);
renatofilho@754
   164
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
renatofilho@754
   165
                                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
renatofilho@20
   166
renatofilho@754
   167
    gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL,
renatofilho@754
   168
                         &main_bg_color);
renatofilho@20
   169
renatofilho@754
   170
    GtkWidget      *main_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754
   171
    // gtk_container_set_border_width(main_vbox, 4); 
renatofilho@20
   172
renatofilho@754
   173
    GtkWidget      *details_event_box = gtk_event_box_new();
renatofilho@754
   174
    gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL,
renatofilho@754
   175
                         &main_bg_color);
renatofilho@754
   176
renatofilho@754
   177
    program_details_area = gtk_vbox_new(FALSE, 0);
renatofilho@754
   178
    gtk_container_add(GTK_CONTAINER(details_event_box),
renatofilho@754
   179
                      program_details_area);
renatofilho@754
   180
    gtk_container_set_border_width(GTK_CONTAINER(program_details_area), 4);
renatofilho@754
   181
renatofilho@754
   182
    details_main_hbox = gtk_hbox_new(FALSE, 10);
renatofilho@754
   183
renatofilho@754
   184
    gtk_box_pack_start(GTK_BOX(program_details_area),
renatofilho@754
   185
                       details_main_hbox, FALSE, FALSE, 0);
renatofilho@754
   186
renatofilho@754
   187
    details_logo_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754
   188
renatofilho@754
   189
    GtkWidget      *details_desc_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754
   190
renatofilho@754
   191
    gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754
   192
                       details_desc_vbox, FALSE, FALSE, 0);
renatofilho@754
   193
    gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754
   194
                       details_logo_vbox, FALSE, FALSE, 0);
renatofilho@754
   195
renatofilho@754
   196
    gtk_widget_set_size_request(program_details_area, -1, 120);
renatofilho@754
   197
renatofilho@20
   198
    mmyth_epg_grid_widget = mmyth_epg_grid_widget_new();
renatofilho@754
   199
    g_signal_connect(mmyth_epg_grid_widget, "selection_updated",
renatofilho@754
   200
                     G_CALLBACK(update_service_details), NULL);
renatofilho@20
   201
renatofilho@754
   202
    /*
renatofilho@754
   203
     * select by default the first service 
renatofilho@754
   204
     */
renatofilho@754
   205
    /*
renatofilho@754
   206
     * depends on mount services 
renatofilho@754
   207
     */
renatofilho@20
   208
    if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) {
renatofilho@754
   209
        GList          *fst_service = (GList *)
renatofilho@754
   210
            MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model->
renatofilho@754
   211
            data;
renatofilho@754
   212
        mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET
renatofilho@754
   213
                                             (mmyth_epg_grid_widget),
renatofilho@754
   214
                                             fst_service);
renatofilho@20
   215
    }
renatofilho@20
   216
renatofilho@754
   217
    gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754
   218
                       details_event_box, FALSE, FALSE, 0);
renatofilho@754
   219
    gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754
   220
                       gtk_hseparator_new(), FALSE, FALSE, 0);
renatofilho@754
   221
    gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754
   222
                       mmyth_epg_grid_widget, FALSE, FALSE, 0);
renatofilho@20
   223
renatofilho@754
   224
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW
renatofilho@754
   225
                                          (scrolled_window), main_vbox);
renatofilho@754
   226
renatofilho@754
   227
    /*
renatofilho@754
   228
     * Add hardware button listener to application 
renatofilho@754
   229
     */
renatofilho@754
   230
    g_signal_connect(mmyth_ui->main_window, "key_press_event",
renatofilho@754
   231
                     G_CALLBACK(key_press_epg_grid_view),
renatofilho@754
   232
                     mmyth_epg_grid_widget);
renatofilho@754
   233
renatofilho@754
   234
    gtk_widget_show_all(scrolled_window);
renatofilho@754
   235
renatofilho@20
   236
    return scrolled_window;
renatofilho@20
   237
}
renatofilho@20
   238
renatofilho@20
   239
/*
renatofilho@754
   240
 * DVBHScheduleEvent * mmyth_epg_grid_view_get_selected_schedule() {
renatofilho@754
   241
 * return mmyth_epg_grid_get_selected_schedule
renatofilho@754
   242
 * (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)); } 
renatofilho@754
   243
 */