void gnc_combott_set_active (GncCombott *combott, gint index) { GncCombottPrivate *priv; GtkTreeIter iter; gboolean valid = TRUE; gint active = 1; g_return_if_fail (GNC_IS_COMBOTT (combott)); g_return_if_fail (index >= -1); priv = GNC_COMBOTT_GET_PRIVATE (combott); /* Do we have a valid model */ if (priv->model != NULL) { /* Is index the same as current option */ if(index + 1 != priv->active) { /* Set button label to blank for no selection */ if(index == -1) { priv->active = 0; gtk_label_set_text(GTK_LABEL(priv->label), ""); g_signal_emit (combott, combott_signals[CHANGED], 0); } else { /* Get the corresponding entry in the list store */ valid = gtk_tree_model_get_iter_first (priv->model, &iter); while (valid) { /* Walk through the list, reading each row */ gchar *str_data; gchar *tip_data; /* Make sure you terminate calls to gtk_tree_model_get() * with a '-1' value */ gtk_tree_model_get (priv->model, &iter, priv->text_col, &str_data, priv->tip_col, &tip_data, -1); if(index + 1 == active) { priv->active = index + 1; priv->active_iter = iter; gtk_label_set_text(GTK_LABEL(priv->label), str_data); gnc_label_set_alignment (priv->label, 0, 0.5); g_signal_emit (combott, combott_signals[CHANGED], 0); } g_free (str_data); g_free (tip_data); active ++; valid = gtk_tree_model_iter_next (priv->model, &iter); } } } } }
static void gctt_refresh_menu (GncCombott *combott, GtkTreeModel *model) { g_return_if_fail (GNC_IS_COMBOTT (combott)); g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model)); gctt_rebuild_menu(combott, model); }
static void gctt_refresh_menu (GncCombott *combott, GtkTreeModel *model) { GncCombottPrivate *priv; g_return_if_fail (GNC_IS_COMBOTT (combott)); g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model)); priv = GNC_COMBOTT_GET_PRIVATE (combott); gctt_rebuild_menu(combott, model); }
gint gnc_combott_get_active (GncCombott *combott) { GncCombottPrivate *priv; gint result; g_return_val_if_fail (GNC_IS_COMBOTT (combott), 0); priv = GNC_COMBOTT_GET_PRIVATE (combott); result = priv->active - 1; return result; }
static void gctt_finalize (GObject *object) { GncCombott *combott; GncCombottPrivate *priv; g_return_if_fail (object != NULL); g_return_if_fail (GNC_IS_COMBOTT (object)); combott = GNC_COMBOTT (object); priv = GNC_COMBOTT_GET_PRIVATE (combott); if (priv->model) { priv->model = NULL; } if (priv->menu) { priv->menu = NULL; } G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gctt_rebuild_menu (GncCombott *combott, GtkTreeModel *model) { GncCombottPrivate *priv; GtkTreeIter iter; GtkWidget *menu_items; gboolean valid; gint num = 1; gint items = 0; g_return_if_fail (GNC_IS_COMBOTT (combott)); g_return_if_fail (model == NULL || GTK_IS_TREE_MODEL (model)); priv = GNC_COMBOTT_GET_PRIVATE (combott); priv->menu = NULL; priv->menu = gtk_menu_new(); valid = gtk_tree_model_get_iter_first (model, &iter); while (valid) { GtkWidget *label; /* Walk through the list, reading each row */ gchar *str_data; gchar *tip_data; gtk_tree_model_get (model, &iter, priv->text_col, &str_data, priv->tip_col, &tip_data, -1); /* Create a new menu-item with a name... */ menu_items = gtk_menu_item_new_with_label (str_data); /* Get widget width to max number of characters in list */ if(strlen(str_data) > num) num = strlen(str_data); /* Add the tooltip to the child label */ label = gtk_bin_get_child(GTK_BIN(menu_items)); gtk_widget_set_tooltip_text (label, tip_data); gtk_misc_set_alignment (GTK_MISC(label), 0, 0.5); /* ...and add it to the menu. */ gtk_menu_shell_append (GTK_MENU_SHELL (priv->menu), menu_items); g_signal_connect (menu_items, "activate", G_CALLBACK (menuitem_response_cb), combott); /* Show the widget */ gtk_widget_show (menu_items); g_free (str_data); g_free (tip_data); items++; valid = gtk_tree_model_iter_next (model, &iter); } g_signal_connect(G_OBJECT(priv->menu), "size-allocate", G_CALLBACK(menu_getsize_cb), combott); /* Set widget width to max number of characters in list */ priv->max_number_char = num; gtk_label_set_width_chars(GTK_LABEL(priv->label), priv->max_number_char); priv->num_items = items; }