/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * * Copyright (C) 2013, Guilhem Bonnefille * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "babel.h" #include "babel_ui.h" static void babel_ui_selector_add_entry_cb ( gpointer data, gpointer user_data ) { BabelFile *file = (BabelFile*)data; GtkWidget *combo = GTK_WIDGET(user_data); GList *formats = g_object_get_data ( G_OBJECT(combo), "formats" ); formats = g_list_append ( formats, file ); g_object_set_data ( G_OBJECT(combo), "formats", formats ); const gchar *label = file->label; vik_combo_box_text_append ( combo, label ); } void a_babel_ui_type_selector_dialog_sensitivity_cb ( GtkComboBox *widget, gpointer user_data ) { /* user_data is the GtkDialog */ GtkDialog *dialog = GTK_DIALOG(user_data); /* Retrieve the associated file format descriptor */ BabelFile *file = a_babel_ui_file_type_selector_get ( GTK_WIDGET(widget) ); if ( file ) /* Not NULL => valid selection */ gtk_dialog_set_response_sensitive ( dialog, GTK_RESPONSE_ACCEPT, TRUE ); else /* NULL => invalid selection */ gtk_dialog_set_response_sensitive ( dialog, GTK_RESPONSE_ACCEPT, FALSE ); } /** * a_babel_ui_file_type_selector_new: * @mode: the mode to filter the file types * * Create a file type selector. * * This widget relies on a combo box listing labels of file formats. * We store in the "data" of the GtkWidget a list with the BabelFile * entries, in order to retrieve the selected file format. * * Returns: a GtkWidget */ GtkWidget *a_babel_ui_file_type_selector_new ( BabelMode mode ) { GList *formats = NULL; /* Create the combo */ GtkWidget * combo = vik_combo_box_text_new (); /* Add a first label to invite user to select a file format */ /* We store a NULL pointer to distinguish this entry */ formats = g_list_append ( formats, NULL ); vik_combo_box_text_append ( combo, _("Select a file format") ); /* Prepare space for file format list */ g_object_set_data ( G_OBJECT(combo), "formats", formats ); /* Add all known and compatible file formats */ a_babel_foreach_file_with_mode ( mode, babel_ui_selector_add_entry_cb, combo ); /* Initialize the selection with the really first entry */ gtk_combo_box_set_active ( GTK_COMBO_BOX(combo), 0 ); return combo; } /** * a_babel_ui_file_type_selector_destroy: * @selector: the selector to destroy * * Destroy the selector and any related data. */ void a_babel_ui_file_type_selector_destroy ( GtkWidget *selector ) { GList *formats = g_object_get_data ( G_OBJECT(selector), "formats" ); g_free ( formats ); } /** * a_babel_ui_file_type_selector_get: * @selector: the selector * * Retrieve the selected file type. * * Returns: the selected BabelFile or NULL */ BabelFile *a_babel_ui_file_type_selector_get ( GtkWidget *selector ) { gint active = gtk_combo_box_get_active ( GTK_COMBO_BOX(selector) ); if (active >= 0) { GList *formats = g_object_get_data ( G_OBJECT(selector), "formats" ); return (BabelFile*)g_list_nth_data ( formats, active ); } else { return NULL; } } /** * a_babel_ui_modes_new: * @tracks: * @routes: * @waypoints: * * Creates a selector for babel modes. * This selector is based on 3 checkboxes. * * Returns: a GtkWidget packing all checkboxes. */ GtkWidget *a_babel_ui_modes_new ( gboolean tracks, gboolean routes, gboolean waypoints ) { GtkWidget *hbox = gtk_hbox_new( FALSE, 0 ); GtkWidget *button = NULL; button = gtk_check_button_new_with_label ( _("Tracks") ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(button), tracks ); gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); gtk_widget_show ( button ); button = gtk_check_button_new_with_label ( _("Routes") ); gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(button), routes ); gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); gtk_widget_show ( button ); button = gtk_check_button_new_with_label ( _("Waypoints") ); gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON(button), waypoints ); gtk_box_pack_start ( GTK_BOX(hbox), button, TRUE, TRUE, 0 ); gtk_widget_show ( button ); return hbox; } /** * a_babel_ui_modes_get: * @container: * @tracks: return value * @routes: return value * @waypoints: return value * * Retrieve state of checkboxes. */ void a_babel_ui_modes_get ( GtkWidget *container, gboolean *tracks, gboolean *routes, gboolean *waypoints ) { GList* children = gtk_container_get_children ( GTK_CONTAINER(container) ); GtkWidget *child = NULL; child = g_list_nth_data ( children, 0 ); *tracks = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); child = g_list_nth_data ( children, 1 ); *routes = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); child = g_list_nth_data ( children, 2 ); *waypoints = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON(child) ); }