rosfran@244: #include rosfran@244: #include renatofilho@20: #include renatofilho@20: #include renatofilho@20: #include renatofilho@20: #include renatofilho@20: #include renatofilho@20: #include renatofilho@20: renatofilho@20: #include "mmyth_ui.h" renatofilho@20: #include "mmyth_recordui.h" renatofilho@20: renatofilho@754: /* renatofilho@754: * GMyth library includes renatofilho@754: */ rosfran@244: #include rosfran@244: #include renatofilho@20: renatofilho@20: enum { renatofilho@754: START_DATE_COLUMN = 0, renatofilho@754: TITLE_COLUMN, renatofilho@754: CHAN_ID_COLUMN, renatofilho@754: END_TIME_COLUMN, renatofilho@754: RECORD_ID_COLUMN, renatofilho@754: BASENAME_COLUMN, renatofilho@754: N_COLUMNS renatofilho@20: }; renatofilho@20: renatofilho@20: gboolean renatofilho@754: mmyth_recordui_reload_all(MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: gboolean res = FALSE; renatofilho@20: renatofilho@754: res = mmyth_recordui_reload_schedule(recordui); renatofilho@754: renatofilho@754: res = res & mmyth_recordui_reload_record(recordui); renatofilho@754: renatofilho@754: renatofilho@754: if (!res) renatofilho@754: g_warning renatofilho@754: ("[%s] Error while reloading schedule and recording content", renatofilho@754: __FUNCTION__); renatofilho@754: renatofilho@754: return res; renatofilho@20: } renatofilho@20: renatofilho@20: gboolean renatofilho@754: mmyth_recordui_reload_schedule(MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: gint new_row = 0; renatofilho@754: ScheduleInfo *schedule_info; renatofilho@754: GList *schedule_list; renatofilho@754: GtkTreeIter iter; renatofilho@754: gchar *start_date_time = NULL; renatofilho@754: gchar *end_date_time = NULL; renatofilho@754: GString *str_aux = g_string_new(""); renatofilho@754: gint res; renatofilho@20: renatofilho@754: gtk_tree_store_clear(recordui->sch_tree_store); renatofilho@20: renatofilho@754: res = renatofilho@754: gmyth_scheduler_get_schedule_list(recordui->scheduler, renatofilho@754: &(schedule_list)); renatofilho@754: if (res < 0) { renatofilho@754: g_warning renatofilho@754: ("[%s] Retrieved NULL list of scheduled data from database", renatofilho@754: __FUNCTION__); renatofilho@754: return FALSE; renatofilho@754: } renatofilho@20: renatofilho@754: for (; schedule_list; schedule_list = schedule_list->next) { renatofilho@754: schedule_info = (ScheduleInfo *) schedule_list->data; renatofilho@20: renatofilho@754: gtk_tree_store_insert(recordui->sch_tree_store, &iter, NULL, renatofilho@754: new_row++); renatofilho@754: renatofilho@754: start_date_time = renatofilho@754: gmyth_util_time_to_string_from_time_val(schedule_info-> renatofilho@754: start_time); renatofilho@754: end_date_time = renatofilho@754: gmyth_util_time_to_string_from_time_val(schedule_info-> renatofilho@754: end_time); renatofilho@754: renatofilho@20: g_string_printf(str_aux, "%d", schedule_info->channel_id); renatofilho@754: renatofilho@754: gtk_tree_store_set(recordui->sch_tree_store, &iter, START_DATE_COLUMN, start_date_time, TITLE_COLUMN, schedule_info->title->str, CHAN_ID_COLUMN, str_aux->str, END_TIME_COLUMN, end_date_time, // It renatofilho@754: // doesn't renatofilho@754: // appear renatofilho@754: RECORD_ID_COLUMN, schedule_info->record_id, -1); // the renatofilho@754: // last renatofilho@754: // line renatofilho@754: // is renatofilho@754: // a renatofilho@754: // hidden renatofilho@754: // item renatofilho@754: // to renatofilho@754: // be renatofilho@754: // used renatofilho@754: // in renatofilho@754: // searching renatofilho@754: // tasks renatofilho@754: } renatofilho@754: renatofilho@754: g_debug("[%s] %d lines added to schedule list UI", __FUNCTION__, renatofilho@754: new_row); renatofilho@754: renatofilho@754: /* renatofilho@754: * free allocated memory renatofilho@754: */ renatofilho@754: if (!start_date_time) rosfran@244: g_free(start_date_time); renatofilho@754: if (!end_date_time) rosfran@244: g_free(end_date_time); renatofilho@754: g_string_free(str_aux, FALSE); renatofilho@754: renatofilho@754: return TRUE; renatofilho@20: } renatofilho@20: renatofilho@20: gboolean renatofilho@754: mmyth_recordui_reload_record(MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: gint new_row = 0; renatofilho@754: RecordedInfo *recorded_info; renatofilho@754: GList *record_list = NULL; renatofilho@754: GtkTreeIter iter; renatofilho@754: gchar *start_date_time = NULL; renatofilho@754: gchar *end_date_time = NULL; renatofilho@754: GString *str_aux = g_string_new(""); renatofilho@754: gint res; renatofilho@20: renatofilho@754: gtk_tree_store_clear(recordui->rec_tree_store); renatofilho@20: renatofilho@754: res = renatofilho@754: gmyth_scheduler_get_recorded_list(recordui->scheduler, renatofilho@754: &record_list); renatofilho@754: if (res < 0) { renatofilho@754: g_warning renatofilho@754: ("[%s] Retrieved NULL list of recorded data from database", renatofilho@754: __FUNCTION__); renatofilho@754: return FALSE; renatofilho@754: } renatofilho@20: renatofilho@754: for (; record_list; record_list = record_list->next) { renatofilho@754: recorded_info = (RecordedInfo *) record_list->data; renatofilho@754: renatofilho@754: gtk_tree_store_insert(recordui->rec_tree_store, &iter, NULL, renatofilho@754: new_row++); renatofilho@754: renatofilho@754: start_date_time = renatofilho@754: gmyth_util_time_to_string_from_time_val(recorded_info-> renatofilho@754: start_time); renatofilho@754: end_date_time = renatofilho@754: gmyth_util_time_to_string_from_time_val(recorded_info-> renatofilho@754: end_time); renatofilho@20: renatofilho@20: g_string_printf(str_aux, "%d", recorded_info->channel_id); renatofilho@20: renatofilho@754: gtk_tree_store_set(recordui->rec_tree_store, &iter, START_DATE_COLUMN, start_date_time, TITLE_COLUMN, recorded_info->title->str, CHAN_ID_COLUMN, str_aux->str, END_TIME_COLUMN, end_date_time, // It renatofilho@754: // doesn't renatofilho@754: // appear renatofilho@754: RECORD_ID_COLUMN, recorded_info->record_id, renatofilho@754: BASENAME_COLUMN, recorded_info->basename->str, renatofilho@754: -1); renatofilho@754: // the last line is a hidden item to be used in searching tasks renatofilho@754: } rosfran@244: renatofilho@754: g_debug("[%s] %d lines added to record list UI", __FUNCTION__, renatofilho@754: new_row); renatofilho@754: renatofilho@754: /* renatofilho@754: * free allocated memory renatofilho@754: */ renatofilho@754: if (NULL != start_date_time) rosfran@244: g_free(start_date_time); renatofilho@754: if (NULL != end_date_time) rosfran@244: g_free(end_date_time); renatofilho@754: g_string_free(str_aux, FALSE); renatofilho@754: renatofilho@754: return TRUE; renatofilho@20: } renatofilho@20: renatofilho@20: renatofilho@754: MMythRecordUI * renatofilho@754: mmyth_recordui_new(GMythBackendInfo * backend_info) renatofilho@20: { renatofilho@754: MMythRecordUI *recordui = g_new0(MMythRecordUI, 1); rosfran@244: renatofilho@754: g_return_val_if_fail(backend_info != NULL, NULL); rosfran@244: renatofilho@754: recordui->backend_info = backend_info; renatofilho@20: renatofilho@754: recordui->scrolled_window = gtk_scrolled_window_new(NULL, NULL); renatofilho@754: gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW renatofilho@754: (recordui->scrolled_window), renatofilho@754: GTK_POLICY_AUTOMATIC, renatofilho@754: GTK_POLICY_AUTOMATIC); renatofilho@20: renatofilho@754: recordui->viewport = gtk_viewport_new(NULL, NULL); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->scrolled_window), renatofilho@754: recordui->viewport); renatofilho@20: renatofilho@754: recordui->notebook = gtk_notebook_new(); renatofilho@754: gtk_container_set_border_width(GTK_CONTAINER(recordui->notebook), 1); renatofilho@754: gtk_notebook_set_scrollable(GTK_NOTEBOOK(recordui->notebook), TRUE); renatofilho@754: gtk_notebook_popup_enable(GTK_NOTEBOOK(recordui->notebook)); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->viewport), renatofilho@754: recordui->notebook); renatofilho@754: gtk_notebook_popup_disable(GTK_NOTEBOOK(recordui->notebook)); renatofilho@20: renatofilho@754: /* renatofilho@754: * Schedule tab renatofilho@754: */ renatofilho@754: recordui->sch_scrolled_window = gtk_scrolled_window_new(NULL, NULL); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->notebook), renatofilho@754: recordui->sch_scrolled_window); renatofilho@754: gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW renatofilho@754: (recordui->sch_scrolled_window), renatofilho@754: GTK_POLICY_AUTOMATIC, renatofilho@754: GTK_POLICY_AUTOMATIC); renatofilho@754: gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW renatofilho@754: (recordui->sch_scrolled_window), renatofilho@754: GTK_SHADOW_IN); renatofilho@754: renatofilho@754: /* renatofilho@754: * The basename column in the sched_tree_store is not being used renatofilho@754: */ renatofilho@754: recordui->sch_tree_store = renatofilho@754: gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, renatofilho@754: G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, renatofilho@754: G_TYPE_STRING); renatofilho@754: renatofilho@754: recordui->sch_treeview = renatofilho@754: gtk_tree_view_new_with_model(GTK_TREE_MODEL renatofilho@754: (recordui->sch_tree_store)); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->sch_scrolled_window), renatofilho@754: recordui->sch_treeview); renatofilho@754: recordui->sch_renderer = gtk_cell_renderer_text_new(); renatofilho@754: // g_object_set(G_OBJECT(renderer1), "foreground", "green", renatofilho@754: // "background", "black", NULL); renatofilho@754: recordui->sch_column1 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Start time", renatofilho@754: recordui->sch_renderer, renatofilho@754: "text", START_DATE_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), renatofilho@754: recordui->sch_column1); renatofilho@754: recordui->sch_column2 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Title", renatofilho@754: recordui->sch_renderer, renatofilho@754: "text", TITLE_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), renatofilho@20: recordui->sch_column2); renatofilho@754: recordui->sch_column3 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Channel", renatofilho@754: recordui->sch_renderer, renatofilho@754: "text", CHAN_ID_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), renatofilho@20: recordui->sch_column3); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->sch_column1, TRUE); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->sch_column2, TRUE); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->sch_column3, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->sch_column1, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->sch_column2, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->sch_column3, TRUE); renatofilho@754: // recordui->sch_column4 = renatofilho@754: // gtk_tree_view_column_new_with_attributes("", renatofilho@754: // recordui->sch_renderer, "text", END_TIME_COLUMN, NULL); renatofilho@754: // gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->sch_treeview), renatofilho@754: // recordui->sch_column4); renatofilho@20: renatofilho@754: recordui->sch_label = gtk_label_new(("Schedule")); renatofilho@754: gtk_notebook_set_tab_label(GTK_NOTEBOOK(recordui->notebook), renatofilho@754: gtk_notebook_get_nth_page(GTK_NOTEBOOK renatofilho@754: (recordui-> renatofilho@754: notebook), 0), renatofilho@754: recordui->sch_label); renatofilho@20: renatofilho@754: // Record items tab renatofilho@754: // g_object_set(G_OBJECT(renderer2), "foreground", "blue", NULL); renatofilho@754: recordui->rec_scrolled_window = gtk_scrolled_window_new(NULL, NULL); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->notebook), renatofilho@754: recordui->rec_scrolled_window); renatofilho@754: gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW renatofilho@754: (recordui->rec_scrolled_window), renatofilho@754: GTK_POLICY_AUTOMATIC, renatofilho@754: GTK_POLICY_AUTOMATIC); renatofilho@754: gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW renatofilho@754: (recordui->rec_scrolled_window), renatofilho@754: GTK_SHADOW_IN); renatofilho@20: renatofilho@754: recordui->rec_tree_store = renatofilho@754: gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, renatofilho@754: G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, renatofilho@754: G_TYPE_STRING); renatofilho@754: recordui->rec_treeview = renatofilho@754: gtk_tree_view_new_with_model(GTK_TREE_MODEL renatofilho@754: (recordui->rec_tree_store)); renatofilho@754: gtk_container_add(GTK_CONTAINER(recordui->rec_scrolled_window), renatofilho@754: recordui->rec_treeview); renatofilho@754: recordui->rec_renderer = gtk_cell_renderer_text_new(); renatofilho@754: // g_object_set(G_OBJECT(renderer1), "foreground", "green", renatofilho@754: // "background", "black", NULL); renatofilho@754: renatofilho@754: recordui->rec_column1 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Start time", renatofilho@754: recordui->rec_renderer, renatofilho@754: "text", START_DATE_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), renatofilho@20: recordui->rec_column1); renatofilho@754: recordui->rec_column2 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Title", renatofilho@754: recordui->rec_renderer, renatofilho@754: "text", TITLE_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), renatofilho@20: recordui->rec_column2); renatofilho@754: recordui->rec_column3 = renatofilho@754: gtk_tree_view_column_new_with_attributes("Channel", renatofilho@754: recordui->rec_renderer, renatofilho@754: "text", CHAN_ID_COLUMN, renatofilho@754: NULL); renatofilho@754: gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), renatofilho@20: recordui->rec_column3); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->rec_column1, TRUE); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->rec_column2, TRUE); renatofilho@754: gtk_tree_view_column_set_resizable(recordui->rec_column3, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->rec_column1, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->rec_column2, TRUE); renatofilho@754: gtk_tree_view_column_set_reorderable(recordui->rec_column3, TRUE); renatofilho@754: // recordui->rec_column4 = renatofilho@754: // gtk_tree_view_column_new_with_attributes("", renatofilho@754: // recordui->rec_renderer, "text", END_TIME_COLUMN, NULL); renatofilho@754: // gtk_tree_view_append_column(GTK_TREE_VIEW(recordui->rec_treeview), renatofilho@754: // recordui->rec_column4); renatofilho@20: renatofilho@754: recordui->rec_label = gtk_label_new(("Recorded")); renatofilho@754: gtk_notebook_set_tab_label(GTK_NOTEBOOK(recordui->notebook), renatofilho@754: gtk_notebook_get_nth_page(GTK_NOTEBOOK renatofilho@754: (recordui-> renatofilho@754: notebook), 1), renatofilho@754: recordui->rec_label); renatofilho@754: renatofilho@754: // Gets the mmyth scheduler manager renatofilho@754: recordui->scheduler = gmyth_scheduler_new(backend_info); renatofilho@754: renatofilho@754: /* renatofilho@754: * init connection to the backend renatofilho@754: */ renatofilho@754: gmyth_scheduler_connect(recordui->scheduler, renatofilho@754: recordui->scheduler->backend_info); renatofilho@754: renatofilho@754: return recordui; renatofilho@20: } renatofilho@20: renatofilho@20: void renatofilho@754: mmyth_recordui_free(MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: // FIXME: Release memory here! renatofilho@754: /* renatofilho@754: * close connection to the backend renatofilho@754: */ renatofilho@754: gmyth_scheduler_disconnect(recordui->scheduler); renatofilho@20: } renatofilho@20: renatofilho@20: void renatofilho@754: mmyth_recordui_delete_selected(GtkButton * button, renatofilho@754: MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: GtkTreeSelection *selection; renatofilho@754: GtkTreeModel *list_store; renatofilho@754: GtkTreeIter iter; renatofilho@754: int index; renatofilho@754: int curr_page = 0; renatofilho@20: renatofilho@754: curr_page = renatofilho@754: gtk_notebook_get_current_page(GTK_NOTEBOOK(recordui->notebook)); renatofilho@754: renatofilho@754: if (curr_page == 0) { renatofilho@754: selection = renatofilho@754: gtk_tree_view_get_selection(GTK_TREE_VIEW renatofilho@754: (recordui->sch_treeview)); renatofilho@754: if (selection != NULL) { renatofilho@754: gtk_tree_selection_get_selected(selection, &list_store, &iter); renatofilho@754: gtk_tree_model_get(list_store, &iter, RECORD_ID_COLUMN, &index, renatofilho@754: -1); renatofilho@754: gmyth_scheduler_delete_schedule(recordui->scheduler, index); renatofilho@754: mmyth_recordui_reload_schedule(recordui); renatofilho@754: return; renatofilho@754: } renatofilho@754: renatofilho@754: } else if (curr_page == 1) { renatofilho@754: selection = renatofilho@754: gtk_tree_view_get_selection(GTK_TREE_VIEW renatofilho@754: (recordui->rec_treeview)); renatofilho@754: if (selection != NULL) { renatofilho@754: gtk_tree_selection_get_selected(selection, &list_store, &iter); renatofilho@754: gtk_tree_model_get(list_store, &iter, RECORD_ID_COLUMN, &index, renatofilho@754: -1); renatofilho@754: gmyth_scheduler_delete_recorded(recordui->scheduler, index); renatofilho@754: mmyth_recordui_reload_record(recordui); renatofilho@754: return; renatofilho@754: } renatofilho@754: } renatofilho@754: renatofilho@754: g_warning("[%s] None element was removed from the list", __FUNCTION__); renatofilho@20: } renatofilho@20: renatofilho@754: /* renatofilho@754: * FIXME: change this function name, it is returning the basename_column renatofilho@754: * that represents the nuv filename of the recorded content renatofilho@754: */ renatofilho@754: gchar * renatofilho@754: mmyth_recordui_get_selected_recorded(MMythRecordUI * recordui) renatofilho@20: { renatofilho@754: GtkTreeSelection *selection = NULL; renatofilho@754: GtkTreeModel *list_store = NULL; renatofilho@754: GtkTreeIter iter; renatofilho@754: gchar *path = NULL; renatofilho@20: renatofilho@754: /* renatofilho@754: * returning nuv filename, basename_column renatofilho@754: */ renatofilho@754: selection = renatofilho@754: gtk_tree_view_get_selection(GTK_TREE_VIEW(recordui->rec_treeview)); renatofilho@754: if (gtk_tree_selection_get_selected(selection, &list_store, &iter)) { renatofilho@754: gtk_tree_model_get(list_store, &iter, BASENAME_COLUMN, &path, -1); renatofilho@754: } renatofilho@754: // FIXME: MOVE THIS TO OTHER PLACE renatofilho@754: return path; renatofilho@20: }