Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/animation/anim_markers.c
| Show First 20 Lines • Show All 222 Lines • ▼ Show 20 Lines | for (marker = markers->first; marker; marker = marker->next) { | ||||
| } | } | ||||
| } | } | ||||
| /* set the min/max values */ | /* set the min/max values */ | ||||
| *first = min; | *first = min; | ||||
| *last = max; | *last = max; | ||||
| } | } | ||||
| static bool region_position_is_over_marker(View2D *v2d, ListBase *markers, float region_x) | |||||
| { | |||||
| if (markers == NULL || BLI_listbase_is_empty(markers)) { | |||||
| return false; | |||||
| } | |||||
| float frame_at_position = UI_view2d_region_to_view_x(v2d, region_x); | |||||
| TimeMarker *nearest_marker = ED_markers_find_nearest_marker(markers, frame_at_position); | |||||
| float pixel_distance = UI_view2d_scale_get_x(v2d) * | |||||
| fabsf(nearest_marker->frame - frame_at_position); | |||||
| return pixel_distance <= UI_DPI_ICON_SIZE; | |||||
| } | |||||
| /* --------------------------------- */ | /* --------------------------------- */ | ||||
| /* Adds a marker to list of cfra elems */ | /* Adds a marker to list of cfra elems */ | ||||
| static void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel) | static void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel) | ||||
| { | { | ||||
| CfraElem *ce, *cen; | CfraElem *ce, *cen; | ||||
| /* should this one only be considered if it is selected? */ | /* should this one only be considered if it is selected? */ | ||||
| ▲ Show 20 Lines • Show All 589 Lines • ▼ Show 20 Lines | static void ed_marker_move_exit(bContext *C, wmOperator *op) | ||||
| op->customdata = NULL; | op->customdata = NULL; | ||||
| /* clear custom header prints */ | /* clear custom header prints */ | ||||
| ED_area_status_text(CTX_wm_area(C), NULL); | ED_area_status_text(CTX_wm_area(C), NULL); | ||||
| } | } | ||||
| static int ed_marker_move_invoke(bContext *C, wmOperator *op, const wmEvent *event) | static int ed_marker_move_invoke(bContext *C, wmOperator *op, const wmEvent *event) | ||||
| { | { | ||||
| bool tweak = RNA_boolean_get(op->ptr, "tweak"); | |||||
| if (tweak) { | |||||
| ARegion *ar = CTX_wm_region(C); | |||||
| View2D *v2d = &ar->v2d; | |||||
| ListBase *markers = ED_context_get_markers(C); | |||||
| if (!region_position_is_over_marker(v2d, markers, event->x - ar->winrct.xmin)) { | |||||
| return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; | |||||
| } | |||||
| } | |||||
| if (ed_marker_move_init(C, op)) { | if (ed_marker_move_init(C, op)) { | ||||
| MarkerMove *mm = op->customdata; | MarkerMove *mm = op->customdata; | ||||
| mm->evtx = event->x; | mm->evtx = event->x; | ||||
| mm->firstx = event->x; | mm->firstx = event->x; | ||||
| mm->event_type = event->type; | mm->event_type = event->type; | ||||
| /* add temp handler */ | /* add temp handler */ | ||||
| ▲ Show 20 Lines • Show All 168 Lines • ▼ Show 20 Lines | static void MARKER_OT_move(wmOperatorType *ot) | ||||
| ot->poll = ed_markers_poll_selected_no_locked_markers; | ot->poll = ed_markers_poll_selected_no_locked_markers; | ||||
| ot->cancel = ed_marker_move_cancel; | ot->cancel = ed_marker_move_cancel; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING | OPTYPE_GRAB_CURSOR_XY; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING | OPTYPE_GRAB_CURSOR_XY; | ||||
| /* rna storage */ | /* rna storage */ | ||||
| RNA_def_int(ot->srna, "frames", 0, INT_MIN, INT_MAX, "Frames", "", INT_MIN, INT_MAX); | RNA_def_int(ot->srna, "frames", 0, INT_MIN, INT_MAX, "Frames", "", INT_MIN, INT_MAX); | ||||
| PropertyRNA *prop = RNA_def_boolean( | |||||
| ot->srna, "tweak", 0, "Tweak", "Operator has been activated using a tweak event"); | |||||
| RNA_def_property_flag(prop, PROP_SKIP_SAVE); | |||||
| } | } | ||||
| /* ************************** duplicate markers *************************** */ | /* ************************** duplicate markers *************************** */ | ||||
| /* operator state vars used: | /* operator state vars used: | ||||
| * frs: delta movement | * frs: delta movement | ||||
| * | * | ||||
| * functions: | * functions: | ||||
| ▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | static void MARKER_OT_duplicate(wmOperatorType *ot) | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* rna storage */ | /* rna storage */ | ||||
| RNA_def_int(ot->srna, "frames", 0, INT_MIN, INT_MAX, "Frames", "", INT_MIN, INT_MAX); | RNA_def_int(ot->srna, "frames", 0, INT_MIN, INT_MAX, "Frames", "", INT_MIN, INT_MAX); | ||||
| } | } | ||||
| /* ************************** selection ************************************/ | /* ************************** selection ************************************/ | ||||
| static void deselect_markers(ListBase *markers) | |||||
| { | |||||
| for (TimeMarker *marker = markers->first; marker; marker = marker->next) { | |||||
| marker->flag &= ~SELECT; | |||||
| } | |||||
| } | |||||
| /* select/deselect TimeMarker at current frame */ | /* select/deselect TimeMarker at current frame */ | ||||
| static void select_timeline_marker_frame(ListBase *markers, int frame, bool extend) | static void select_timeline_marker_frame(ListBase *markers, int frame, bool extend) | ||||
| { | { | ||||
| TimeMarker *marker, *marker_first = NULL; | TimeMarker *marker, *marker_first = NULL; | ||||
| /* support for selection cycling */ | /* support for selection cycling */ | ||||
| for (marker = markers->first; marker; marker = marker->next) { | for (marker = markers->first; marker; marker = marker->next) { | ||||
| if (marker->frame == frame) { | if (marker->frame == frame) { | ||||
| if (marker->flag & SELECT) { | if (marker->flag & SELECT) { | ||||
| marker_first = marker->next; | marker_first = marker->next; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* if extend is not set, then deselect markers */ | /* if extend is not set, then deselect markers */ | ||||
| if (extend == false) { | if (extend == false) { | ||||
| for (marker = markers->first; marker; marker = marker->next) { | deselect_markers(markers); | ||||
| marker->flag &= ~SELECT; | |||||
| } | |||||
| } | } | ||||
| LISTBASE_CIRCULAR_FORWARD_BEGIN (markers, marker, marker_first) { | LISTBASE_CIRCULAR_FORWARD_BEGIN (markers, marker, marker_first) { | ||||
| /* this way a not-extend select will always give 1 selected marker */ | /* this way a not-extend select will always give 1 selected marker */ | ||||
| if (marker->frame == frame) { | if (marker->frame == frame) { | ||||
| marker->flag ^= SELECT; | marker->flag ^= SELECT; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| LISTBASE_CIRCULAR_FORWARD_END(markers, marker, marker_first); | LISTBASE_CIRCULAR_FORWARD_END(markers, marker, marker_first); | ||||
| } | } | ||||
| static int ed_marker_select(bContext *C, const wmEvent *event, bool extend, bool camera) | static void select_marker_camera_switch( | ||||
| bContext *C, bool camera, bool extend, ListBase *markers, int cfra) | |||||
| { | { | ||||
| ListBase *markers = ED_context_get_markers(C); | |||||
| ARegion *ar = CTX_wm_region(C); | |||||
| View2D *v2d = UI_view2d_fromcontext(C); | |||||
| float viewx; | |||||
| int x, cfra; | |||||
| if (markers == NULL) { | |||||
| return OPERATOR_PASS_THROUGH; | |||||
| } | |||||
| x = event->x - ar->winrct.xmin; | |||||
| viewx = UI_view2d_region_to_view_x(v2d, x); | |||||
| cfra = ED_markers_find_nearest_marker_time(markers, viewx); | |||||
| select_timeline_marker_frame(markers, cfra, extend); | |||||
| #ifdef DURIAN_CAMERA_SWITCH | #ifdef DURIAN_CAMERA_SWITCH | ||||
| if (camera) { | if (camera) { | ||||
| Scene *scene = CTX_data_scene(C); | Scene *scene = CTX_data_scene(C); | ||||
| ViewLayer *view_layer = CTX_data_view_layer(C); | ViewLayer *view_layer = CTX_data_view_layer(C); | ||||
| Base *base; | Base *base; | ||||
| TimeMarker *marker; | TimeMarker *marker; | ||||
| int sel = 0; | int sel = 0; | ||||
| if (!extend) { | if (!extend) { | ||||
| Show All 22 Lines | if (camera) { | ||||
| } | } | ||||
| DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); | DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); | ||||
| WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); | WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); | ||||
| } | } | ||||
| #else | #else | ||||
| (void)camera; | (void)camera; | ||||
| #endif | #endif | ||||
| } | |||||
| static int ed_marker_select(bContext *C, const wmEvent *event, bool extend, bool camera) | |||||
| { | |||||
| ListBase *markers = ED_context_get_markers(C); | |||||
| ARegion *ar = CTX_wm_region(C); | |||||
| View2D *v2d = UI_view2d_fromcontext(C); | |||||
| float mouse_region_x = event->x - ar->winrct.xmin; | |||||
| if (region_position_is_over_marker(v2d, markers, mouse_region_x)) { | |||||
| float frame_at_mouse_position = UI_view2d_region_to_view_x(v2d, mouse_region_x); | |||||
| int cfra = ED_markers_find_nearest_marker_time(markers, frame_at_mouse_position); | |||||
| select_timeline_marker_frame(markers, cfra, extend); | |||||
| select_marker_camera_switch(C, camera, extend, markers, cfra); | |||||
| } | |||||
| else { | |||||
| deselect_markers(markers); | |||||
| } | |||||
| WM_event_add_notifier(C, NC_SCENE | ND_MARKERS, NULL); | WM_event_add_notifier(C, NC_SCENE | ND_MARKERS, NULL); | ||||
| WM_event_add_notifier(C, NC_ANIMATION | ND_MARKERS, NULL); | WM_event_add_notifier(C, NC_ANIMATION | ND_MARKERS, NULL); | ||||
| /* allowing tweaks, but needs OPERATOR_FINISHED, otherwise renaming fails... [#25987] */ | /* allowing tweaks, but needs OPERATOR_FINISHED, otherwise renaming fails... [#25987] */ | ||||
| return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH; | return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
| * adds modal handler | * adds modal handler | ||||
| * | * | ||||
| * modal() default WM function | * modal() default WM function | ||||
| * accept modal events while doing it, calls exec(), handles ESC and border drawing | * accept modal events while doing it, calls exec(), handles ESC and border drawing | ||||
| * | * | ||||
| * poll() has to be filled in by user for context | * poll() has to be filled in by user for context | ||||
| */ | */ | ||||
| static int ed_marker_box_select_invoke(bContext *C, wmOperator *op, const wmEvent *event) | |||||
| { | |||||
| ARegion *ar = CTX_wm_region(C); | |||||
| View2D *v2d = &ar->v2d; | |||||
| ListBase *markers = ED_context_get_markers(C); | |||||
| bool over_marker = region_position_is_over_marker(v2d, markers, event->x - ar->winrct.xmin); | |||||
| bool tweak = RNA_boolean_get(op->ptr, "tweak"); | |||||
| if (tweak && over_marker) { | |||||
| return OPERATOR_CANCELLED | OPERATOR_PASS_THROUGH; | |||||
| } | |||||
| return WM_gesture_box_invoke(C, op, event); | |||||
| } | |||||
| static int ed_marker_box_select_exec(bContext *C, wmOperator *op) | static int ed_marker_box_select_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| View2D *v2d = UI_view2d_fromcontext(C); | View2D *v2d = UI_view2d_fromcontext(C); | ||||
| ListBase *markers = ED_context_get_markers(C); | ListBase *markers = ED_context_get_markers(C); | ||||
| rctf rect; | rctf rect; | ||||
| WM_operator_properties_border_to_rctf(op, &rect); | WM_operator_properties_border_to_rctf(op, &rect); | ||||
| UI_view2d_region_to_view_rctf(v2d, &rect, &rect); | UI_view2d_region_to_view_rctf(v2d, &rect, &rect); | ||||
| Show All 24 Lines | |||||
| { | { | ||||
| /* identifiers */ | /* identifiers */ | ||||
| ot->name = "Marker Box Select"; | ot->name = "Marker Box Select"; | ||||
| ot->description = "Select all time markers using box selection"; | ot->description = "Select all time markers using box selection"; | ||||
| ot->idname = "MARKER_OT_select_box"; | ot->idname = "MARKER_OT_select_box"; | ||||
| /* api callbacks */ | /* api callbacks */ | ||||
| ot->exec = ed_marker_box_select_exec; | ot->exec = ed_marker_box_select_exec; | ||||
| ot->invoke = WM_gesture_box_invoke; | ot->invoke = ed_marker_box_select_invoke; | ||||
| ot->modal = WM_gesture_box_modal; | ot->modal = WM_gesture_box_modal; | ||||
| ot->cancel = WM_gesture_box_cancel; | ot->cancel = WM_gesture_box_cancel; | ||||
| ot->poll = ed_markers_poll_markers_exist; | ot->poll = ed_markers_poll_markers_exist; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| /* properties */ | /* properties */ | ||||
| WM_operator_properties_gesture_box(ot); | WM_operator_properties_gesture_box(ot); | ||||
| WM_operator_properties_select_operation_simple(ot); | WM_operator_properties_select_operation_simple(ot); | ||||
| PropertyRNA *prop = RNA_def_boolean( | |||||
| ot->srna, "tweak", 0, "Tweak", "Operator has been activated using a tweak event"); | |||||
| RNA_def_property_flag(prop, PROP_SKIP_SAVE); | |||||
| } | } | ||||
| /* *********************** (de)select all ***************** */ | /* *********************** (de)select all ***************** */ | ||||
| static int ed_marker_select_all_exec(bContext *C, wmOperator *op) | static int ed_marker_select_all_exec(bContext *C, wmOperator *op) | ||||
| { | { | ||||
| ListBase *markers = ED_context_get_markers(C); | ListBase *markers = ED_context_get_markers(C); | ||||
| if (markers == NULL) { | if (markers == NULL) { | ||||
| ▲ Show 20 Lines • Show All 288 Lines • Show Last 20 Lines | |||||