Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/screen/screen_context.c
| Show All 28 Lines | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "DNA_armature_types.h" | #include "DNA_armature_types.h" | ||||
| #include "DNA_brush_types.h" | |||||
| #include "DNA_gpencil_types.h" | #include "DNA_gpencil_types.h" | ||||
| #include "DNA_sequence_types.h" | #include "DNA_sequence_types.h" | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "DNA_screen_types.h" | #include "DNA_screen_types.h" | ||||
| #include "DNA_space_types.h" | #include "DNA_space_types.h" | ||||
| #include "DNA_windowmanager_types.h" | #include "DNA_windowmanager_types.h" | ||||
| #include "DNA_workspace_types.h" | #include "DNA_workspace_types.h" | ||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BKE_brush.h" | |||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_object.h" | #include "BKE_object.h" | ||||
| #include "BKE_action.h" | #include "BKE_action.h" | ||||
| #include "BKE_armature.h" | #include "BKE_armature.h" | ||||
| #include "BKE_paint.h" | |||||
| #include "BKE_main.h" | |||||
| #include "BKE_gpencil.h" | #include "BKE_gpencil.h" | ||||
| #include "BKE_layer.h" | #include "BKE_layer.h" | ||||
| #include "BKE_screen.h" | #include "BKE_screen.h" | ||||
| #include "BKE_sequencer.h" | #include "BKE_sequencer.h" | ||||
| #include "BKE_workspace.h" | #include "BKE_workspace.h" | ||||
| #include "DEG_depsgraph.h" | #include "DEG_depsgraph.h" | ||||
| Show All 16 Lines | const char *screen_context_dir[] = { | ||||
| "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", | "visible_bones", "editable_bones", "selected_bones", "selected_editable_bones", | ||||
| "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", | "visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone", | ||||
| "active_base", "active_object", "object", "edit_object", | "active_base", "active_object", "object", "edit_object", | ||||
| "sculpt_object", "vertex_paint_object", "weight_paint_object", | "sculpt_object", "vertex_paint_object", "weight_paint_object", | ||||
| "image_paint_object", "particle_edit_object", | "image_paint_object", "particle_edit_object", | ||||
| "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */ | "sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */ | ||||
| "gpencil_data", "gpencil_data_owner", /* grease pencil data */ | "gpencil_data", "gpencil_data_owner", /* grease pencil data */ | ||||
| "visible_gpencil_layers", "editable_gpencil_layers", "editable_gpencil_strokes", | "visible_gpencil_layers", "editable_gpencil_layers", "editable_gpencil_strokes", | ||||
| "active_gpencil_layer", "active_gpencil_frame", "active_gpencil_palette", | "active_gpencil_layer", "active_gpencil_frame", "active_gpencil_brush", | ||||
| "active_gpencil_palettecolor", "active_gpencil_brush", | |||||
| "active_operator", "selected_editable_fcurves", | "active_operator", "selected_editable_fcurves", | ||||
| NULL}; | NULL}; | ||||
| int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result) | int ed_screen_context(const bContext *C, const char *member, bContextDataResult *result) | ||||
| { | { | ||||
| wmWindow *win = CTX_wm_window(C); | wmWindow *win = CTX_wm_window(C); | ||||
| bScreen *sc = CTX_wm_screen(C); | bScreen *sc = CTX_wm_screen(C); | ||||
| ScrArea *sa = CTX_wm_area(C); | ScrArea *sa = CTX_wm_area(C); | ||||
| ▲ Show 20 Lines • Show All 370 Lines • ▼ Show 20 Lines | if (ed) { | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "gpencil_data")) { | else if (CTX_data_equals(member, "gpencil_data")) { | ||||
| /* FIXME: for some reason, CTX_data_active_object(C) returns NULL when called from these situations | /* FIXME: for some reason, CTX_data_active_object(C) returns NULL when called from these situations | ||||
| * (as outlined above - see Campbell's #ifdefs). That causes the get_active function to fail when | * (as outlined above - see Campbell's #ifdefs). That causes the get_active function to fail when | ||||
| * called from context. For that reason, we end up using an alternative where we pass everything in! | * called from context. For that reason, we end up using an alternative where we pass everything in! | ||||
| */ | */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| if (gpd) { | if (gpd) { | ||||
| CTX_data_id_pointer_set(result, &gpd->id); | CTX_data_id_pointer_set(result, &gpd->id); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "gpencil_data_owner")) { | else if (CTX_data_equals(member, "gpencil_data_owner")) { | ||||
| /* pointer to which data/datablock owns the reference to the Grease Pencil data being used (as gpencil_data) | /* pointer to which data/datablock owns the reference to the Grease Pencil data being used (as gpencil_data) | ||||
| * XXX: see comment for gpencil_data case... | * XXX: see comment for gpencil_data case... | ||||
| */ | */ | ||||
| bGPdata **gpd_ptr = NULL; | bGPdata **gpd_ptr = NULL; | ||||
| PointerRNA ptr; | PointerRNA ptr; | ||||
| /* get pointer to Grease Pencil Data */ | /* get pointer to Grease Pencil Data */ | ||||
| gpd_ptr = ED_gpencil_data_get_pointers_direct((ID *)sc, scene, sa, obact, &ptr); | gpd_ptr = ED_gpencil_data_get_pointers_direct((ID *)sc, sa, obact, &ptr); | ||||
| if (gpd_ptr) { | if (gpd_ptr) { | ||||
| CTX_data_pointer_set(result, ptr.id.data, ptr.type, ptr.data); | CTX_data_pointer_set(result, ptr.id.data, ptr.type, ptr.data); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "active_gpencil_layer")) { | else if (CTX_data_equals(member, "active_gpencil_layer")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | /* XXX: see comment for gpencil_data case... */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| if (gpd) { | if (gpd) { | ||||
| bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); | bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); | ||||
| if (gpl) { | if (gpl) { | ||||
| CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilLayer, gpl); | CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilLayer, gpl); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "active_gpencil_palette")) { | |||||
| /* XXX: see comment for gpencil_data case... */ | |||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | |||||
| if (gpd) { | |||||
| bGPDpalette *palette = BKE_gpencil_palette_getactive(gpd); | |||||
| if (palette) { | |||||
| CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilPalette, palette); | |||||
| return 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| else if (CTX_data_equals(member, "active_gpencil_palettecolor")) { | |||||
| /* XXX: see comment for gpencil_data case... */ | |||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | |||||
| if (gpd) { | |||||
| bGPDpalette *palette = BKE_gpencil_palette_getactive(gpd); | |||||
| if (palette) { | |||||
| bGPDpalettecolor *palcolor = BKE_gpencil_palettecolor_getactive(palette); | |||||
| if (palcolor) { | |||||
| CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilPaletteColor, palcolor); | |||||
| return 1; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| else if (CTX_data_equals(member, "active_gpencil_brush")) { | else if (CTX_data_equals(member, "active_gpencil_brush")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | Brush *brush = BKE_brush_getactive_gpencil(scene->toolsettings); | ||||
| bGPDbrush *brush = BKE_gpencil_brush_getactive(scene->toolsettings); | |||||
| if (brush) { | if (brush) { | ||||
| CTX_data_pointer_set(result, &scene->id, &RNA_GPencilBrush, brush); | CTX_data_pointer_set(result, &scene->id, &RNA_Brush, brush); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "active_gpencil_frame")) { | else if (CTX_data_equals(member, "active_gpencil_frame")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | /* XXX: see comment for gpencil_data case... */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| if (gpd) { | if (gpd) { | ||||
| bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); | bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); | ||||
| if (gpl) { | if (gpl) { | ||||
| CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilLayer, gpl->actframe); | CTX_data_pointer_set(result, &gpd->id, &RNA_GPencilLayer, gpl->actframe); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "visible_gpencil_layers")) { | else if (CTX_data_equals(member, "visible_gpencil_layers")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | /* XXX: see comment for gpencil_data case... */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| if (gpd) { | if (gpd) { | ||||
| bGPDlayer *gpl; | bGPDlayer *gpl; | ||||
| for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | ||||
| if ((gpl->flag & GP_LAYER_HIDE) == 0) { | if ((gpl->flag & GP_LAYER_HIDE) == 0) { | ||||
| CTX_data_list_add(result, &gpd->id, &RNA_GPencilLayer, gpl); | CTX_data_list_add(result, &gpd->id, &RNA_GPencilLayer, gpl); | ||||
| } | } | ||||
| } | } | ||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "editable_gpencil_layers")) { | else if (CTX_data_equals(member, "editable_gpencil_layers")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | /* XXX: see comment for gpencil_data case... */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| if (gpd) { | if (gpd) { | ||||
| bGPDlayer *gpl; | bGPDlayer *gpl; | ||||
| for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | ||||
| if (gpencil_layer_is_editable(gpl)) { | if (gpencil_layer_is_editable(gpl)) { | ||||
| CTX_data_list_add(result, &gpd->id, &RNA_GPencilLayer, gpl); | CTX_data_list_add(result, &gpd->id, &RNA_GPencilLayer, gpl); | ||||
| } | } | ||||
| } | } | ||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "editable_gpencil_strokes")) { | else if (CTX_data_equals(member, "editable_gpencil_strokes")) { | ||||
| /* XXX: see comment for gpencil_data case... */ | /* XXX: see comment for gpencil_data case... */ | ||||
| bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, scene, sa, obact); | bGPdata *gpd = ED_gpencil_data_get_active_direct((ID *)sc, sa, obact); | ||||
| bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd); | |||||
| if (gpd) { | if (gpd) { | ||||
| bGPDlayer *gpl; | bGPDlayer *gpl; | ||||
| for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { | ||||
| if (gpencil_layer_is_editable(gpl) && (gpl->actframe)) { | if (gpencil_layer_is_editable(gpl) && (gpl->actframe)) { | ||||
| bGPDframe *gpf = gpl->actframe; | bGPDframe *gpf; | ||||
| bGPDstroke *gps; | bGPDstroke *gps; | ||||
| bGPDframe *init_gpf = gpl->actframe; | |||||
| if (is_multiedit) { | |||||
| init_gpf = gpl->frames.first; | |||||
| } | |||||
| for (gpf = init_gpf; gpf; gpf = gpf->next) { | |||||
| if ((gpf == gpl->actframe) || ((gpf->flag & GP_FRAME_SELECT) && (is_multiedit))) { | |||||
| for (gps = gpf->strokes.first; gps; gps = gps->next) { | for (gps = gpf->strokes.first; gps; gps = gps->next) { | ||||
| if (ED_gpencil_stroke_can_use_direct(sa, gps)) { | if (ED_gpencil_stroke_can_use_direct(sa, gps)) { | ||||
| /* check if the color is editable */ | /* check if the color is editable */ | ||||
| if (ED_gpencil_stroke_color_use(gpl, gps) == false) { | if (ED_gpencil_stroke_color_use(obact, gpl, gps) == false) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| CTX_data_list_add(result, &gpd->id, &RNA_GPencilStroke, gps); | CTX_data_list_add(result, &gpd->id, &RNA_GPencilStroke, gps); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* if not multiedit out of loop */ | |||||
| if (!is_multiedit) { | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); | ||||
| return 1; | return 1; | ||||
| } | } | ||||
| } | } | ||||
| else if (CTX_data_equals(member, "active_operator")) { | else if (CTX_data_equals(member, "active_operator")) { | ||||
| wmOperator *op = NULL; | wmOperator *op = NULL; | ||||
| ▲ Show 20 Lines • Show All 49 Lines • Show Last 20 Lines | |||||