diff -r cb885ee44618 -r 49947675bace maemo-ui-old/src/mmyth_ui.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/maemo-ui-old/src/mmyth_ui.c Thu Oct 25 18:40:14 2007 +0100 @@ -0,0 +1,894 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mmyth_ui.h" +#include "mmyth_uicommon.h" +#include "mmyth_schedulerui.h" +#include "mmyth_recordui.h" +#include "mmyth_uisettings.h" +#include "mmyth_epg_grid_view.h" +#include "mmyth_tvplayer.h" + +/* + * GMyth library includes + */ + +#ifndef MAEMO_PLATFORM +static gint button_press_handler(GtkWidget * widget, GdkEvent * event); +#endif + +static MMythUiCommon *create_main_view(MMythUi * mmyth_ui); +static MMythUiCommon *create_video_view(MMythUi * mmyth_ui); +static MMythUiCommon *create_epg_grid_view(MMythUi * mmyth_ui); +static MMythUiCommon *create_record_view(MMythUi * mmyth_ui); +static MMythUiCommon *create_schedule_view(MMythUi * mmyth_ui); + +static void cb_video_close_button(GtkButton * button, + gpointer user_data); +static void cb_record_button(GtkButton * button, gpointer user_data); +static void cb_menu_item_settings(GtkMenuItem * menuitem, + gpointer user_data); + +/* + * main box from button box separator + */ +static GtkWidget *main_vseparator = NULL; + +GdkPixbuf *icon_sports, + *icon_news, + *icon_movies, + *icon_shows, + *icon_default; + +#ifndef MAEMO_PLATFORM +/* + * FIXME: + */ +static MMythUi *popup_mmyth_ui; +#endif + +MMythUi * +mmyth_ui_initialize( +#ifdef MAEMO_PLATFORM + HildonProgram * program, +#endif + GtkWidget * main_window) +{ + MMythUi *mmyth_ui; + + mmyth_ui = g_new0(MMythUi, 1); + + mmyth_ui->backend_info = + gmyth_backend_info_new_full("localhost", "mythtv", "mythtv", + "mythconverg", 6543); + + mmyth_ui->main_window = main_window; + mmyth_ui->videow = NULL; + mmyth_ui->mmyth_recordui = NULL; + mmyth_ui->mmyth_schedulerui = NULL; + + /* + * Horizontal box that divides the view into control and video area + */ + mmyth_ui->main_hbox = gtk_hbox_new(FALSE, 0); + gtk_widget_show(mmyth_ui->main_hbox); + g_object_ref(mmyth_ui->main_hbox); + + main_bg_color.red = 65000; + main_bg_color.green = 65000; + main_bg_color.blue = 65000; + + +#ifndef MAEMO_PLATFORM + /* + * Popup menu + */ + popup_mmyth_ui = mmyth_ui; + g_signal_connect(G_OBJECT(mmyth_ui->main_hbox), "event", + G_CALLBACK(button_press_handler), + G_OBJECT(mmyth_ui->main_hbox)); + +#else // #ifdef MAEMO + + mmyth_ui->main_menu = GTK_MENU(gtk_menu_new()); + hildon_program_set_common_menu(program, mmyth_ui->main_menu); + + mmyth_ui->menu_setup = gtk_menu_item_new_with_label("Setup"); + gtk_widget_set_size_request(GTK_WIDGET(mmyth_ui->menu_setup), 150, 40); + gtk_menu_append(mmyth_ui->main_menu, mmyth_ui->menu_setup); + + g_signal_connect(G_OBJECT(mmyth_ui->menu_setup), "activate", + G_CALLBACK(cb_menu_item_settings), mmyth_ui); + + gtk_widget_show_all(GTK_WIDGET(mmyth_ui->main_menu)); +#endif + + // Main widget is mmyth_ui->main_hbox + mmyth_ui->main_uicommon = create_main_view(mmyth_ui); + + gtk_container_add(GTK_CONTAINER(mmyth_ui->main_window), + mmyth_ui->main_hbox); + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon); + + return mmyth_ui; +} + +void +mmyth_ui_finalize(MMythUi * mmyth_ui) +{ + if (mmyth_ui != NULL) { + if (mmyth_ui->main_uicommon) + mmyth_uicommon_free(mmyth_ui->main_uicommon); + if (mmyth_ui->video_uicommon) + mmyth_uicommon_free(mmyth_ui->video_uicommon); + if (mmyth_ui->epg_grid_uicommon) + mmyth_uicommon_free(mmyth_ui->epg_grid_uicommon); + if (mmyth_ui->record_uicommon) + mmyth_uicommon_free(mmyth_ui->record_uicommon); + if (mmyth_ui->schedule_uicommon) + mmyth_uicommon_free(mmyth_ui->schedule_uicommon); + + g_free(mmyth_ui); + } +} + +void +mmyth_ui_set_widget(MMythUi * mmyth_ui, MMythUiCommon * new_uicommon) +{ + if (new_uicommon == NULL) { + g_warning("MMythUI setting a NULL UI_Common as current display\n"); + return; + } + + if (mmyth_ui->current_uicommon) { + if (mmyth_ui->current_uicommon == mmyth_ui->video_uicommon) { + gtk_widget_hide(mmyth_ui->current_uicommon->main_widget); + gtk_widget_hide(mmyth_ui->videow); + } else { + gtk_container_remove(GTK_CONTAINER(mmyth_ui->main_hbox), + mmyth_ui->current_uicommon->main_widget); + } + + gtk_container_remove(GTK_CONTAINER(mmyth_ui->main_hbox), + mmyth_ui->current_uicommon->event_box); + gtk_container_remove(GTK_CONTAINER(mmyth_ui->main_hbox), + main_vseparator); + + } + + if (new_uicommon->main_widget == mmyth_ui->video_alignment) { + // gst_player_video_show (GST_PLAYER_VIDEO(mmyth_ui->videow)); + gtk_widget_show(mmyth_ui->video_alignment); + gtk_widget_show(mmyth_ui->videow); + } else { + /* + * FIXME: Fst call is NULL when mmyth_player_init fails + */ + if (mmyth_ui->video_alignment != NULL) + gtk_widget_hide(mmyth_ui->video_alignment); + /* + * FIXME: Fst call is NULL when mmyth_player_init fails + */ + if (mmyth_ui->videow != NULL) + gtk_widget_hide(mmyth_ui->videow); + + gtk_box_pack_start(GTK_BOX(mmyth_ui->main_hbox), + new_uicommon->main_widget, TRUE, TRUE, 0); + } + + if (main_vseparator == NULL) { + /* + * FIXME: should free this variable + */ + main_vseparator = gtk_vseparator_new(); + g_object_ref(main_vseparator); + } + gtk_box_pack_start(GTK_BOX(mmyth_ui->main_hbox), + main_vseparator, FALSE, FALSE, 0); + gtk_widget_show(main_vseparator); + + gtk_box_pack_end(GTK_BOX(mmyth_ui->main_hbox), new_uicommon->event_box, + FALSE, FALSE, 0); + + mmyth_ui->current_uicommon = new_uicommon; + +} + +/* + * The close callback is the same for all windows + */ +static void +cb_not_impl_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + GtkWidget *msg_dialog = + gtk_message_dialog_new(GTK_WINDOW(mmyth_ui->main_window), + GTK_DIALOG_MODAL | + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_INFO, + GTK_BUTTONS_OK, + "Feature not implemented"); + gtk_widget_set_size_request(msg_dialog, 350, 120); + + gtk_dialog_run(GTK_DIALOG(msg_dialog)); + + gtk_widget_destroy(GTK_WIDGET(msg_dialog)); +} + +/****************************************************************************** + * POPUP MENU WIDGET METHODS * + *****************************************************************************/ + +static void +cb_menu_item_settings(GtkMenuItem * menuitem, gpointer user_data) +{ + + MMythUi *mmyth_ui = (MMythUi *) user_data; + + if (mmyth_uisettings_run(GTK_WINDOW(mmyth_ui->main_window))) { + // If user changes the settings, we restart the context + g_debug("[%s] Restarting mmyth_context to new settings", + __FUNCTION__); + // gmyth_context_initialize(); + } +} + +#ifndef MAEMO_PLATFORM + +static void +detacher(GtkWidget * attach_widget, GtkMenu * menu) +{ + +} + +static void +do_popup_menu(GtkWidget * my_widget, GdkEventButton * event) +{ + GtkWidget *popup; + + int button, + event_time; + + GtkWidget *item_general; + GtkWidget *image; + + popup = gtk_menu_new(); + + item_general = gtk_image_menu_item_new_with_mnemonic("Setup"); + gtk_widget_show(item_general); + gtk_container_add(GTK_CONTAINER(popup), item_general); + + image = gtk_image_new_from_stock("gtk-edit", GTK_ICON_SIZE_MENU); + gtk_widget_show(image); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item_general), + image); + + g_signal_connect(G_OBJECT(item_general), "activate", + G_CALLBACK(cb_menu_item_settings), popup_mmyth_ui); + + if (event) { + button = event->button; + event_time = event->time; + } else { + button = 0; + event_time = gtk_get_current_event_time(); + } + + gtk_menu_attach_to_widget(GTK_MENU(popup), my_widget, detacher); + gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL, + button, event_time); + gtk_widget_show_all(popup); +} + +/* + * Respond to a button-press by posting a menu passed in as widget. Note + * that the "widget" argument is the menu being posted, NOT the button + * that was pressed. + */ +static gint +button_press_handler(GtkWidget * widget, GdkEvent * event) +{ + + if (event->type == GDK_BUTTON_PRESS) { + GdkEventButton *bevent = (GdkEventButton *) event; + /* + * Ignore double-clicks and triple-clicks + */ + if (bevent->button == 3) { + do_popup_menu(widget, bevent); + return TRUE; + } + } + + /* + * Tell calling code that we have not handled this event; pass it on. + */ + return FALSE; +} +#endif + +/****************************************************************************** + * MAIN APP VIEW METHODS * + *****************************************************************************/ + +static void +cb_close_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon); +} + +static void +cb_watch_tv_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + gboolean res = FALSE; + + if (!(mmyth_ui->video_uicommon)) + mmyth_ui->video_uicommon = create_video_view(mmyth_ui); + + // Creates the tv player that will retrieve the mythtv content, decode + // and show it + mmyth_ui->tvplayer = mmyth_tvplayer_new(); + /* + * choose here if this is a LiveTV session + */ + mmyth_ui->tvplayer->is_livetv = TRUE; + + res = + mmyth_tvplayer_initialize(mmyth_ui->tvplayer, + mmyth_ui->backend_info); + + if (!res) { + g_warning("[%s] Could not initialize tvplayer", __FUNCTION__); + + g_object_unref(mmyth_ui->tvplayer); + mmyth_ui->tvplayer = NULL; + + GtkWidget *dialog = + gtk_message_dialog_new(GTK_WINDOW(mmyth_ui->main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "MMyth found errors while starting TV Player, please check " + "the GStreamer installation"); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return; + } + // res = mmyth_tvplayer_livetv_setup (mmyth_ui->tvplayer); + // + if (mmyth_ui && mmyth_ui->tvplayer && res) { + mmyth_tvplayer_set_widget(mmyth_ui->tvplayer, mmyth_ui->videow); + mmyth_tvplayer_start_playing(mmyth_ui->tvplayer); + } else { + // TODO: Show Alert with error description! + g_warning("[%s] MMythUI can't initialize tv_player", __FUNCTION__); + g_object_unref(mmyth_ui->tvplayer); + mmyth_ui->tvplayer = NULL; + // FIXME: Show the exact error that happened + GtkWidget *dialog = + gtk_message_dialog_new(GTK_WINDOW(mmyth_ui->main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Error while starting TV Player, please check if the backend" + " is running properly and a tv card is available!"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return; + } + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->video_uicommon); + +} + +static void +cb_epg_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + if (!(mmyth_ui->epg_grid_uicommon)) + mmyth_ui->epg_grid_uicommon = create_epg_grid_view(mmyth_ui); + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->epg_grid_uicommon); +} + +static MMythUiCommon * +create_main_view(MMythUi * mmyth_ui) +{ + MMythUiCommon *ui_common; + GtkWidget *main_widget; + GtkWidget *image; + + g_debug("Creating Main UI Common"); + + // FIXME: file path +#ifdef MMYTH_DEV + image = gtk_image_new_from_file("../pixmaps/mmyth_logo.png"); +#else + image = gtk_image_new_from_file(PIX_DIR "mmyth_logo.png"); +#endif + + main_widget = gtk_event_box_new(); + + gtk_container_add(GTK_CONTAINER(main_widget), image); + + + gtk_widget_show_all(main_widget); + g_object_ref(main_widget); + + ui_common = mmyth_uicommon_new(main_widget, + "Watch TV", "EPG", "Recording"); + + /* + * Button signals + */ + // FIXME + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_watch_tv_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button2), "clicked", + G_CALLBACK(cb_epg_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button3), "clicked", + G_CALLBACK(cb_record_button), mmyth_ui); + + return ui_common; + +} + +/****************************************************************************** + * epg GRID VIEW METHODS * + *****************************************************************************/ + +static MMythUiCommon * +create_epg_grid_view(MMythUi * mmyth_ui) +{ + MMythUiCommon *ui_common; + + g_debug("Creating EPG Grid UI Common"); + + GtkWidget *epg_grid_view = + GTK_WIDGET(epg_grid_view_new(mmyth_ui)); + + ui_common = mmyth_uicommon_new(epg_grid_view, + "Play", "Record", "Close"); + + /* + * Button signals + */ + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_not_impl_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button2), "clicked", + G_CALLBACK(cb_record_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button3), "clicked", + G_CALLBACK(cb_close_button), mmyth_ui); + + return ui_common; +} +/****************************************************************************** + * SCHEDULE VIEW METHODS * + ******************************************************************************/ + +static void +cb_save_new_schedule(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + if (!(mmyth_ui->schedule_uicommon)) + mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui); + + mmyth_schedulerui_save(mmyth_ui->mmyth_schedulerui); + + mmyth_recordui_reload_schedule(mmyth_ui->mmyth_recordui); + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->record_uicommon); + +} + +static void +cb_edit_scheduled(GtkTreeView * tree_view, GtkTreePath * path, + GtkTreeViewColumn * column, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + GtkTreeSelection *selection; + GtkTreeModel *list_store; + GtkTreeIter iter; + int index; + // gint new_row = 0, record_id = 0; + ScheduleInfo *schedule_info; + GList *schedule_list; + // GtkTreeIter iter; + gint res; + + // gtk_tree_store_clear(recordui->sch_tree_store); + + res = + gmyth_scheduler_get_schedule_list(mmyth_ui->mmyth_recordui-> + scheduler, &(schedule_list)); + if (res < 0) { + g_warning + ("[%s] Retrieved NULL list of scheduled data from database", + __FUNCTION__); + // return FALSE; + } + printf("\nX %d", res); + fflush(stdout); + + selection = + gtk_tree_view_get_selection(GTK_TREE_VIEW + (mmyth_ui->mmyth_recordui-> + sch_treeview)); + + gtk_tree_selection_get_selected(selection, &list_store, &iter); + gtk_tree_model_get(list_store, &iter, 4, &index, -1); + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->schedule_uicommon); + + if (!(mmyth_ui->schedule_uicommon)) + mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui); + + schedule_list = + g_list_nth(schedule_list, + g_ascii_strtoull(gtk_tree_path_to_string(path), NULL, + 10)); + schedule_info = (ScheduleInfo *) schedule_list->data; + + printf("\nstarttime: %ld", schedule_info->start_time->tv_sec); + fflush(stdout); +} + +static MMythUiCommon * +create_schedule_view(MMythUi * mmyth_ui) +{ + MMythUiCommon *ui_common; + GtkWidget *schedule_widget; + + g_debug("Creating Schedule UI Common"); + + mmyth_ui->mmyth_schedulerui = + mmyth_schedulerui_new(mmyth_ui->backend_info); + if (mmyth_ui->mmyth_schedulerui == NULL) { + g_warning("[%s] Error while creating scheduler ui", __FUNCTION__); + return NULL; + } + + schedule_widget = mmyth_ui->mmyth_schedulerui->main_widget; + + gtk_widget_show_all(schedule_widget); + g_object_ref(schedule_widget); + + ui_common = mmyth_uicommon_new(schedule_widget, + "Save", "Clear", "Cancel"); + + /* + * Button signals + */ + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_save_new_schedule), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button2), "clicked", + G_CALLBACK(cb_not_impl_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button3), "clicked", + G_CALLBACK(cb_record_button), mmyth_ui); + + return ui_common; +} +/****************************************************************************** + * RECORD VIEW METHODS * + ******************************************************************************/ +static void +cb_record_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + if (!(mmyth_ui->record_uicommon)) { + mmyth_ui->record_uicommon = create_record_view(mmyth_ui); + mmyth_ui->schedule_uicommon = create_schedule_view(mmyth_ui); + } + + mmyth_recordui_reload_all(mmyth_ui->mmyth_recordui); + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->record_uicommon); + +} + +static void +cb_record_close_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon); + + mmyth_recordui_free(mmyth_ui->mmyth_recordui); + + if (mmyth_ui->record_uicommon) { + gtk_widget_destroy(mmyth_ui->record_uicommon->main_widget); + mmyth_uicommon_free(mmyth_ui->record_uicommon); + mmyth_ui->record_uicommon = NULL; + } + + if (mmyth_ui->schedule_uicommon) { + // mmyth_uicommon_free(mmyth_ui->schedule_uicommon); + } +} + + + + +static void +play_selected_recorded(gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + gboolean res = FALSE; + + gchar *path = + mmyth_recordui_get_selected_recorded(mmyth_ui->mmyth_recordui); + + if (path == NULL) { + // This should never happens. Play button is just activated when + // a recording is selected. + g_warning + ("[%s] Play button pressed while none recorded is selected", + __FUNCTION__); + return; + } + + if (!(mmyth_ui->video_uicommon)) + mmyth_ui->video_uicommon = create_video_view(mmyth_ui); + + // Creates the tv player that will retrieve the mythtv content, decode + // and show it + mmyth_ui->tvplayer = mmyth_tvplayer_new(); + g_debug("[%s] New TV Player created: %d\n", __FUNCTION__, + (int) (mmyth_ui->tvplayer)); + res = + mmyth_tvplayer_initialize(mmyth_ui->tvplayer, + mmyth_ui->backend_info); + if (!res) { + g_warning("[%s] Could not initialize tvplayer", __FUNCTION__); + + g_object_unref(mmyth_ui->tvplayer); + mmyth_ui->tvplayer = NULL; + + GtkWidget *dialog = + gtk_message_dialog_new(GTK_WINDOW(mmyth_ui->main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "MMyth found errors while starting TV Player, please check " + "the GStreamer installation"); + + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + + return; + } + + res = mmyth_tvplayer_record_setup(mmyth_ui->tvplayer, path); + + if (mmyth_ui && mmyth_ui->tvplayer && res) { + mmyth_tvplayer_set_widget(mmyth_ui->tvplayer, mmyth_ui->videow); + mmyth_tvplayer_start_playing(mmyth_ui->tvplayer); + } else { + // TODO: Show Alert with error description! + g_warning("[%s] MMythUI can't initialize tv_player", __FUNCTION__); + g_object_unref(mmyth_ui->tvplayer); + mmyth_ui->tvplayer = NULL; + // FIXME: Show the exact error that happened + GtkWidget *dialog = + gtk_message_dialog_new(GTK_WINDOW(mmyth_ui->main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Error while starting TV Player, please check if the backend" + " is running properly and a tv card is available!"); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + return; + } + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->video_uicommon); +} + +static void +cb_play_clicked_recorded(GtkTreeView * tree_view, GtkTreePath * path, + GtkTreeViewColumn * column, gpointer user_data) +{ + play_selected_recorded(user_data); +} + +static void +cb_play_selected(GtkButton * button, gpointer user_data) +{ + play_selected_recorded(user_data); +} + +static void +cb_schedule_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->schedule_uicommon); +} + +void +cb_switch_page(GtkNotebook * notebook, GtkNotebookPage * page, + guint page_num, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + MMythUiCommon *ui_common; + + assert(mmyth_ui); + assert(mmyth_ui->record_uicommon); + + ui_common = mmyth_ui->record_uicommon; + + if (page_num == 0) { // Switched to Schedule list + gtk_button_set_label(GTK_BUTTON(ui_common->button1), "New"); + g_signal_handlers_disconnect_by_func(G_OBJECT(ui_common->button1), + G_CALLBACK(cb_play_selected), + mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_schedule_button), mmyth_ui); + } else if (page_num == 1) { + gtk_button_set_label(GTK_BUTTON(ui_common->button1), "Play"); + g_signal_handlers_disconnect_by_func(G_OBJECT(ui_common->button1), + G_CALLBACK + (cb_schedule_button), + mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_play_selected), mmyth_ui); + } +} + + +static MMythUiCommon * +create_record_view(MMythUi * mmyth_ui) +{ + MMythUiCommon *ui_common; + + g_debug("Creating Record UI Common"); + + mmyth_ui->mmyth_recordui = mmyth_recordui_new(mmyth_ui->backend_info); + + // FIXME: Change MMythRecordUI to a GtkWidget child and avoid this + // call! + gtk_widget_show_all(mmyth_ui->mmyth_recordui->scrolled_window); + + ui_common = + mmyth_uicommon_new(mmyth_ui->mmyth_recordui->scrolled_window, + "New", "Delete", "<mmyth_recordui->scrolled_window); + + /* + * Button signals + */ + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_schedule_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button2), "clicked", + G_CALLBACK(mmyth_recordui_delete_selected), + mmyth_ui->mmyth_recordui); + g_signal_connect(G_OBJECT(ui_common->button3), "clicked", + G_CALLBACK(cb_record_close_button), mmyth_ui); + g_signal_connect(G_OBJECT(mmyth_ui->mmyth_recordui->notebook), + "switch-page", G_CALLBACK(cb_switch_page), mmyth_ui); + g_signal_connect(G_OBJECT(mmyth_ui->mmyth_recordui->rec_treeview), + "row-activated", G_CALLBACK(cb_play_clicked_recorded), + mmyth_ui); + g_signal_connect(G_OBJECT(mmyth_ui->mmyth_recordui->sch_treeview), + "row-activated", G_CALLBACK(cb_edit_scheduled), + mmyth_ui); + return ui_common; +} + + +/****************************************************************************** + * GST VIDEO WIDGET METHODS * + *****************************************************************************/ + +static void +cb_video_close_button(GtkButton * button, gpointer user_data) +{ + MMythUi *mmyth_ui = (MMythUi *) user_data; + + g_debug("MMythUI video close button pressed"); + + if (mmyth_ui && mmyth_ui->tvplayer) { + mmyth_tvplayer_stop_playing(mmyth_ui->tvplayer); + + g_object_unref(mmyth_ui->tvplayer); + mmyth_ui->tvplayer = NULL; + } else { + g_warning("cb_video_close_button called with NULL pointer\n"); + } + + mmyth_ui_set_widget(mmyth_ui, mmyth_ui->main_uicommon); +} + + +static MMythUiCommon * +create_video_view(MMythUi * mmyth_ui) +{ + + MMythUiCommon *ui_common; + + g_debug("Creating Video UI Common"); + + /* + * Creates widget to be user by MMythTVPlayer to draw the video + */ + mmyth_ui->videow = gtk_drawing_area_new(); + // FIXME: Get the widget size from settings + gtk_widget_set_size_request(mmyth_ui->videow, 300, 240); + + // mmiptv_ui->logo = gdk_pixbuf_new_from_file ("logo.png", NULL); + + // Creates an alignment to place the video widget inside + mmyth_ui->video_alignment = gtk_alignment_new(0.5, 0.5, 1, 1); + gtk_widget_hide(mmyth_ui->video_alignment); + + gtk_container_add(GTK_CONTAINER(mmyth_ui->video_alignment), + mmyth_ui->videow); + + /* + * Add the gst video widget to hbox. It should never be removed. + */ + /* + * FIXME: mmyth_ui->video_alignment == NULL when mmyth_player_init + * fails + */ + if ((mmyth_ui->main_hbox != NULL) + && (mmyth_ui->video_alignment != NULL)) { + gtk_box_pack_start(GTK_BOX(mmyth_ui->main_hbox), + mmyth_ui->video_alignment, TRUE, TRUE, 0); + } else { + g_warning("[%s] Error while adding video_alignment to main widget", + __FUNCTION__); + } + + g_object_ref(mmyth_ui->videow); + g_object_ref(mmyth_ui->video_alignment); + + ui_common = mmyth_uicommon_new(mmyth_ui->video_alignment, + " Full\nScreen", "Other\nServices", + "Close"); + + + g_signal_connect(G_OBJECT(ui_common->button1), "clicked", + G_CALLBACK(cb_not_impl_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button2), "clicked", + G_CALLBACK(cb_not_impl_button), mmyth_ui); + g_signal_connect(G_OBJECT(ui_common->button3), "clicked", + G_CALLBACK(cb_video_close_button), mmyth_ui); + + if (ui_common) + g_debug("Video UI_Common sucessfull created"); + + return ui_common; +} + + + +GtkWidget * +mmyth_ui_get_video_widget(MMythUi * mmyth_ui) +{ + + if (mmyth_ui && mmyth_ui->videow) { + + return mmyth_ui->videow; + } + + return NULL; +}