[Bf-blender-cvs] [ce8490b404f] temp-vse-transform-overwrite: Add overlap handling mode to header

Richard Antalik noreply at git.blender.org
Sat Jul 17 03:25:36 CEST 2021


Commit: ce8490b404faf21179279ef15c813e266b9a6c6f
Author: Richard Antalik
Date:   Sat Jul 17 03:01:52 2021 +0200
Branches: temp-vse-transform-overwrite
https://developer.blender.org/rBce8490b404faf21179279ef15c813e266b9a6c6f

Add overlap handling mode to header

===================================================================

M	release/scripts/startup/bl_ui/space_sequencer.py
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/editors/transform/transform_convert_sequencer.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/sequencer/SEQ_sequencer.h
M	source/blender/sequencer/intern/sequencer.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 55714e0b0a5..6ce080da949 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -164,6 +164,9 @@ class SEQUENCER_HT_header(Header):
 
         if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}:
             tool_settings = context.tool_settings
+            sequencer_tool_settings = tool_settings.sequencer_tool_settings
+            row = layout.row(align=True)
+            row.prop(sequencer_tool_settings, "overlap_mode", text="")
             row = layout.row(align=True)
             row.prop(tool_settings, "use_snap_sequencer", text="")
             sub = row.row(align=True)
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 313ce734bbc..30fca9bb99a 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -571,4 +571,9 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
       }
     }
   }
+
+  LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+    SequencerToolSettings *sequencer_tool_settings = SEQ_tool_settings_ensure(scene);
+    sequencer_tool_settings->overlap_mode = SEQ_OVERLAP_SHUFFLE;
+  }
 }
diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c
index 4f8ac7d75da..d0c0db9caef 100644
--- a/source/blender/editors/transform/transform_convert_sequencer.c
+++ b/source/blender/editors/transform/transform_convert_sequencer.c
@@ -513,7 +513,8 @@ static void seq_transform_handle_overwrite_trim(TransInfo *t,
   SEQ_collection_free(targets);
 
   /* Recalculate all effects influenced by target. */
-  SeqCollection *effects = SEQ_query_by_reference(target, seqbase_from_trans_info(t), SEQ_query_strip_effect_chain);
+  SeqCollection *effects = SEQ_query_by_reference(
+      target, seqbase_from_trans_info(t), SEQ_query_strip_effect_chain);
   SEQ_ITERATOR_FOREACH (seq, effects) {
     SEQ_time_update_sequence(t->scene, seq);
   }
@@ -558,30 +559,34 @@ static void seq_transform_handle_overwrite(TransInfo *t, SeqCollection *transfor
   }
 }
 
+static void seq_transform_handle_overlap_shuffle(TransInfo *t, SeqCollection *transformed_strips)
+{
+  ListBase *seqbase = seqbase_from_trans_info(t);
+  ListBase *markers = &t->scene->markers;
+  const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag &
+                                 SEQ_MARKER_TRANS) != 0;
+  /* Shuffle non strips with no effects attached. */
+  SeqCollection *standalone_strips = extract_standalone_strips(transformed_strips);
+  SEQ_transform_seqbase_shuffle_time(
+      standalone_strips, seqbase, t->scene, markers, use_sync_markers);
+  SEQ_collection_free(standalone_strips);
+}
+
 static void seq_transform_handle_overlap(TransInfo *t, SeqCollection *transformed_strips)
 {
   ListBase *seqbasep = seqbase_from_trans_info(t);
+  const eSeqOverlapMode overlap_mode = SEQ_tool_settings_overlap_mode_get(t->scene);
 
-  /* Modes */
-  const bool overwrite = true;
-  const bool default_mode = false;
-  const bool expand = t->flag & T_ALT_TRANSFORM;
-
-  if (expand) {
-    seq_transform_handle_expand_to_fit(t, transformed_strips);
-  }
-  else if (overwrite) {
-    seq_transform_handle_overwrite(t, transformed_strips);
-  }
-  else if (default_mode) {
-    ListBase *markers = &t->scene->markers;
-    const bool use_sync_markers = (((SpaceSeq *)t->area->spacedata.first)->flag &
-                                   SEQ_MARKER_TRANS) != 0;
-    /* Shuffle non strips with no effects attached. */
-    SeqCollection *standalone_strips = extract_standalone_strips(transformed_strips);
-    SEQ_transform_seqbase_shuffle_time(
-        standalone_strips, seqbasep, t->scene, markers, use_sync_markers);
-    SEQ_collection_free(standalone_strips);
+  switch (overlap_mode) {
+    case SEQ_OVERLAP_EXPAND:
+      seq_transform_handle_expand_to_fit(t, transformed_strips);
+      break;
+    case SEQ_OVERLAP_OVERWRITE:
+      seq_transform_handle_overwrite(t, transformed_strips);
+      break;
+    case SEQ_OVERLAP_SHUFFLE:
+      seq_transform_handle_overlap_shuffle(t, transformed_strips);
+      break;
   }
 
   if (seq_transform_check_strip_effects(transformed_strips)) {
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index cd752b220a3..89361e6f127 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -1338,12 +1338,19 @@ typedef struct SequencerToolSettings {
   int fit_method;
   short snap_mode;
   short snap_flag;
-  int _pad0;
+  /* eSeqOverlapMode */
+  int overlap_mode;
   /** When there are many snap points, 0-1 range corresponds to resolution from boundbox to all
    * possible snap points. */
   int snap_distance;
 } SequencerToolSettings;
 
+typedef enum eSeqOverlapMode {
+  SEQ_OVERLAP_EXPAND,
+  SEQ_OVERLAP_OVERWRITE,
+  SEQ_OVERLAP_SHUFFLE,
+} eSeqOverlapMode;
+
 typedef enum eSeqImageFitMethod {
   SEQ_SCALE_TO_FIT,
   SEQ_SCALE_TO_FILL,
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 5c9c7b50339..a79aea04b63 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -3508,6 +3508,21 @@ static void rna_def_sequencer_tool_settings(BlenderRNA *brna)
       {0, NULL, 0, NULL, NULL},
   };
 
+  static const EnumPropertyItem scale_overlap_modes[] = {
+      {SEQ_OVERLAP_EXPAND, "EXPAND", 0, "Expand", "Move strips so transformed strips fits"},
+      {SEQ_OVERLAP_OVERWRITE,
+       "OVERWRITE",
+       0,
+       "Overwrite",
+       "Trim or split strips to resolve overlap"},
+      {SEQ_OVERLAP_SHUFFLE,
+       "SHUFFLE",
+       0,
+       "Shuffle",
+       "Move transformed strips to nearest free space to resolve overlap"},
+      {0, NULL, 0, NULL, NULL},
+  };
+
   srna = RNA_def_struct(brna, "SequencerToolSettings", NULL);
   RNA_def_struct_path_func(srna, "rna_SequencerToolSettings_path");
   RNA_def_struct_ui_text(srna, "Sequencer Tool Settings", "");
@@ -3546,6 +3561,11 @@ static void rna_def_sequencer_tool_settings(BlenderRNA *brna)
   RNA_def_property_int_default(prop, 15);
   RNA_def_property_ui_range(prop, 0, 50, 1, 1);
   RNA_def_property_ui_text(prop, "Snapping Distance", "Maximum distance for snapping in pixels");
+
+  /* Transform overlap handling. */
+  prop = RNA_def_property(srna, "overlap_mode", PROP_ENUM, PROP_NONE);
+  RNA_def_property_enum_items(prop, scale_overlap_modes);
+  RNA_def_property_ui_text(prop, "Overlap Mode", "How to resolve overlap after transformation");
 }
 
 static void rna_def_unified_paint_settings(BlenderRNA *brna)
diff --git a/source/blender/sequencer/SEQ_sequencer.h b/source/blender/sequencer/SEQ_sequencer.h
index f4338d13c8f..f65294812b5 100644
--- a/source/blender/sequencer/SEQ_sequencer.h
+++ b/source/blender/sequencer/SEQ_sequencer.h
@@ -58,6 +58,7 @@ void SEQ_tool_settings_fit_method_set(struct Scene *scene, eSeqImageFitMethod fi
 short SEQ_tool_settings_snap_flag_get(struct Scene *scene);
 short SEQ_tool_settings_snap_mode_get(struct Scene *scene);
 int SEQ_tool_settings_snap_distance_get(struct Scene *scene);
+eSeqOverlapMode SEQ_tool_settings_overlap_mode_get(struct Scene *scene);
 struct SequencerToolSettings *SEQ_tool_settings_copy(struct SequencerToolSettings *tool_settings);
 struct Editing *SEQ_editing_get(struct Scene *scene, bool alloc);
 struct Editing *SEQ_editing_ensure(struct Scene *scene);
diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c
index 7dc19cf39a6..00f6ebc203a 100644
--- a/source/blender/sequencer/intern/sequencer.c
+++ b/source/blender/sequencer/intern/sequencer.c
@@ -314,6 +314,8 @@ SequencerToolSettings *SEQ_tool_settings_init(void)
   tool_settings->snap_mode = SEQ_SNAP_TO_STRIPS | SEQ_SNAP_TO_CURRENT_FRAME |
                              SEQ_SNAP_TO_STRIP_HOLD;
   tool_settings->snap_distance = 15;
+  tool_settings->overlap_mode = SEQ_OVERLAP_SHUFFLE;
+
   return tool_settings;
 }
 
@@ -363,6 +365,12 @@ void SEQ_tool_settings_fit_method_set(Scene *scene, eSeqImageFitMethod fit_metho
   tool_settings->fit_method = fit_method;
 }
 
+eSeqOverlapMode SEQ_tool_settings_overlap_mode_get(Scene *scene)
+{
+  const SequencerToolSettings *tool_settings = SEQ_tool_settings_ensure(scene);
+  return tool_settings->overlap_mode;
+}
+
 /**
  * Get seqbase that is being viewed currently. This can be main seqbase or meta strip seqbase
  *



More information about the Bf-blender-cvs mailing list