Blender V4.3
clip_dopesheet_ops.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "DNA_scene_types.h"
10
11#include "BLI_rect.h"
12#include "BLI_utildefines.h"
13
14#include "BKE_context.hh"
15#include "BKE_tracking.h"
16
17#include "WM_api.hh"
18#include "WM_types.hh"
19
20#include "ED_clip.hh"
21#include "ED_screen.hh"
22
23#include "RNA_access.hh"
24#include "RNA_define.hh"
25
26#include "UI_view2d.hh"
27
28#include "clip_intern.hh" /* own include */
29
31{
34
35 if (sc->view == SC_VIEW_DOPESHEET) {
36 ARegion *region = CTX_wm_region(C);
37
38 return region->regiontype == RGN_TYPE_PREVIEW;
39 }
40 }
41
42 return false;
43}
44
45/********************** select channel operator *********************/
46
48{
50
51 if (sc && sc->clip) {
52 return sc->view == SC_VIEW_DOPESHEET;
53 }
54
55 return false;
56}
57
59{
62 MovieTracking *tracking = &clip->tracking;
63 MovieTrackingObject *tracking_object = BKE_tracking_object_get_active(tracking);
64 MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
65 float location[2];
66 const bool extend = RNA_boolean_get(op->ptr, "extend");
67 int current_channel_index = 0, channel_index;
68 const bool show_selected_only = (dopesheet->flag & TRACKING_DOPE_SELECTED_ONLY) != 0;
69
70 RNA_float_get_array(op->ptr, "location", location);
71 channel_index = -(location[1] - (CHANNEL_FIRST + CHANNEL_HEIGHT_HALF)) / CHANNEL_STEP;
72
74 MovieTrackingTrack *track = channel->track;
75
76 if (current_channel_index == channel_index) {
77 if (extend) {
78 track->flag ^= TRACK_DOPE_SEL;
79 }
80 else {
81 track->flag |= TRACK_DOPE_SEL;
82 }
83
84 if (track->flag & TRACK_DOPE_SEL) {
85 tracking_object->active_track = track;
86 BKE_tracking_track_select(&tracking_object->tracks, track, TRACK_AREA_ALL, true);
87 }
88 else if (show_selected_only == false) {
90 }
91 }
92 else if (!extend) {
93 track->flag &= ~TRACK_DOPE_SEL;
94 }
95
96 current_channel_index++;
97 }
98
100
101 return OPERATOR_FINISHED;
102}
103
105{
106 ARegion *region = CTX_wm_region(C);
107 float location[2];
108
110 &region->v2d, event->mval[0], event->mval[1], &location[0], &location[1]);
111 RNA_float_set_array(op->ptr, "location", location);
112
113 return dopesheet_select_channel_exec(C, op);
114}
115
117{
118 /* identifiers */
119 ot->name = "Select Channel";
120 ot->description = "Select movie tracking channel";
121 ot->idname = "CLIP_OT_dopesheet_select_channel";
122
123 /* api callbacks */
127
128 /* flags */
130
131 /* properties */
133 "location",
134 2,
135 nullptr,
136 -FLT_MAX,
137 FLT_MAX,
138 "Location",
139 "Mouse location to select channel",
140 -100.0f,
141 100.0f);
143 "extend",
144 false,
145 "Extend",
146 "Extend selection rather than clearing the existing selection");
147}
148
149/********************** View All operator *********************/
150
152{
154 ARegion *region = CTX_wm_region(C);
155 View2D *v2d = &region->v2d;
157 MovieTracking *tracking = &clip->tracking;
158 MovieTrackingDopesheet *dopesheet = &tracking->dopesheet;
159 int frame_min = INT_MAX, frame_max = INT_MIN;
160
162 frame_min = min_ii(frame_min, channel->segments[0]);
163 frame_max = max_ii(frame_max, channel->segments[channel->tot_segment]);
164 }
165
166 if (frame_min < frame_max) {
167 float extra;
168
169 v2d->cur.xmin = frame_min;
170 v2d->cur.xmax = frame_max;
171
172 /* we need an extra "buffer" factor on either side so that the endpoints are visible */
173 extra = 0.01f * BLI_rctf_size_x(&v2d->cur);
174 v2d->cur.xmin -= extra;
175 v2d->cur.xmax += extra;
176
177 ED_region_tag_redraw(region);
178 }
179
180 return OPERATOR_FINISHED;
181}
182
184{
185 /* identifiers */
186 ot->name = "Frame All";
187 ot->description = "Reset viewable area to show full keyframe range";
188 ot->idname = "CLIP_OT_dopesheet_view_all";
189
190 /* api callbacks */
193
194 /* flags */
196}
SpaceClip * CTX_wm_space_clip(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_tracking_track_deselect(struct MovieTrackingTrack *track, int area)
Definition tracking.cc:1217
@ TRACK_AREA_ALL
struct MovieTrackingObject * BKE_tracking_object_get_active(const struct MovieTracking *tracking)
void BKE_tracking_track_select(struct ListBase *tracksbase, struct MovieTrackingTrack *track, int area, bool extend)
Definition tracking.cc:1190
#define LISTBASE_FOREACH(type, var, list)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
BLI_INLINE float BLI_rctf_size_x(const struct rctf *rct)
Definition BLI_rect.h:197
@ RGN_TYPE_PREVIEW
@ SC_VIEW_DOPESHEET
@ TRACK_DOPE_SEL
@ TRACKING_DOPE_SELECTED_ONLY
MovieClip * ED_space_clip_get_clip(const SpaceClip *sc)
bool ED_space_clip_tracking_poll(bContext *C)
void ED_region_tag_redraw(ARegion *region)
Definition area.cc:634
void UI_view2d_region_to_view(const View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
Definition view2d.cc:1663
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NC_GEOM
Definition WM_types.hh:360
#define ND_SELECT
Definition WM_types.hh:474
static bool space_clip_dopesheet_poll(bContext *C)
void CLIP_OT_dopesheet_view_all(wmOperatorType *ot)
static int dopesheet_view_all_exec(bContext *C, wmOperator *)
void CLIP_OT_dopesheet_select_channel(wmOperatorType *ot)
static int dopesheet_select_channel_exec(bContext *C, wmOperator *op)
static int dopesheet_select_channel_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static bool dopesheet_select_channel_poll(bContext *C)
#define CHANNEL_STEP
#define CHANNEL_FIRST
#define CHANNEL_HEIGHT_HALF
void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
#define FLT_MAX
Definition stdcycles.h:14
MovieTrackingTrack * active_track
struct MovieClip * clip
float xmax
float xmin
int mval[2]
Definition WM_types.hh:728
const char * name
Definition WM_types.hh:990
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1042
const char * idname
Definition WM_types.hh:992
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1022
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
Definition WM_types.hh:1006
const char * description
Definition WM_types.hh:996
StructRNA * srna
Definition WM_types.hh:1080
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4125