VSE: Add Overlay popover panels
Add panels with overlay settings for strips and preview and overlay enable/disable button. Entries from the View menus moved to the overlay panels, which will simplify cluttered View menus. Additional options have been added: - Strip Name - Strip Source(ex. path) - Strip Duration So users can now select what info they need to see on the strips. When No text is displayed, waveforms are drawn in full height. Reviewed By: ISS, HooglyBoogly, pablovazquez Differential Revision: https://developer.blender.org/D9751
This commit is contained in:
parent
f44dea0558
commit
fad80a95fd
Notes:
blender-bot
2023-05-22 12:40:41 +02:00
Referenced by issue #84529, Crash when having a scene strip in VSE that references a scene that has been deleted
|
@ -139,12 +139,11 @@ class SEQUENCER_HT_header(Header):
|
|||
|
||||
SEQUENCER_MT_editor_menus.draw_collapsible(context, layout)
|
||||
|
||||
layout.separator_spacer()
|
||||
|
||||
if st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}:
|
||||
|
||||
layout.separator_spacer()
|
||||
|
||||
layout.prop(st, "display_mode", text="", icon_only=True)
|
||||
|
||||
layout.prop(st, "preview_channels", text="", icon_only=True)
|
||||
|
||||
gpd = context.gpencil_data
|
||||
|
@ -158,6 +157,13 @@ class SEQUENCER_HT_header(Header):
|
|||
row.prop(tool_settings, "proportional_edit_falloff", icon_only=True)
|
||||
|
||||
|
||||
row = layout.row(align=True)
|
||||
row.prop(st, "show_strip_overlay", text="", icon='OVERLAY')
|
||||
sub = row.row(align=True)
|
||||
sub.popover(panel="SEQUENCER_PT_overlay", text="")
|
||||
sub.active = st.show_strip_overlay
|
||||
|
||||
|
||||
class SEQUENCER_MT_editor_menus(Menu):
|
||||
bl_idname = "SEQUENCER_MT_editor_menus"
|
||||
bl_label = ""
|
||||
|
@ -176,6 +182,83 @@ class SEQUENCER_MT_editor_menus(Menu):
|
|||
layout.menu("SEQUENCER_MT_strip")
|
||||
|
||||
|
||||
class SEQUENCER_PT_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
bl_label = "Overlays"
|
||||
bl_ui_units_x = 7
|
||||
|
||||
def draw(self, _context):
|
||||
pass
|
||||
|
||||
|
||||
class SEQUENCER_PT_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
bl_label = "Overlays"
|
||||
bl_ui_units_x = 7
|
||||
|
||||
def draw(self, _context):
|
||||
pass
|
||||
|
||||
|
||||
class SEQUENCER_PT_preview_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
bl_parent_id = 'SEQUENCER_PT_overlay'
|
||||
bl_label = "Preview Overlays"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
st = context.space_data
|
||||
return st.view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'} and st.display_mode == 'IMAGE'
|
||||
|
||||
|
||||
def draw(self, context):
|
||||
ed = context.scene.sequence_editor
|
||||
st = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
layout.active = st.show_strip_overlay
|
||||
layout.prop(ed, "show_overlay", text="Frame Overlay")
|
||||
layout.prop(st, "show_safe_areas", text="Safe Areas")
|
||||
layout.prop(st, "show_metadata", text="Metadata")
|
||||
layout.prop(st, "show_annotation", text="Annotations")
|
||||
|
||||
|
||||
class SEQUENCER_PT_sequencer_overlay(Panel):
|
||||
bl_space_type = 'SEQUENCE_EDITOR'
|
||||
bl_region_type = 'HEADER'
|
||||
bl_parent_id = 'SEQUENCER_PT_overlay'
|
||||
bl_label = "Sequencer Overlays"
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
st = context.space_data
|
||||
return st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}
|
||||
|
||||
|
||||
def draw(self, context):
|
||||
st = context.space_data
|
||||
layout = self.layout
|
||||
|
||||
layout.active = st.show_strip_overlay
|
||||
|
||||
layout.prop(st, "show_strip_name", text="Name")
|
||||
layout.prop(st, "show_strip_source", text="Source")
|
||||
layout.prop(st, "show_strip_duration", text="Duration")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.prop(st, "show_strip_offset", text="Offsets")
|
||||
layout.prop(st, "show_fcurves", text="F-Curves")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.prop_menu_enum(st, "waveform_display_type")
|
||||
|
||||
|
||||
|
||||
class SEQUENCER_MT_view_cache(Menu):
|
||||
bl_label = "Cache"
|
||||
|
||||
|
@ -294,6 +377,12 @@ class SEQUENCER_MT_view(Menu):
|
|||
layout.operator("view2d.zoom_border", text="Zoom")
|
||||
layout.menu("SEQUENCER_MT_preview_zoom")
|
||||
|
||||
if st.display_mode == 'IMAGE':
|
||||
layout.prop(st, "use_zoom_to_fit")
|
||||
elif st.display_mode == 'WAVEFORM':
|
||||
layout.separator()
|
||||
layout.prop(st, "show_separate_color", text="Show Separate Color Channels")
|
||||
|
||||
layout.separator()
|
||||
|
||||
layout.menu("SEQUENCER_MT_proxy")
|
||||
|
@ -318,22 +407,8 @@ class SEQUENCER_MT_view(Menu):
|
|||
|
||||
layout.separator()
|
||||
layout.prop(st, "show_seconds")
|
||||
layout.prop(st, "show_strip_offset")
|
||||
layout.prop(st, "show_fcurves")
|
||||
layout.prop(st, "show_markers")
|
||||
layout.menu("SEQUENCER_MT_view_cache", text="Show Cache")
|
||||
layout.prop_menu_enum(st, "waveform_display_type", text="Show Waveforms")
|
||||
|
||||
if is_preview:
|
||||
layout.separator()
|
||||
if st.display_mode == 'IMAGE':
|
||||
layout.prop(st, "use_zoom_to_fit")
|
||||
layout.prop(ed, "show_overlay", text="Show Frame Overlay")
|
||||
layout.prop(st, "show_safe_areas", text="Show Safe Areas")
|
||||
layout.prop(st, "show_metadata", text="Show Metadata")
|
||||
layout.prop(st, "show_annotation", text="Show Annotations")
|
||||
elif st.display_mode == 'WAVEFORM':
|
||||
layout.prop(st, "show_separate_color", text="Show Separate Color Channels")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@ -2222,6 +2297,10 @@ classes = (
|
|||
SEQUENCER_PT_active_tool,
|
||||
SEQUENCER_PT_strip,
|
||||
|
||||
SEQUENCER_PT_overlay,
|
||||
SEQUENCER_PT_preview_overlay,
|
||||
SEQUENCER_PT_sequencer_overlay,
|
||||
|
||||
SEQUENCER_PT_effect,
|
||||
SEQUENCER_PT_scene,
|
||||
SEQUENCER_PT_mask,
|
||||
|
|
|
@ -39,7 +39,7 @@ extern "C" {
|
|||
|
||||
/* Blender file format version. */
|
||||
#define BLENDER_FILE_VERSION BLENDER_VERSION
|
||||
#define BLENDER_FILE_SUBVERSION 6
|
||||
#define BLENDER_FILE_SUBVERSION 7
|
||||
|
||||
/* Minimum Blender version that supports reading file written with the current
|
||||
* version. Older Blender versions will test this and show a warning if the file
|
||||
|
|
|
@ -1234,18 +1234,7 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Versioning code until next subversion bump goes here.
|
||||
*
|
||||
* \note Be sure to check when bumping the version:
|
||||
* - "versioning_userdef.c", #blo_do_versions_userdef
|
||||
* - "versioning_userdef.c", #do_versions_theme
|
||||
*
|
||||
* \note Keep this message at the bottom of the function.
|
||||
*/
|
||||
{
|
||||
/* Keep this block, even when empty. */
|
||||
|
||||
if (!MAIN_VERSION_ATLEAST(bmain, 292, 7)) {
|
||||
/* Make all IDProperties used as interface of geometry node trees overridable. */
|
||||
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
|
||||
LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
|
||||
|
@ -1301,5 +1290,31 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Overlay elements in the sequencer. */
|
||||
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
|
||||
LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
|
||||
LISTBASE_FOREACH (SpaceLink *, sl, &area->spacedata) {
|
||||
if (sl->spacetype == SPACE_SEQ) {
|
||||
SpaceSeq *sseq = (SpaceSeq *)sl;
|
||||
sseq->flag |= (SEQ_SHOW_STRIP_OVERLAY | SEQ_SHOW_STRIP_NAME | SEQ_SHOW_STRIP_SOURCE |
|
||||
SEQ_SHOW_STRIP_DURATION);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Versioning code until next subversion bump goes here.
|
||||
*
|
||||
* \note Be sure to check when bumping the version:
|
||||
* - "versioning_userdef.c", #blo_do_versions_userdef
|
||||
* - "versioning_userdef.c", #do_versions_theme
|
||||
*
|
||||
* \note Keep this message at the bottom of the function.
|
||||
*/
|
||||
{
|
||||
/* Keep this block, even when empty. */
|
||||
}
|
||||
}
|
||||
|
|
|
@ -182,7 +182,8 @@ static void blo_update_defaults_screen(bScreen *screen,
|
|||
}
|
||||
else if (area->spacetype == SPACE_SEQ) {
|
||||
SpaceSeq *seq = area->spacedata.first;
|
||||
seq->flag |= SEQ_SHOW_MARKERS | SEQ_SHOW_FCURVES | SEQ_ZOOM_TO_FIT;
|
||||
seq->flag |= SEQ_SHOW_MARKERS | SEQ_SHOW_FCURVES | SEQ_ZOOM_TO_FIT | SEQ_SHOW_STRIP_OVERLAY |
|
||||
SEQ_SHOW_STRIP_SOURCE | SEQ_SHOW_STRIP_NAME | SEQ_SHOW_STRIP_DURATION;
|
||||
}
|
||||
else if (area->spacetype == SPACE_TEXT) {
|
||||
/* Show syntax and line numbers in Script workspace text editor. */
|
||||
|
|
|
@ -227,16 +227,16 @@ void color3ubv_from_seq(Scene *curscene, Sequence *seq, uchar col[3])
|
|||
* \param x1, x2, y1, y2: The starting and end X value to draw the wave, same for y1 and y2.
|
||||
* \param stepsize: The width of a pixel.
|
||||
*/
|
||||
static void draw_seq_waveform(View2D *v2d,
|
||||
const bContext *C,
|
||||
SpaceSeq *sseq,
|
||||
Scene *scene,
|
||||
Sequence *seq,
|
||||
float x1,
|
||||
float y1,
|
||||
float x2,
|
||||
float y2,
|
||||
float stepsize)
|
||||
static void draw_seq_waveform_overlay(View2D *v2d,
|
||||
const bContext *C,
|
||||
SpaceSeq *sseq,
|
||||
Scene *scene,
|
||||
Sequence *seq,
|
||||
float x1,
|
||||
float y1,
|
||||
float x2,
|
||||
float y2,
|
||||
float stepsize)
|
||||
{
|
||||
/* Offset x1 and x2 values, to match view min/max, if strip is out of bounds. */
|
||||
int x1_offset = max_ff(v2d->cur.xmin, x1);
|
||||
|
@ -603,121 +603,113 @@ static void draw_seq_outline(Sequence *seq,
|
|||
}
|
||||
}
|
||||
|
||||
/* Draw info text on a sequence strip. */
|
||||
static void draw_seq_text(View2D *v2d,
|
||||
Sequence *seq,
|
||||
SpaceSeq *sseq,
|
||||
float x1,
|
||||
float x2,
|
||||
float y1,
|
||||
float y2,
|
||||
bool seq_active,
|
||||
bool y_threshold)
|
||||
const char *draw_seq_text_get_name(SpaceSeq *sseq, Sequence *seq)
|
||||
{
|
||||
rctf rect;
|
||||
char str[32 + FILE_MAX];
|
||||
size_t str_len;
|
||||
const char *name = seq->name + 2;
|
||||
uchar col[4];
|
||||
|
||||
/* All strings should include name. */
|
||||
if (name[0] == '\0') {
|
||||
name = BKE_sequence_give_name(seq);
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
if (ELEM(seq->type, SEQ_TYPE_META, SEQ_TYPE_ADJUSTMENT)) {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
static void draw_seq_text_get_source(SpaceSeq *sseq,
|
||||
Sequence *seq,
|
||||
char *r_source,
|
||||
size_t source_len)
|
||||
{
|
||||
/* Set source for the most common types. */
|
||||
if (ELEM(seq->type, SEQ_TYPE_IMAGE, SEQ_TYPE_MOVIE)) {
|
||||
BLI_snprintf(r_source, source_len, "%s%s", seq->strip->dir, seq->strip->stripdata->name);
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_SCENE) {
|
||||
if (seq->scene) {
|
||||
if (seq->scene_camera) {
|
||||
str_len = BLI_snprintf(str,
|
||||
sizeof(str),
|
||||
"%s: %s (%s) | %d",
|
||||
name,
|
||||
seq->scene->id.name + 2,
|
||||
((ID *)seq->scene_camera)->name + 2,
|
||||
seq->len);
|
||||
}
|
||||
else {
|
||||
str_len = BLI_snprintf(
|
||||
str, sizeof(str), "%s: %s | %d", name, seq->scene->id.name + 2, seq->len);
|
||||
}
|
||||
}
|
||||
else {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
}
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_MOVIECLIP) {
|
||||
if (seq->clip && !STREQ(name, seq->clip->id.name + 2)) {
|
||||
str_len = BLI_snprintf(
|
||||
str, sizeof(str), "%s: %s | %d", name, seq->clip->id.name + 2, seq->len);
|
||||
}
|
||||
else {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
}
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_MASK) {
|
||||
if (seq->mask && !STREQ(name, seq->mask->id.name + 2)) {
|
||||
str_len = BLI_snprintf(
|
||||
str, sizeof(str), "%s: %s | %d", name, seq->mask->id.name + 2, seq->len);
|
||||
}
|
||||
else {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
else if (seq->type == SEQ_TYPE_SOUND_RAM) {
|
||||
if (seq->sound) {
|
||||
BLI_snprintf(r_source, source_len, "%s", seq->sound->filepath);
|
||||
}
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_MULTICAM) {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "Cam %s: %d", name, seq->multicam_source);
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_IMAGE) {
|
||||
str_len = BLI_snprintf(str,
|
||||
sizeof(str),
|
||||
"%s: %s%s | %d",
|
||||
name,
|
||||
seq->strip->dir,
|
||||
seq->strip->stripdata->name,
|
||||
seq->len);
|
||||
BLI_snprintf(r_source, source_len, "Channel: %d", seq->multicam_source);
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_TEXT) {
|
||||
TextVars *textdata = seq->effectdata;
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", textdata->text, seq->startdisp);
|
||||
BLI_snprintf(r_source, source_len, "%s", textdata->text);
|
||||
}
|
||||
else if (seq->type & SEQ_TYPE_EFFECT) {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_SOUND_RAM) {
|
||||
/* If a waveform is drawn, avoid to draw text when there is not enough vertical space. */
|
||||
if (!y_threshold && (sseq->flag & SEQ_NO_WAVEFORMS) == 0 &&
|
||||
((sseq->flag & SEQ_ALL_WAVEFORMS) || (seq->flag & SEQ_AUDIO_DRAW_WAVEFORM))) {
|
||||
|
||||
str[0] = 0;
|
||||
str_len = 0;
|
||||
}
|
||||
else if (seq->sound) {
|
||||
str_len = BLI_snprintf(
|
||||
str, sizeof(str), "%s: %s | %d", name, seq->sound->filepath, seq->len);
|
||||
else if (seq->type == SEQ_TYPE_SCENE) {
|
||||
if (seq->scene_camera) {
|
||||
BLI_snprintf(r_source,
|
||||
source_len,
|
||||
"%s (%s)",
|
||||
seq->scene->id.name + 2,
|
||||
((ID *)seq->scene_camera)->name + 2);
|
||||
}
|
||||
else {
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
BLI_snprintf(r_source, source_len, "%s", seq->scene->id.name + 2);
|
||||
}
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_MOVIE) {
|
||||
str_len = BLI_snprintf(str,
|
||||
sizeof(str),
|
||||
"%s: %s%s | %d",
|
||||
name,
|
||||
seq->strip->dir,
|
||||
seq->strip->stripdata->name,
|
||||
seq->len);
|
||||
else if (seq->type == SEQ_TYPE_MOVIECLIP) {
|
||||
BLI_snprintf(r_source, source_len, "%s", seq->clip->id.name + 2);
|
||||
}
|
||||
else if (seq->type == SEQ_TYPE_MASK) {
|
||||
BLI_snprintf(r_source, source_len, "%s", seq->mask->id.name + 2);
|
||||
}
|
||||
else {
|
||||
/* Should never get here!, but might with files from future. */
|
||||
BLI_assert(0);
|
||||
*r_source = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
str_len = BLI_snprintf(str, sizeof(str), "%s | %d", name, seq->len);
|
||||
static size_t draw_seq_text_get_overlay_string(SpaceSeq *sseq,
|
||||
Sequence *seq,
|
||||
char *r_overlay_string,
|
||||
size_t overlay_string_len)
|
||||
{
|
||||
const char *name = draw_seq_text_get_name(sseq, seq);
|
||||
char source[FILE_MAX];
|
||||
int strip_duration = seq->enddisp - seq->startdisp;
|
||||
draw_seq_text_get_source(sseq, seq, source, sizeof(source));
|
||||
|
||||
bool show_name = sseq->flag & SEQ_SHOW_STRIP_NAME;
|
||||
bool show_source = (sseq->flag & (SEQ_SHOW_STRIP_SOURCE)) && source[0] != '\0';
|
||||
bool show_duration = sseq->flag & SEQ_SHOW_STRIP_DURATION;
|
||||
|
||||
size_t string_len = 0;
|
||||
if (show_name) {
|
||||
string_len = BLI_snprintf(r_overlay_string, overlay_string_len, "%s", name);
|
||||
if (show_source || show_duration) {
|
||||
string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, " | ");
|
||||
}
|
||||
}
|
||||
if (show_source) {
|
||||
string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, "%s", source);
|
||||
if (show_duration) {
|
||||
string_len += BLI_snprintf(r_overlay_string + string_len, overlay_string_len, " | ");
|
||||
}
|
||||
}
|
||||
if (show_duration) {
|
||||
string_len += BLI_snprintf(
|
||||
r_overlay_string + string_len, overlay_string_len, "%d", strip_duration);
|
||||
}
|
||||
return string_len;
|
||||
}
|
||||
|
||||
/* Draw info text on a sequence strip. */
|
||||
static void draw_seq_text_overlay(View2D *v2d,
|
||||
Sequence *seq,
|
||||
SpaceSeq *sseq,
|
||||
float x1,
|
||||
float x2,
|
||||
float y1,
|
||||
float y2,
|
||||
bool seq_active)
|
||||
{
|
||||
char overlay_string[FILE_MAX];
|
||||
size_t overlay_string_len = draw_seq_text_get_overlay_string(
|
||||
sseq, seq, overlay_string, sizeof(overlay_string));
|
||||
|
||||
if (overlay_string_len == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* White text for the active strip. */
|
||||
uchar col[4];
|
||||
col[0] = col[1] = col[2] = seq_active ? 255 : 10;
|
||||
col[3] = 255;
|
||||
|
||||
|
@ -731,15 +723,16 @@ static void draw_seq_text(View2D *v2d,
|
|||
}
|
||||
}
|
||||
|
||||
rctf rect;
|
||||
rect.xmin = x1;
|
||||
rect.ymin = y1;
|
||||
rect.xmax = x2;
|
||||
rect.ymax = y2;
|
||||
|
||||
UI_view2d_text_cache_add_rectf(v2d, &rect, str, str_len, col);
|
||||
UI_view2d_text_cache_add_rectf(v2d, &rect, overlay_string, overlay_string_len, col);
|
||||
}
|
||||
|
||||
static void draw_sequence_extensions(Scene *scene, Sequence *seq, uint pos, float pixely)
|
||||
static void draw_sequence_extensions_overlay(Scene *scene, Sequence *seq, uint pos, float pixely)
|
||||
{
|
||||
float x1, x2, y1, y2;
|
||||
uchar col[4], blend_col[3];
|
||||
|
@ -988,7 +981,7 @@ static void fcurve_batch_add_verts(GPUVertBuf *vbo,
|
|||
* - Volume for sound strips.
|
||||
* - Opacity for the other types.
|
||||
*/
|
||||
static void draw_seq_fcurve(
|
||||
static void draw_seq_fcurve_overlay(
|
||||
Scene *scene, View2D *v2d, Sequence *seq, float x1, float y1, float x2, float y2, float pixelx)
|
||||
{
|
||||
FCurve *fcu;
|
||||
|
@ -1085,11 +1078,21 @@ static void draw_seq_strip(const bContext *C,
|
|||
x2 = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
|
||||
y2 = seq->machine + SEQ_STRIP_OFSTOP;
|
||||
|
||||
/* Calculate height needed for drawing text on strip. */
|
||||
float text_margin_y = y2 - min_ff(0.40f, 20 * U.dpi_fac * pixely);
|
||||
float text_margin_y;
|
||||
bool y_threshold;
|
||||
if ((sseq->flag & SEQ_SHOW_STRIP_NAME) || (sseq->flag & SEQ_SHOW_STRIP_SOURCE) ||
|
||||
(sseq->flag & SEQ_SHOW_STRIP_DURATION)) {
|
||||
|
||||
/* Is there enough space for drawing something else than text? */
|
||||
bool y_threshold = ((y2 - y1) / pixely) > 20 * U.dpi_fac;
|
||||
/* Calculate height needed for drawing text on strip. */
|
||||
text_margin_y = y2 - min_ff(0.40f, 20 * U.dpi_fac * pixely);
|
||||
|
||||
/* Is there enough space for drawing something else than text? */
|
||||
y_threshold = ((y2 - y1) / pixely) > 20 * U.dpi_fac;
|
||||
}
|
||||
else {
|
||||
text_margin_y = y2;
|
||||
y_threshold = 1;
|
||||
}
|
||||
|
||||
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
|
||||
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
|
||||
|
@ -1102,12 +1105,13 @@ static void draw_seq_strip(const bContext *C,
|
|||
}
|
||||
|
||||
/* Draw strip offsets when flag is enabled or during "solo preview". */
|
||||
if (!is_single_image && (seq->startofs || seq->endofs) && pixely > 0) {
|
||||
if ((sseq->draw_flag & SEQ_DRAW_OFFSET_EXT) || (seq == special_seq_update)) {
|
||||
draw_sequence_extensions(scene, seq, pos, pixely);
|
||||
if ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
|
||||
if (!is_single_image && (seq->startofs || seq->endofs) && pixely > 0) {
|
||||
if ((sseq->draw_flag & SEQ_DRAW_OFFSET_EXT) || (seq == special_seq_update)) {
|
||||
draw_sequence_extensions_overlay(scene, seq, pos, pixely);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
immUnbindProgram();
|
||||
|
||||
x1 = seq->startdisp;
|
||||
|
@ -1118,24 +1122,24 @@ static void draw_seq_strip(const bContext *C,
|
|||
drawmeta_contents(scene, seq, x1, y1, x2, y2);
|
||||
}
|
||||
|
||||
if (sseq->flag & SEQ_SHOW_FCURVES) {
|
||||
draw_seq_fcurve(scene, v2d, seq, x1, y1, x2, y2, pixelx);
|
||||
if ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY) && (sseq->flag & SEQ_SHOW_FCURVES)) {
|
||||
draw_seq_fcurve_overlay(scene, v2d, seq, x1, y1, x2, y2, pixelx);
|
||||
}
|
||||
|
||||
/* Draw sound strip waveform. */
|
||||
if ((seq->type == SEQ_TYPE_SOUND_RAM) && (sseq->flag & SEQ_NO_WAVEFORMS) == 0) {
|
||||
draw_seq_waveform(v2d,
|
||||
C,
|
||||
sseq,
|
||||
scene,
|
||||
seq,
|
||||
x1,
|
||||
y_threshold ? y1 + 0.05f : y1,
|
||||
x2,
|
||||
y_threshold ? text_margin_y : y2,
|
||||
BLI_rctf_size_x(®ion->v2d.cur) / region->winx);
|
||||
if ((seq->type == SEQ_TYPE_SOUND_RAM) && ((sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) &&
|
||||
(sseq->flag & SEQ_NO_WAVEFORMS) == 0) {
|
||||
draw_seq_waveform_overlay(v2d,
|
||||
C,
|
||||
sseq,
|
||||
scene,
|
||||
seq,
|
||||
x1,
|
||||
y_threshold ? y1 + 0.05f : y1,
|
||||
x2,
|
||||
y_threshold ? text_margin_y : y2,
|
||||
BLI_rctf_size_x(®ion->v2d.cur) / region->winx);
|
||||
}
|
||||
|
||||
/* Draw locked state. */
|
||||
if (seq->flag & SEQ_LOCK) {
|
||||
draw_seq_locked(x1, y1, x2, y2);
|
||||
|
@ -1162,11 +1166,21 @@ static void draw_seq_strip(const bContext *C,
|
|||
|
||||
calculate_seq_text_offsets(v2d, seq, &x1, &x2, pixelx);
|
||||
|
||||
/* Don't draw strip if there is not enough vertical or horizontal space. */
|
||||
if (((x2 - x1) > 32 * pixelx * U.dpi_fac) && ((y2 - y1) > 8 * pixely * U.dpi_fac)) {
|
||||
/* Depending on the vertical space, draw text on top or in the center of strip. */
|
||||
draw_seq_text(
|
||||
v2d, seq, sseq, x1, x2, y_threshold ? text_margin_y : y1, y2, seq_active, y_threshold);
|
||||
/* If a waveform is drawn, avoid drawing text when there is not enough vertical space. */
|
||||
if (seq->type == SEQ_TYPE_SOUND_RAM) {
|
||||
if (!y_threshold && (sseq->flag & SEQ_NO_WAVEFORMS) == 0 &&
|
||||
((sseq->flag & SEQ_ALL_WAVEFORMS) || (seq->flag & SEQ_AUDIO_DRAW_WAVEFORM))) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (sseq->flag & SEQ_SHOW_STRIP_OVERLAY) {
|
||||
/* Don't draw strip if there is not enough vertical or horizontal space. */
|
||||
if (((x2 - x1) > 32 * pixelx * U.dpi_fac) && ((y2 - y1) > 8 * pixely * U.dpi_fac)) {
|
||||
/* Depending on the vertical space, draw text on top or in the center of strip. */
|
||||
draw_seq_text_overlay(
|
||||
v2d, seq, sseq, x1, x2, y_threshold ? text_margin_y : y1, y2, seq_active);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1360,7 +1374,7 @@ static void sequencer_display_size(Scene *scene, float r_viewrect[2])
|
|||
r_viewrect[0] *= scene->r.xasp / scene->r.yasp;
|
||||
}
|
||||
|
||||
static void sequencer_draw_gpencil(const bContext *C)
|
||||
static void sequencer_draw_gpencil_overlay(const bContext *C)
|
||||
{
|
||||
/* Draw grease-pencil (image aligned). */
|
||||
ED_annotation_draw_2dimage(C);
|
||||
|
@ -1373,7 +1387,9 @@ static void sequencer_draw_gpencil(const bContext *C)
|
|||
}
|
||||
|
||||
/* Draw content and safety borders borders. */
|
||||
static void sequencer_draw_borders(const SpaceSeq *sseq, const View2D *v2d, const Scene *scene)
|
||||
static void sequencer_draw_borders_overlay(const SpaceSeq *sseq,
|
||||
const View2D *v2d,
|
||||
const Scene *scene)
|
||||
{
|
||||
float x1 = v2d->tot.xmin;
|
||||
float y1 = v2d->tot.ymin;
|
||||
|
@ -1825,17 +1841,17 @@ void sequencer_draw_preview(const bContext *C,
|
|||
C, scene, region, sseq, ibuf, scope, draw_overlay, draw_backdrop);
|
||||
|
||||
/* Draw over image. */
|
||||
if (sseq->flag & SEQ_SHOW_METADATA) {
|
||||
if (sseq->flag & SEQ_SHOW_METADATA && sseq->flag & SEQ_SHOW_STRIP_OVERLAY) {
|
||||
ED_region_image_metadata_draw(0.0, 0.0, ibuf, &v2d->tot, 1.0, 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
if (show_imbuf) {
|
||||
sequencer_draw_borders(sseq, v2d, scene);
|
||||
if (show_imbuf && (sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
|
||||
sequencer_draw_borders_overlay(sseq, v2d, scene);
|
||||
}
|
||||
|
||||
if (draw_gpencil && show_imbuf) {
|
||||
sequencer_draw_gpencil(C);
|
||||
if (draw_gpencil && show_imbuf && (sseq->flag & SEQ_SHOW_STRIP_OVERLAY)) {
|
||||
sequencer_draw_gpencil_overlay(C);
|
||||
}
|
||||
#if 0
|
||||
sequencer_draw_maskedit(C, scene, region, sseq);
|
||||
|
|
|
@ -99,7 +99,8 @@ static SpaceLink *sequencer_create(const ScrArea *UNUSED(area), const Scene *sce
|
|||
sseq->view = SEQ_VIEW_SEQUENCE;
|
||||
sseq->mainb = SEQ_DRAW_IMG_IMBUF;
|
||||
sseq->flag = SEQ_SHOW_GPENCIL | SEQ_USE_ALPHA | SEQ_SHOW_MARKERS | SEQ_SHOW_FCURVES |
|
||||
SEQ_ZOOM_TO_FIT;
|
||||
SEQ_ZOOM_TO_FIT | SEQ_SHOW_STRIP_OVERLAY | SEQ_SHOW_STRIP_NAME |
|
||||
SEQ_SHOW_STRIP_SOURCE | SEQ_SHOW_STRIP_DURATION;
|
||||
|
||||
/* Tool header. */
|
||||
region = MEM_callocN(sizeof(ARegion), "tool header for sequencer");
|
||||
|
@ -706,7 +707,7 @@ static void sequencer_preview_region_draw(const bContext *C, ARegion *region)
|
|||
SpaceSeq *sseq = area->spacedata.first;
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
const bool draw_overlay = (scene->ed && (scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW));
|
||||
const bool draw_overlay = (scene->ed && (scene->ed->over_flag & SEQ_EDIT_OVERLAY_SHOW) && (sseq->flag & SEQ_SHOW_STRIP_OVERLAY));
|
||||
|
||||
/* XXX temp fix for wrong setting in sseq->mainb */
|
||||
if (sseq->mainb == SEQ_DRAW_SEQUENCE) {
|
||||
|
|
|
@ -621,6 +621,10 @@ typedef enum eSpaceSeq_Flag {
|
|||
SEQ_SHOW_METADATA = (1 << 10),
|
||||
SEQ_SHOW_MARKERS = (1 << 11), /* show markers region */
|
||||
SEQ_ZOOM_TO_FIT = (1 << 12),
|
||||
SEQ_SHOW_STRIP_OVERLAY = (1 << 13),
|
||||
SEQ_SHOW_STRIP_NAME = (1 << 14),
|
||||
SEQ_SHOW_STRIP_SOURCE = (1 << 15),
|
||||
SEQ_SHOW_STRIP_DURATION = (1 << 16),
|
||||
} eSpaceSeq_Flag;
|
||||
|
||||
/* SpaceSeq.view */
|
||||
|
|
|
@ -5176,7 +5176,7 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
|
|||
prop = RNA_def_property(srna, "waveform_display_type", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
|
||||
RNA_def_property_enum_items(prop, waveform_type_display_items);
|
||||
RNA_def_property_ui_text(prop, "Waveform Displaying", "How Waveforms are drawn");
|
||||
RNA_def_property_ui_text(prop, "Waveform Display", "How Waveforms are drawn");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "use_zoom_to_fit", PROP_BOOLEAN, PROP_NONE);
|
||||
|
@ -5229,6 +5229,26 @@ static void rna_def_space_sequencer(BlenderRNA *brna)
|
|||
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SHOW_FCURVES);
|
||||
RNA_def_property_ui_text(prop, "Show F-Curves", "Display strip opacity/volume curve");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_strip_overlay", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SHOW_STRIP_OVERLAY);
|
||||
RNA_def_property_ui_text(prop, "Show Overlay", "");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_strip_name", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SHOW_STRIP_NAME);
|
||||
RNA_def_property_ui_text(prop, "Show Name", "");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_strip_source", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SHOW_STRIP_SOURCE);
|
||||
RNA_def_property_ui_text(prop, "Show Source", "Display path to source file, or name of source datablock");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
|
||||
prop = RNA_def_property(srna, "show_strip_duration", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flag", SEQ_SHOW_STRIP_DURATION);
|
||||
RNA_def_property_ui_text(prop, "Show Duration", "");
|
||||
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_SEQUENCER, NULL);
|
||||
}
|
||||
|
||||
static void rna_def_space_text(BlenderRNA *brna)
|
||||
|
|
Loading…
Reference in New Issue