static void inventory_item_inserted(GwyInventory *inventory, guint pos, GtkTreeStore *store) { GrainValueStorePrivate *priv; GwyGrainValue *gvalue; GwyGrainValueGroup group; GtkTreeIter siter, iter; priv = g_object_get_qdata(G_OBJECT(store), priv_quark); g_return_if_fail(pos >= priv->user_start_pos); siter = priv->user_group_iter; gvalue = gwy_inventory_get_nth_item(inventory, pos); g_return_if_fail(GWY_IS_GRAIN_VALUE(gvalue)); group = gwy_grain_value_get_group(gvalue); g_return_if_fail(group == GWY_GRAIN_VALUE_GROUP_USER); gtk_tree_store_insert(store, &iter, &siter, pos - priv->user_start_pos); gtk_tree_store_set(store, &iter, GWY_GRAIN_VALUE_STORE_COLUMN_ITEM, gvalue, GWY_GRAIN_VALUE_STORE_COLUMN_GROUP, group, -1); }
static GPtrArray* calculate_all_grain_values(GwyDataField *dfield, GwyDataField *mask, guint *ngrains, gint **grains) { GwyGrainValue **gvalues; guint xres = dfield->xres, yres = dfield->yres, n, i; GwyInventory *inventory; GPtrArray *valuedata; *grains = g_new0(gint, xres*yres); *ngrains = gwy_data_field_number_grains(mask, *grains); inventory = gwy_grain_values(); n = gwy_inventory_get_n_items(inventory); valuedata = g_ptr_array_new(); g_ptr_array_set_size(valuedata, n); gvalues = g_new(GwyGrainValue*, n); for (i = 0; i < n; i++) { gvalues[i] = gwy_inventory_get_nth_item(inventory, i); g_ptr_array_index(valuedata, i) = g_new(gdouble, *ngrains + 1); } gwy_grain_values_calculate(n, gvalues, (gdouble**)valuedata->pdata, dfield, *ngrains, *grains); g_free(gvalues); return valuedata; }
/** * gwy_enum_combo_box_update_int: * @combo: A combo box which was created with gwy_enum_combo_box_new(). * @integer: Pointer to an integer to update to selected enum value. * * Convenience callback keeping an integer synchronized with selected enum * combo box value. **/ void gwy_enum_combo_box_update_int(GtkComboBox *combo, gint *integer) { GwyInventoryStore *store; const GwyEnum *item; gint i; i = gtk_combo_box_get_active(combo); store = GWY_INVENTORY_STORE(gtk_combo_box_get_model(combo)); g_return_if_fail(GWY_IS_INVENTORY_STORE(store)); item = gwy_inventory_get_nth_item(gwy_inventory_store_get_inventory(store), i); g_return_if_fail(item); *integer = item->value; }
/** * gwy_enum_combo_box_get_active: * @combo: A combo box which was created with gwy_enum_combo_box_new(). * * Gets the enum value corresponding to currently active combo box item. * * Returns: The selected enum value. **/ gint gwy_enum_combo_box_get_active(GtkComboBox *combo) { GwyInventoryStore *store; const GwyEnum *item; gint i; i = gtk_combo_box_get_active(combo); store = GWY_INVENTORY_STORE(gtk_combo_box_get_model(combo)); g_return_val_if_fail(GWY_IS_INVENTORY_STORE(store), -1); item = gwy_inventory_get_nth_item(gwy_inventory_store_get_inventory(store), i); g_return_val_if_fail(item, -1); return item->value; }
static GtkTreeModel* gwy_grain_value_tree_model_new(gboolean show_id) { GrainValueStorePrivate *priv; GwyInventory *inventory; GtkTreeStore *store; GtkTreeIter siter, iter; GwyGrainValue *gvalue; GwyGrainValueGroup group, lastgroup; guint i, j, n; if (!priv_quark) priv_quark = g_quark_from_static_string("gwy-grain-value-chooser-data"); priv = g_new0(GrainValueStorePrivate, 1); store = gtk_tree_store_new(3, GWY_TYPE_GRAIN_VALUE, GWY_TYPE_GRAIN_VALUE_GROUP, G_TYPE_BOOLEAN); g_object_set_qdata_full(G_OBJECT(store), priv_quark, priv, g_free); inventory = gwy_grain_values(); n = gwy_inventory_get_n_items(inventory); lastgroup = -1; for (i = j = 0; i < n; i++) { gvalue = gwy_inventory_get_nth_item(inventory, i); group = gwy_grain_value_get_group(gvalue); if (!show_id && group == GWY_GRAIN_VALUE_GROUP_ID) continue; if (group != lastgroup) { gtk_tree_store_insert_after(store, &siter, NULL, lastgroup != (GwyGrainValueGroup)-1 ? &siter : NULL); gtk_tree_store_set(store, &siter, GWY_GRAIN_VALUE_STORE_COLUMN_GROUP, group, -1); if (group == GWY_GRAIN_VALUE_GROUP_USER) { priv->user_group_iter = siter; priv->user_start_pos = i; } lastgroup = group; j = 0; } gtk_tree_store_insert_after(store, &iter, &siter, j ? &iter : NULL); gtk_tree_store_set(store, &iter, GWY_GRAIN_VALUE_STORE_COLUMN_ITEM, gvalue, GWY_GRAIN_VALUE_STORE_COLUMN_GROUP, group, -1); j++; } /* Ensure User branch is present, even if empty */ if (lastgroup != GWY_GRAIN_VALUE_GROUP_USER) { group = GWY_GRAIN_VALUE_GROUP_USER; gtk_tree_store_insert_after(store, &siter, NULL, i ? &siter : NULL); gtk_tree_store_set(store, &siter, GWY_GRAIN_VALUE_STORE_COLUMN_GROUP, group, -1); priv->user_group_iter = siter; priv->user_start_pos = i; } g_signal_connect(inventory, "item-updated", G_CALLBACK(inventory_item_updated), store); g_signal_connect(inventory, "item-inserted", G_CALLBACK(inventory_item_inserted), store); g_signal_connect(inventory, "item-deleted", G_CALLBACK(inventory_item_deleted), store); g_object_weak_ref(G_OBJECT(store), grain_value_store_finalized, inventory); return GTK_TREE_MODEL(store); }