static RutObject * create_widget_for_property (RutContext *context, RutProperty *prop, RutProperty **control_prop, const char **label_text) { const RutPropertySpec *spec = prop->spec; const char *name; RutText *label; *label_text = NULL; if (spec->nick) name = spec->nick; else name = spec->name; switch ((RutPropertyType) spec->type) { case RUT_PROPERTY_TYPE_BOOLEAN: { char *unselected_icon = rut_find_data_file ("toggle-unselected.png"); char *selected_icon = rut_find_data_file ("toggle-selected.png"); RutToggle *toggle = rut_toggle_new_with_icons (context, unselected_icon, selected_icon, name); *control_prop = rut_introspectable_lookup_property (toggle, "state"); return toggle; } case RUT_PROPERTY_TYPE_VEC3: { RutVec3Slider *slider = rut_vec3_slider_new (context); float min = -G_MAXFLOAT, max = G_MAXFLOAT; if ((spec->flags & RUT_PROPERTY_FLAG_VALIDATE)) { const RutPropertyValidationVec3 *validation = &spec->validation.vec3_range; min = validation->min; max = validation->max; } rut_vec3_slider_set_min_value (slider, min); rut_vec3_slider_set_max_value (slider, max); rut_vec3_slider_set_decimal_places (slider, 2); *control_prop = rut_introspectable_lookup_property (slider, "value"); return slider; } case RUT_PROPERTY_TYPE_QUATERNION: { RutRotationInspector *inspector = rut_rotation_inspector_new (context); *control_prop = rut_introspectable_lookup_property (inspector, "value"); return inspector; } case RUT_PROPERTY_TYPE_DOUBLE: case RUT_PROPERTY_TYPE_FLOAT: case RUT_PROPERTY_TYPE_INTEGER: { RutNumberSlider *slider = rut_number_slider_new (context); float min = -G_MAXFLOAT, max = G_MAXFLOAT; char *label = g_strconcat (name, ": ", NULL); rut_number_slider_set_markup_label (slider, label); g_free (label); if (spec->type == RUT_PROPERTY_TYPE_INTEGER) { rut_number_slider_set_decimal_places (slider, 0); rut_number_slider_set_step (slider, 1.0); if ((spec->flags & RUT_PROPERTY_FLAG_VALIDATE)) { const RutPropertyValidationInteger *validation = &spec->validation.int_range; min = validation->min; max = validation->max; } } else { rut_number_slider_set_decimal_places (slider, 2); rut_number_slider_set_step (slider, 0.1); if ((spec->flags & RUT_PROPERTY_FLAG_VALIDATE)) { const RutPropertyValidationFloat *validation = &spec->validation.float_range; min = validation->min; max = validation->max; } } rut_number_slider_set_min_value (slider, min); rut_number_slider_set_max_value (slider, max); *control_prop = rut_introspectable_lookup_property (slider, "value"); return slider; } case RUT_PROPERTY_TYPE_ENUM: /* If the enum isn't validated then we can't get the value * names so we can't make a useful control */ if ((spec->flags & RUT_PROPERTY_FLAG_VALIDATE)) { RutDropDown *drop = rut_drop_down_new (context); int n_values, i; const RutUIEnum *ui_enum = spec->validation.ui_enum; RutDropDownValue *values; for (n_values = 0; ui_enum->values[n_values].nick; n_values++); values = g_alloca (sizeof (RutDropDownValue) * n_values); for (i = 0; i < n_values; i++) { values[i].name = (ui_enum->values[i].blurb ? ui_enum->values[i].blurb : ui_enum->values[i].nick); values[i].value = ui_enum->values[i].value; } rut_drop_down_set_values_array (drop, values, n_values); *control_prop = rut_introspectable_lookup_property (drop, "value"); *label_text = name; return drop; } break; case RUT_PROPERTY_TYPE_TEXT: { RutEntry *entry = rut_entry_new (context); RutText *text = rut_entry_get_text (entry); rut_text_set_single_line_mode (text, TRUE); *control_prop = rut_introspectable_lookup_property (text, "text"); *label_text = name; return entry; } break; case RUT_PROPERTY_TYPE_COLOR: { RutColorButton *button = rut_color_button_new (context); *control_prop = rut_introspectable_lookup_property (button, "color"); *label_text = name; return button; } break; case RUT_PROPERTY_TYPE_ASSET: { RutAssetInspector *asset_inspector = rut_asset_inspector_new (context, spec->validation.asset.type); *control_prop = rut_introspectable_lookup_property (asset_inspector, "asset"); *label_text = name; return asset_inspector; } break; default: break; } label = rut_text_new (context); rut_text_set_text (label, name); *control_prop = NULL; return label; }
static RutAsset * rut_asset_new_full (RutContext *ctx, const char *path, RutAssetType type) { RutAsset *asset = g_slice_new0 (RutAsset); const char *real_path; char *full_path; #ifndef __ANDROID__ if (type == RUT_ASSET_TYPE_BUILTIN) { full_path = rut_find_data_file (path); if (full_path == NULL) full_path = g_strdup (path); } else full_path = g_build_filename (ctx->assets_location, path, NULL); real_path = full_path; #else real_path = path; #endif asset->ref_count = 1; asset->ctx = ctx; asset->type = type; switch (type) { case RUT_ASSET_TYPE_BUILTIN: case RUT_ASSET_TYPE_TEXTURE: case RUT_ASSET_TYPE_NORMAL_MAP: case RUT_ASSET_TYPE_ALPHA_MASK: { CoglError *error = NULL; asset->texture = rut_load_texture (ctx, real_path, &error); if (!asset->texture) { g_slice_free (RutAsset, asset); g_warning ("Failed to load asset texture: %s", error->message); cogl_error_free (error); asset = NULL; goto DONE; } break; } case RUT_ASSET_TYPE_PLY_MODEL: { RutPLYAttributeStatus padding_status[G_N_ELEMENTS (ply_attributes)]; GError *error = NULL; asset->mesh = rut_mesh_new_from_ply (ctx, real_path, ply_attributes, G_N_ELEMENTS (ply_attributes), padding_status, &error); if (!asset->mesh) { g_slice_free (RutAsset, asset); g_warning ("could not load model %s: %s", path, error->message); g_error_free (error); asset = NULL; goto DONE; } break; } } asset->path = g_strdup (path); rut_object_init (&asset->_parent, &rut_asset_type); //rut_simple_introspectable_init (asset); DONE: #ifndef __ANDROID__ g_free (full_path); #endif return asset; }