Blender V4.3
sequencer_retiming.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include "BLI_map.hh"
10#include "MEM_guardedalloc.h"
11
12#include "BLI_set.hh"
13
14#include "DNA_scene_types.h"
15#include "DNA_space_types.h"
16
17#include "BKE_context.hh"
18#include "BKE_report.hh"
19#include "BKE_scene.hh"
20
21#include "ED_select_utils.hh"
22#include "ED_sequencer.hh"
23
24#include "SEQ_connect.hh"
25#include "SEQ_iterator.hh"
26#include "SEQ_relations.hh"
27#include "SEQ_retiming.hh"
28#include "SEQ_select.hh"
29#include "SEQ_sequencer.hh"
30#include "SEQ_time.hh"
31#include "SEQ_transform.hh"
32
33#include "WM_api.hh"
34
35#include "RNA_define.hh"
36
37#include "UI_view2d.hh"
38
39/* Own include. */
40#include "sequencer_intern.hh"
41
43
45{
47 if (ed == nullptr) {
48 return false;
49 }
50 return SEQ_retiming_selection_get(ed).size() > 0;
51}
52
53/*-------------------------------------------------------------------- */
58{
59 LISTBASE_FOREACH (Sequence *, seq, seqbase) {
60 if ((seq->flag & SELECT) == 0) {
61 continue;
62 }
63 if (!SEQ_retiming_is_allowed(seq)) {
64 continue;
65 }
66 seq->flag |= SEQ_SHOW_RETIMING;
67 }
68}
69
71{
72 LISTBASE_FOREACH (Sequence *, seq, seqbase) {
73 if ((seq->flag & SELECT) == 0) {
74 continue;
75 }
76 if (!SEQ_retiming_is_allowed(seq)) {
77 continue;
78 }
79 seq->flag &= ~SEQ_SHOW_RETIMING;
80 }
81}
82
84{
85 LISTBASE_FOREACH (Sequence *, seq, seqbase) {
86 seq->flag &= ~SEQ_SHOW_RETIMING;
87 }
88}
89
91{
92 Scene *scene = CTX_data_scene(C);
93 Editing *ed = SEQ_editing_get(scene);
94 Sequence *seq_act = SEQ_select_active_get(scene);
95
96 if (seq_act == nullptr) {
97 return OPERATOR_CANCELLED;
98 }
99
102 }
103 else if (SEQ_retiming_data_is_editable(seq_act)) {
105 }
106 else {
108 }
109
111 return OPERATOR_FINISHED;
112}
113
115{
116 /* identifiers */
117 ot->name = "Retime Strips";
118 ot->description = "Show retiming keys in selected strips";
119 ot->idname = "SEQUENCER_OT_retiming_show";
120
121 /* api callbacks */
124
125 /* flags */
127}
128
131static bool retiming_poll(bContext *C)
132{
133 const Editing *ed = SEQ_editing_get(CTX_data_scene(C));
134 if (ed == nullptr) {
135 return false;
136 }
137 Sequence *seq = ed->act_seq;
138 if (seq == nullptr) {
139 return false;
140 }
141 if (!SEQ_retiming_is_allowed(seq)) {
142 CTX_wm_operator_poll_msg_set(C, "This strip type cannot be retimed");
143 return false;
144 }
145 return true;
146}
147
148/*-------------------------------------------------------------------- */
153{
154 Scene *scene = CTX_data_scene(C);
155 const Editing *ed = SEQ_editing_get(scene);
156
158 SEQ_retiming_reset(scene, seq);
159 }
160
162 return OPERATOR_FINISHED;
163}
164
166{
167 /* identifiers */
168 ot->name = "Reset Retiming";
169 ot->description = "Reset strip retiming";
170 ot->idname = "SEQUENCER_OT_retiming_reset";
171
172 /* api callbacks */
175
176 /* flags */
178}
179
182/* -------------------------------------------------------------------- */
187 wmOperator *op,
188 Sequence *seq,
189 const int timeline_frame)
190{
191 Scene *scene = CTX_data_scene(C);
192 const float frame_index = (BKE_scene_frame_get(scene) - SEQ_time_start_frame_get(seq)) *
194 const SeqRetimingKey *key = SEQ_retiming_find_segment_start_key(seq, frame_index);
195
196 if (key != nullptr && SEQ_retiming_key_is_transition_start(key)) {
197 BKE_report(op->reports, RPT_WARNING, "Cannot create key inside of speed transition");
198 return false;
199 }
200
201 const float end_frame = seq->start + SEQ_time_strip_length_get(scene, seq);
202 if (seq->start > timeline_frame || end_frame < timeline_frame) {
203 return false;
204 }
205
207 SEQ_retiming_add_key(scene, seq, timeline_frame);
208 return true;
209}
210
212 wmOperator *op,
214 const int timeline_frame)
215{
216 bool inserted = false;
217
218 for (Sequence *seq : strips) {
219 if (!SEQ_retiming_is_allowed(seq)) {
220 continue;
221 }
222 inserted |= retiming_key_add_new_for_seq(C, op, seq, timeline_frame);
223 }
224
225 return inserted ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
226}
227
229 wmOperator *op,
230 const int timeline_frame)
231{
232 Scene *scene = CTX_data_scene(C);
233 Editing *ed = SEQ_editing_get(scene);
234 bool inserted = false;
235
237 if (selection.is_empty()) {
238 return OPERATOR_CANCELLED;
239 }
240
241 for (Sequence *seq : selection.values()) {
242 inserted |= retiming_key_add_new_for_seq(C, op, seq, timeline_frame);
243 }
244
245 return inserted ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
246}
247
249{
250 Scene *scene = CTX_data_scene(C);
251
252 float timeline_frame;
253 if (RNA_struct_property_is_set(op->ptr, "timeline_frame")) {
254 timeline_frame = RNA_int_get(op->ptr, "timeline_frame");
255 }
256 else {
257 timeline_frame = BKE_scene_frame_get(scene);
258 }
259
260 int ret_val;
262 if (!strips.is_empty()) {
263 ret_val = retiming_key_add_from_selection(C, op, strips, timeline_frame);
264 }
265 else {
266 ret_val = retiming_key_add_to_editable_strips(C, op, timeline_frame);
267 }
268
270 return ret_val;
271}
272
274{
275 /* identifiers */
276 ot->name = "Add Retiming Key";
277 ot->description = "Add retiming Key";
278 ot->idname = "SEQUENCER_OT_retiming_key_add";
279
280 /* api callbacks */
283
284 /* flags */
286
288 "timeline_frame",
289 0,
290 0,
291 INT_MAX,
292 "Timeline Frame",
293 "Frame where key will be added",
294 0,
295 INT_MAX);
296}
297
300/* -------------------------------------------------------------------- */
305 const wmOperator *op,
306 Sequence *seq,
307 const int timeline_frame,
308 const int duration)
309{
310 Scene *scene = CTX_data_scene(C);
312 // ensure L+R key
313 SeqRetimingKey *key = SEQ_retiming_add_key(scene, seq, timeline_frame);
314
315 if (key == nullptr) {
316 BKE_report(op->reports, RPT_WARNING, "Cannot create freeze frame");
317 return false;
318 }
319
321 BKE_report(op->reports, RPT_WARNING, "Cannot create key inside of speed transition");
322 return false;
323 }
324
325 SeqRetimingKey *freeze = SEQ_retiming_add_freeze_frame(scene, seq, key, duration);
326
327 if (freeze == nullptr) {
328 BKE_report(op->reports, RPT_WARNING, "Cannot create freeze frame");
329 return false;
330 }
331
334
336 return true;
337}
338
340 const wmOperator *op,
341 const int duration)
342{
343 Scene *scene = CTX_data_scene(C);
345 strips.remove_if([&](Sequence *seq) { return !SEQ_retiming_is_allowed(seq); });
346 const int timeline_frame = BKE_scene_frame_get(scene);
347 bool success = false;
348
349 for (Sequence *seq : strips) {
350 success |= freeze_frame_add_new_for_seq(C, op, seq, timeline_frame, duration);
352 }
353 return success;
354}
355
357 const wmOperator *op,
358 const int duration)
359{
360 Scene *scene = CTX_data_scene(C);
361 bool success = false;
362
364
365 for (auto item : selection.items()) {
366 const int timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, item.value, item.key);
367 success |= freeze_frame_add_new_for_seq(C, op, item.value, timeline_frame, duration);
368 SEQ_relations_invalidate_cache_raw(scene, item.value);
369 }
370 return success;
371}
372
374{
375 Scene *scene = CTX_data_scene(C);
376 bool success = false;
377
378 int duration = 1;
379
380 if (RNA_property_is_set(op->ptr, RNA_struct_find_property(op->ptr, "duration"))) {
381 duration = RNA_int_get(op->ptr, "duration");
382 }
383
385 success = freeze_frame_add_from_retiming_selection(C, op, duration);
386 }
387 else {
388 success = freeze_frame_add_from_strip_selection(C, op, duration);
389 }
390
392
393 return success ? OPERATOR_FINISHED : OPERATOR_PASS_THROUGH;
394}
395
397{
398 /* identifiers */
399 ot->name = "Add Freeze Frame";
400 ot->description = "Add freeze frame";
401 ot->idname = "SEQUENCER_OT_retiming_freeze_frame_add";
402
403 /* api callbacks */
406
407 /* flags */
409
410 /* properties */
412 "duration",
413 0,
414 0,
415 INT_MAX,
416 "Duration",
417 "Duration of freeze frame segment",
418 0,
419 INT_MAX);
420}
421
424/* -------------------------------------------------------------------- */
429 const wmOperator *op,
430 Sequence *seq,
431 const int timeline_frame,
432 const int duration)
433{
434 Scene *scene = CTX_data_scene(C);
435
436 // ensure L+R key
437 SeqRetimingKey *key = SEQ_retiming_add_key(scene, seq, timeline_frame);
438
439 if (key == nullptr) {
440 key = SEQ_retiming_key_get_by_timeline_frame(scene, seq, timeline_frame);
441 }
442
443 if (SEQ_retiming_is_last_key(seq, key) || key->strip_frame_index == 0) {
444 BKE_report(op->reports, RPT_WARNING, "Cannot create transition from first or last key");
445 return false;
446 }
447
448 SeqRetimingKey *transition = SEQ_retiming_add_transition(scene, seq, key, duration);
449
450 if (transition == nullptr) {
451 BKE_report(op->reports, RPT_WARNING, "Cannot create transition");
452 return false;
453 }
454
457
459 return true;
460}
461
463 const wmOperator *op,
464 const int duration)
465{
466 Scene *scene = CTX_data_scene(C);
467 bool success = false;
468
470
471 for (auto item : selection.items()) {
472 const int timeline_frame = SEQ_retiming_key_timeline_frame_get(scene, item.value, item.key);
473 success |= transition_add_new_for_seq(C, op, item.value, timeline_frame, duration);
474 }
475 return success;
476}
477
479{
480 Scene *scene = CTX_data_scene(C);
481 bool success = false;
482
483 int duration = 1;
484
485 if (RNA_property_is_set(op->ptr, RNA_struct_find_property(op->ptr, "duration"))) {
486 duration = RNA_int_get(op->ptr, "duration");
487 }
488
490 success = transition_add_from_retiming_selection(C, op, duration);
491 }
492 else {
493 BKE_report(op->reports, RPT_WARNING, "Retiming key must be selected");
494 return false;
495 }
496
498
499 return success ? OPERATOR_FINISHED : OPERATOR_PASS_THROUGH;
500}
501
503{
504 /* identifiers */
505 ot->name = "Add Speed Transition";
506 ot->description = "Add smooth transition between 2 retimed segments";
507 ot->idname = "SEQUENCER_OT_retiming_transition_add";
508
509 /* api callbacks */
512
513 /* flags */
515
516 /* properties */
518 "duration",
519 0,
520 0,
521 INT_MAX,
522 "Duration",
523 "Duration of freeze frame segment",
524 0,
525 INT_MAX);
526}
527
530/* -------------------------------------------------------------------- */
535{
536 Scene *scene = CTX_data_scene(C);
537
539 blender::Vector<Sequence *> strips_to_handle;
540
541 if (!sequencer_retiming_mode_is_active(C) || selection.size() == 0) {
543 }
544
545 for (Sequence *seq : selection.values()) {
546 strips_to_handle.append_non_duplicates(seq);
547 }
548
549 for (Sequence *seq : strips_to_handle) {
551 for (auto item : selection.items()) {
552 if (item.value != seq) {
553 continue;
554 }
555 keys_to_delete.append(item.key);
556 }
557
558 SEQ_retiming_remove_multiple_keys(seq, keys_to_delete);
559 }
560
561 for (Sequence *seq : strips_to_handle) {
563 }
564
566 return OPERATOR_FINISHED;
567}
568
570{
571 Scene *scene = CTX_data_scene(C);
572 ListBase *markers = &scene->markers;
573
575 ARegion *region = CTX_wm_region(C);
576 if (region && (region->regiontype == RGN_TYPE_WINDOW)) {
577 /* Bounding box of 30 pixels is used for markers shortcuts,
578 * prevent conflict with markers shortcuts here. */
579 if (event->mval[1] <= 30) {
581 }
582 }
583 }
584
586}
587
589{
590
591 /* Identifiers. */
592 ot->name = "Delete Retiming Keys";
593 ot->idname = "SEQUENCER_OT_retiming_key_delete";
594 ot->description = "Delete selected strips from the sequencer";
595
596 /* Api callbacks. */
600
601 /* Flags. */
603}
604
607/* -------------------------------------------------------------------- */
612{
613 Scene *scene = CTX_data_scene(C);
616 return SEQ_retiming_add_key(scene, seq, right_fake_key_frame_get(C, seq));
617}
618
619/* Return speed of existing segment or strip. Assume 1 element is selected. */
620static float strip_speed_get(bContext *C, const wmOperator * /*op*/)
621{
622 /* Strip mode. */
625 if (strips.size() == 1) {
626 Sequence *seq = strips[0];
628 return SEQ_retiming_key_speed_get(seq, key);
629 }
630 }
631
632 Scene *scene = CTX_data_scene(C);
634 /* Retiming mode. */
635 if (selection.size() == 1) {
636 for (auto item : selection.items()) {
637 return SEQ_retiming_key_speed_get(item.value, item.key);
638 }
639 }
640
641 return 1.0f;
642}
643
644static int strip_speed_set_exec(bContext *C, const wmOperator *op)
645{
646 Scene *scene = CTX_data_scene(C);
648 strips.remove_if([&](Sequence *seq) { return !SEQ_retiming_is_allowed(seq); });
649
650 for (Sequence *seq : strips) {
652
653 if (key == nullptr) {
654 continue;
655 }
656 /* TODO: it would be nice to multiply speed with complex retiming by a factor. */
657 SEQ_retiming_key_speed_set(scene, seq, key, RNA_float_get(op->ptr, "speed"), false);
658
660 if (SEQ_transform_test_overlap(scene, seqbase, seq)) {
661 SEQ_transform_seqbase_shuffle(seqbase, seq, scene);
662 }
663
665 }
666
668 return OPERATOR_FINISHED;
669}
670
672 const wmOperator *op,
674{
675 Scene *scene = CTX_data_scene(C);
677
678 for (auto item : selection.items()) {
680 item.value,
681 item.key,
682 RNA_float_get(op->ptr, "speed"),
683 RNA_boolean_get(op->ptr, "keep_retiming"));
684
685 if (SEQ_transform_test_overlap(scene, seqbase, item.value)) {
686 SEQ_transform_seqbase_shuffle(seqbase, item.value, scene);
687 }
688
689 SEQ_relations_invalidate_cache_raw(scene, item.value);
690 }
691
693 return OPERATOR_FINISHED;
694}
695
697{
698 const Scene *scene = CTX_data_scene(C);
699
700 /* Strip mode. */
702 return strip_speed_set_exec(C, op);
703 }
704
706
707 /* Retiming mode. */
708 if (selection.size() > 0) {
709 return segment_speed_set_exec(C, op, selection);
710 }
711
712 BKE_report(op->reports, RPT_ERROR, "No keys or strips selected");
713 return OPERATOR_CANCELLED;
714}
715
717 wmOperator *op,
718 const wmEvent *event)
719{
720 if (!RNA_struct_property_is_set(op->ptr, "speed")) {
721 RNA_float_set(op->ptr, "speed", strip_speed_get(C, op) * 100.0f);
722 return WM_operator_props_popup(C, op, event);
723 }
724
726}
727
729{
730 /* identifiers */
731 ot->name = "Set Speed";
732 ot->description = "Set speed of retimed segment";
733 ot->idname = "SEQUENCER_OT_retiming_segment_speed_set";
734
735 /* api callbacks */
739
740 /* flags */
742
743 /* properties */
745 "speed",
746 100.0f,
747 0.001f,
748 FLT_MAX,
749 "Speed",
750 "New speed of retimed segment",
751 0.1f,
752 FLT_MAX);
753
755 "keep_retiming",
756 true,
757 "Preserve Current Retiming",
758 "Keep speed of other segments unchanged, change strip length instead");
759}
760
763static bool select_key(const Editing *ed,
764 SeqRetimingKey *key,
765 const bool toggle,
766 const bool deselect_all)
767{
768 bool changed = false;
769
770 if (deselect_all) {
771 changed = SEQ_retiming_selection_clear(ed);
772 }
773
774 if (key == nullptr) {
775 return changed;
776 }
777
778 if (toggle && SEQ_retiming_selection_contains(ed, key)) {
780 }
781 else {
783 }
784
785 return true;
786}
787
788static bool select_connected_keys(const Scene *scene,
789 const SeqRetimingKey *source,
790 const Sequence *source_owner)
791{
792 if (!SEQ_is_strip_connected(source_owner)) {
793 return false;
794 }
795
796 const int frame = SEQ_retiming_key_timeline_frame_get(scene, source_owner, source);
797 bool changed = false;
799 for (Sequence *connection : connections) {
800 SeqRetimingKey *con_key = SEQ_retiming_key_get_by_timeline_frame(scene, connection, frame);
801
802 if (con_key) {
803 SEQ_retiming_selection_copy(con_key, source);
804 changed = true;
805 }
806 }
807 return changed;
808}
809
811 wmOperator *op,
812 SeqRetimingKey *key,
813 const Sequence *key_owner)
814{
815 Scene *scene = CTX_data_scene(C);
816 Editing *ed = SEQ_editing_get(scene);
817
818 if (!RNA_boolean_get(op->ptr, "extend")) {
820 }
821 for (; key <= SEQ_retiming_last_key_get(key_owner); key++) {
822 select_key(ed, key, false, false);
823 select_connected_keys(scene, key, key_owner);
824 }
826 return OPERATOR_FINISHED;
827}
828
830 wmOperator *op,
831 SeqRetimingKey *key,
832 const Sequence *key_owner)
833{
834 if (RNA_boolean_get(op->ptr, "linked_time")) {
835 return sequencer_retiming_select_linked_time(C, op, key, key_owner);
836 }
837
838 Scene *scene = CTX_data_scene(C);
839 Editing *ed = SEQ_editing_get(scene);
840
841 const bool wait_to_deselect_others = RNA_boolean_get(op->ptr, "wait_to_deselect_others");
842 const bool toggle = RNA_boolean_get(op->ptr, "toggle");
843 bool deselect_all = RNA_boolean_get(op->ptr, "deselect_all");
844 deselect_all |= !toggle;
845
846 /* Clicked on an unselected key. */
847 if (!SEQ_retiming_selection_contains(ed, key) && !toggle) {
848 select_key(ed, key, false, deselect_all);
849 select_connected_keys(scene, key, key_owner);
850 }
851
852 /* Clicked on a key that is already selected, waiting to click release. */
853 if (wait_to_deselect_others && !toggle) {
855 }
856
857 /* The key is already selected, but deselect other selected keys after click is released if no
858 * transform or toggle happened. */
859 bool changed = select_key(ed, key, toggle, deselect_all);
860 if (!toggle) {
861 changed |= select_connected_keys(scene, key, key_owner);
862 }
863
865 return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
866}
867
868static void realize_fake_keys_in_rect(bContext *C, Sequence *seq, const rctf &rectf)
869{
870 const Scene *scene = CTX_data_scene(C);
871
872 const int content_start = SEQ_time_start_frame_get(seq);
873 const int left_key_frame = max_ii(content_start, SEQ_time_left_handle_frame_get(scene, seq));
874 const int content_end = SEQ_time_content_end_frame_get(scene, seq);
875 const int right_key_frame = min_ii(content_end, SEQ_time_right_handle_frame_get(scene, seq));
876
877 /* Realize "fake" keys. */
878 if (left_key_frame > rectf.xmin && left_key_frame < rectf.xmax) {
879 SEQ_retiming_add_key(scene, seq, left_key_frame);
880 }
881 if (right_key_frame > rectf.xmin && right_key_frame < rectf.xmax) {
882 SEQ_retiming_add_key(scene, seq, right_key_frame);
883 }
884}
885
887{
888 const Scene *scene = CTX_data_scene(C);
889 const View2D *v2d = UI_view2d_fromcontext(C);
890 Editing *ed = SEQ_editing_get(scene);
891
892 if (ed == nullptr) {
893 return OPERATOR_CANCELLED;
894 }
895
896 const eSelectOp sel_op = eSelectOp(RNA_enum_get(op->ptr, "mode"));
897 bool changed = false;
898
899 if (SEL_OP_USE_PRE_DESELECT(sel_op)) {
900 changed |= SEQ_retiming_selection_clear(ed);
901 }
902
903 rctf rectf;
905 UI_view2d_region_to_view_rctf(v2d, &rectf, &rectf);
906
908
909 for (Sequence *seq : sequencer_visible_strips_get(C)) {
910 if (seq->machine < rectf.ymin || seq->machine > rectf.ymax) {
911 continue;
912 }
914 continue;
915 }
916 realize_fake_keys_in_rect(C, seq, rectf);
917
918 for (SeqRetimingKey &key : SEQ_retiming_keys_get(seq)) {
919 const int key_frame = SEQ_retiming_key_timeline_frame_get(scene, seq, &key);
920 const int strip_start = SEQ_time_left_handle_frame_get(scene, seq);
921 const int strip_end = SEQ_time_right_handle_frame_get(scene, seq);
922 if (key_frame < strip_start || key_frame > strip_end) {
923 continue;
924 }
925 if (key_frame > rectf.xmax || key_frame < rectf.xmin) {
926 continue;
927 }
928
929 switch (sel_op) {
930 case SEL_OP_ADD:
931 case SEL_OP_SET: {
933 break;
934 }
935 case SEL_OP_SUB: {
937 break;
938 }
939 case SEL_OP_XOR: { /* Toggle */
940 if (SEQ_retiming_selection_contains(ed, &key)) {
942 }
943 else {
945 }
946 break;
947 case SEL_OP_AND: {
948 if (SEQ_retiming_selection_contains(ed, &key)) {
949 and_keys.add(&key);
950 }
951 break;
952 }
953 }
954 }
955 changed = true;
956 }
957 }
958
959 if (and_keys.size() > 0) {
961 for (auto key : and_keys) {
963 }
964 }
965
966 return changed ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
967}
968
970{
971 Scene *scene = CTX_data_scene(C);
972 int action = RNA_enum_get(op->ptr, "action");
973
975
976 if (action == SEL_TOGGLE) {
977 action = SEL_SELECT;
978 for (Sequence *seq : strips) {
980 continue;
981 }
982 for (SeqRetimingKey &key : SEQ_retiming_keys_get(seq)) {
983 if (key.flag & SEQ_KEY_SELECTED) {
984 action = SEL_DESELECT;
985 break;
986 }
987 }
988 }
989 }
990
991 if (action == SEL_DESELECT) {
993 }
994
995 for (Sequence *seq : strips) {
997 continue;
998 }
999 for (SeqRetimingKey &key : SEQ_retiming_keys_get(seq)) {
1000 switch (action) {
1001 case SEL_SELECT:
1002 key.flag |= SEQ_KEY_SELECTED;
1003 break;
1004 case SEL_INVERT:
1005 if (key.flag & SEQ_KEY_SELECTED) {
1006 key.flag &= ~SEQ_KEY_SELECTED;
1007 }
1008 else {
1009 key.flag |= SEQ_KEY_SELECTED;
1010 }
1011 break;
1012 }
1013 }
1014 }
1015
1017 return OPERATOR_FINISHED;
1018}
void CTX_wm_operator_poll_msg_set(bContext *C, const char *msg)
Scene * CTX_data_scene(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
float BKE_scene_frame_get(const Scene *scene)
Definition scene.cc:2331
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
@ RGN_TYPE_WINDOW
@ SEQ_KEY_SELECTED
@ SEQ_SHOW_RETIMING
@ OPERATOR_RUNNING_MODAL
@ OPERATOR_PASS_THROUGH
#define SEL_OP_USE_PRE_DESELECT(sel_op)
@ SEL_SELECT
@ SEL_INVERT
@ SEL_DESELECT
@ SEL_TOGGLE
eSelectOp
@ SEL_OP_ADD
@ SEL_OP_SUB
@ SEL_OP_SET
@ SEL_OP_AND
@ SEL_OP_XOR
blender::VectorSet< Sequence * > ED_sequencer_selected_strips_from_context(bContext *C)
bool ED_sequencer_deselect_all(Scene *scene)
Read Guarded memory(de)allocation.
View2D * UI_view2d_fromcontext(const bContext *C)
Definition view2d.cc:1850
void UI_view2d_region_to_view_rctf(const View2D *v2d, const rctf *rect_src, rctf *rect_dst) ATTR_NONNULL()
Definition view2d.cc:1670
#define ND_SEQUENCER
Definition WM_types.hh:404
@ OPTYPE_UNDO
Definition WM_types.hh:162
@ OPTYPE_REGISTER
Definition WM_types.hh:160
#define NC_SCENE
Definition WM_types.hh:345
int64_t size() const
Definition BLI_map.hh:927
int64_t size() const
Definition BLI_set.hh:564
bool add(const Key &key)
Definition BLI_set.hh:248
int64_t size() const
int64_t remove_if(Predicate &&predicate)
void append(const T &value)
void append_non_duplicates(const T &value)
#define SELECT
const vector< Marker > & markers
VectorSet< Sequence * > SEQ_query_selected_strips(ListBase *seqbase)
Definition iterator.cc:106
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
bool RNA_property_is_set(PointerRNA *ptr, PropertyRNA *prop)
int RNA_int_get(PointerRNA *ptr, const char *name)
float RNA_float_get(PointerRNA *ptr, const char *name)
void RNA_float_set(PointerRNA *ptr, const char *name, float value)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_float(StructOrFunctionRNA *cont_, const char *identifier, 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)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
ListBase * SEQ_active_seqbase_get(const Editing *ed)
Definition sequencer.cc:416
Editing * SEQ_editing_get(const Scene *scene)
Definition sequencer.cc:262
bool sequencer_editing_initialized_and_active(bContext *C)
blender::Vector< Sequence * > sequencer_visible_strips_get(const bContext *C)
int left_fake_key_frame_get(const bContext *C, const Sequence *seq)
blender::VectorSet< Sequence * > all_strips_from_context(bContext *C)
int right_fake_key_frame_get(const bContext *C, const Sequence *seq)
void SEQUENCER_OT_retiming_transition_add(wmOperatorType *ot)
static SeqRetimingKey * ensure_left_and_right_keys(const bContext *C, Sequence *seq)
void SEQUENCER_OT_retiming_show(wmOperatorType *ot)
void SEQUENCER_OT_retiming_freeze_frame_add(wmOperatorType *ot)
void SEQUENCER_OT_retiming_key_delete(wmOperatorType *ot)
static bool transition_add_from_retiming_selection(const bContext *C, const wmOperator *op, const int duration)
static bool freeze_frame_add_from_strip_selection(bContext *C, const wmOperator *op, const int duration)
static int sequencer_retiming_transition_add_exec(bContext *C, wmOperator *op)
int sequencer_retiming_key_select_exec(bContext *C, wmOperator *op, SeqRetimingKey *key, const Sequence *key_owner)
static void sequencer_retiming_data_hide_all(ListBase *seqbase)
static int sequencer_retiming_key_delete_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void realize_fake_keys_in_rect(bContext *C, Sequence *seq, const rctf &rectf)
static int sequencer_retiming_reset_exec(bContext *C, wmOperator *)
int sequencer_retiming_select_linked_time(bContext *C, wmOperator *op, SeqRetimingKey *key, const Sequence *key_owner)
static bool retiming_poll(bContext *C)
static bool transition_add_new_for_seq(const bContext *C, const wmOperator *op, Sequence *seq, const int timeline_frame, const int duration)
static float strip_speed_get(bContext *C, const wmOperator *)
static int sequencer_retiming_key_add_exec(bContext *C, wmOperator *op)
static int sequencer_retiming_segment_speed_set_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static int retiming_key_add_from_selection(bContext *C, wmOperator *op, blender::Span< Sequence * > strips, const int timeline_frame)
bool sequencer_retiming_mode_is_active(const bContext *C)
static bool freeze_frame_add_from_retiming_selection(const bContext *C, const wmOperator *op, const int duration)
int sequencer_retiming_select_all_exec(bContext *C, wmOperator *op)
static int sequencer_retiming_data_show_exec(bContext *C, wmOperator *)
void SEQUENCER_OT_retiming_reset(wmOperatorType *ot)
static bool retiming_key_add_new_for_seq(bContext *C, wmOperator *op, Sequence *seq, const int timeline_frame)
void SEQUENCER_OT_retiming_key_add(wmOperatorType *ot)
static int sequencer_retiming_freeze_frame_add_exec(bContext *C, wmOperator *op)
void SEQUENCER_OT_retiming_segment_speed_set(wmOperatorType *ot)
static bool freeze_frame_add_new_for_seq(const bContext *C, const wmOperator *op, Sequence *seq, const int timeline_frame, const int duration)
static void sequencer_retiming_data_show_selection(ListBase *seqbase)
static bool select_key(const Editing *ed, SeqRetimingKey *key, const bool toggle, const bool deselect_all)
static void sequencer_retiming_data_hide_selection(ListBase *seqbase)
static bool select_connected_keys(const Scene *scene, const SeqRetimingKey *source, const Sequence *source_owner)
static int sequencer_retiming_key_delete_exec(bContext *C, wmOperator *)
static int sequencer_retiming_segment_speed_set_exec(bContext *C, wmOperator *op)
int sequencer_retiming_box_select_exec(bContext *C, wmOperator *op)
static int strip_speed_set_exec(bContext *C, const wmOperator *op)
static int segment_speed_set_exec(const bContext *C, const wmOperator *op, blender::Map< SeqRetimingKey *, Sequence * > selection)
static int retiming_key_add_to_editable_strips(bContext *C, wmOperator *op, const int timeline_frame)
#define FLT_MAX
Definition stdcycles.h:14
bool SEQ_is_strip_connected(const Sequence *seq)
blender::VectorSet< Sequence * > SEQ_get_connected_strips(const Sequence *seq)
void SEQ_relations_invalidate_cache_raw(Scene *scene, Sequence *seq)
MutableSpan< SeqRetimingKey > SEQ_retiming_keys_get(const Sequence *seq)
bool SEQ_retiming_data_is_editable(const Sequence *seq)
void SEQ_retiming_remove_multiple_keys(Sequence *seq, blender::Vector< SeqRetimingKey * > &keys_to_remove)
void SEQ_retiming_key_speed_set(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const float speed, bool keep_retiming)
bool SEQ_retiming_selection_contains(const Editing *ed, const SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_last_key_get(const Sequence *seq)
SeqRetimingKey * SEQ_retiming_add_freeze_frame(const Scene *scene, Sequence *seq, SeqRetimingKey *key, const int offset)
SeqRetimingKey * SEQ_retiming_add_transition(const Scene *scene, Sequence *seq, SeqRetimingKey *key, float offset)
void SEQ_retiming_selection_remove(SeqRetimingKey *key)
bool SEQ_retiming_is_allowed(const Sequence *seq)
int SEQ_retiming_key_timeline_frame_get(const Scene *scene, const Sequence *seq, const SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_find_segment_start_key(const Sequence *seq, float frame_index)
void SEQ_retiming_selection_append(SeqRetimingKey *key)
SeqRetimingKey * SEQ_retiming_key_get_by_timeline_frame(const Scene *scene, const Sequence *seq, const int timeline_frame)
blender::Map< SeqRetimingKey *, Sequence * > SEQ_retiming_selection_get(const Editing *ed)
float SEQ_retiming_key_speed_get(const Sequence *seq, const SeqRetimingKey *key)
void SEQ_retiming_data_ensure(Sequence *seq)
bool SEQ_retiming_is_last_key(const Sequence *seq, const SeqRetimingKey *key)
bool SEQ_retiming_selection_clear(const Editing *ed)
void SEQ_retiming_reset(Scene *scene, Sequence *seq)
bool SEQ_retiming_key_is_transition_start(const SeqRetimingKey *key)
void SEQ_retiming_selection_copy(SeqRetimingKey *dst, const SeqRetimingKey *src)
SeqRetimingKey * SEQ_retiming_add_key(const Scene *scene, Sequence *seq, const int timeline_frame)
Sequence * SEQ_select_active_get(const Scene *scene)
int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq)
int SEQ_time_left_handle_frame_get(const Scene *, const Sequence *seq)
float SEQ_time_content_end_frame_get(const Scene *scene, const Sequence *seq)
float SEQ_time_start_frame_get(const Sequence *seq)
float SEQ_time_media_playback_rate_factor_get(const Scene *scene, const Sequence *seq)
Definition strip_time.cc:38
int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq)
bool SEQ_transform_seqbase_shuffle(ListBase *seqbasep, Sequence *test, Scene *evil_scene)
bool SEQ_transform_test_overlap(const Scene *scene, ListBase *seqbasep, Sequence *test)
ListBase * seqbasep
Sequence * act_seq
float xmax
float xmin
float ymax
float ymin
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 ReportList * reports
struct PointerRNA * ptr
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
wmOperatorType * ot
Definition wm_files.cc:4125
void WM_operator_properties_border_to_rctf(wmOperator *op, rctf *r_rect)
int WM_operator_props_popup(bContext *C, wmOperator *op, const wmEvent *)