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