Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/animation/anim_markers.c215
-rw-r--r--source/blender/editors/include/ED_markers.h2
-rw-r--r--source/blender/editors/space_action/space_action.c2
-rw-r--r--source/blender/editors/space_graph/space_graph.c2
-rw-r--r--source/blender/editors/space_nla/space_nla.c2
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c2
6 files changed, 170 insertions, 55 deletions
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 35b163ec5be..200eca263f5 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -82,6 +82,8 @@ static ListBase *context_get_markers(const bContext *C)
return &CTX_data_scene(C)->markers;
}
+/* --------------------------------- */
+
/* Get the marker that is closest to this point */
/* XXX for select, the min_dist should be small */
TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x)
@@ -175,6 +177,8 @@ void ED_markers_get_minmax (ListBase *markers, short sel, float *first, float *l
*last= max;
}
+/* --------------------------------- */
+
/* Adds a marker to list of cfra elems */
void add_marker_to_cfra_elem(ListBase *lb, TimeMarker *marker, short only_sel)
{
@@ -218,6 +222,23 @@ void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short only_sel)
add_marker_to_cfra_elem(lb, marker, only_sel);
}
+/* --------------------------------- */
+
+/* This function checks if there are any markers selected at all */
+short ED_markers_has_selected(ListBase *markers)
+{
+ TimeMarker *marker;
+
+ if (markers) {
+ for (marker = markers->first; marker; marker = marker->next) {
+ if (marker->flag & SELECT)
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
/* ************* Marker Drawing ************ */
/* function to draw markers */
@@ -239,10 +260,11 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
/* vertical line - dotted */
#ifdef DURIAN_CAMERA_SWITCH
- if ((marker->camera) || (flag & DRAW_MARKERS_LINES)) {
+ if ((marker->camera) || (flag & DRAW_MARKERS_LINES))
#else
- if (flag & DRAW_MARKERS_LINES) {
+ if (flag & DRAW_MARKERS_LINES)
#endif
+ {
setlinestyle(3);
if (marker->flag & SELECT)
@@ -333,6 +355,84 @@ void draw_markers_time(const bContext *C, int flag)
}
}
+/* ************************ Marker Wrappers API ********************* */
+/* These wrappers allow marker operators to function within the confines
+ * of standard animation editors, such that they can coexist with the
+ * primary operations of those editors.
+ */
+
+/* maximum y-axis value (in region screen-space) that marker events should still be accepted for */
+#define ANIMEDIT_MARKER_YAXIS_MAX 30
+
+/* ------------------------ */
+
+/* special poll() which checks if there are selected markers first */
+static int ed_markers_poll_selected_markers(bContext *C)
+{
+ ListBase *markers = context_get_markers(C);
+
+ /* first things first: markers can only exist in timeline views */
+ if (ED_operator_animview_active(C) == 0)
+ return 0;
+
+ /* check if some marker is selected */
+ return ED_markers_has_selected(markers);
+}
+
+/* ------------------------ */
+
+/* Second-tier invoke() callback that performs context validation before running the
+ * "custom"/third-tier invoke() callback supplied as the last arg (which would normally
+ * be the operator's invoke() callback elsewhere)
+ *
+ * < invoke_func: (fn(bContext*, wmOperator*, wmEvent*)=int) "standard" invoke function
+ * that operator would otherwise have used. If NULL, the operator's standard
+ * exec() callback will be called instead in the appropriate places.
+ */
+static int ed_markers_opwrap_invoke_custom(bContext *C, wmOperator *op, wmEvent *evt,
+ int (*invoke_func)(bContext*,wmOperator*,wmEvent*))
+{
+ ScrArea *sa = CTX_wm_area(C);
+ int retval = OPERATOR_PASS_THROUGH;
+
+ /* only timeline view doesn't need calling-location validation as it's the only dedicated view */
+ if (sa->spacetype != SPACE_TIME) {
+ /* restrict y-values to within ANIMEDIT_MARKER_YAXIS_MAX of the view's vertical extents, including scrollbars */
+ if (evt->mval[1] > ANIMEDIT_MARKER_YAXIS_MAX) {
+ /* not ok... "pass-through" to let normal editor's operators have a chance at tackling this event... */
+ //printf("MARKER-WRAPPER-DEBUG: event mval[1] = %d, so over accepted tolerance\n", evt->mval[1]);
+ return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
+ }
+ }
+
+ /* allow operator to run now */
+ if (invoke_func)
+ retval = invoke_func(C, op, evt);
+ else if (op->type->exec)
+ retval = op->type->exec(C, op);
+ else
+ BKE_report(op->reports, RPT_ERROR, "Programming error: operator doesn't actually have code to do anything!");
+
+ /* return status modifications - for now, make this spacetype dependent as above */
+ if (sa->spacetype != SPACE_TIME) {
+ /* unless successful, must add "pass-through" to let normal operator's have a chance at tackling this event */
+ if (retval != OPERATOR_FINISHED)
+ retval |= OPERATOR_PASS_THROUGH;
+ }
+
+ return retval;
+}
+
+/* standard wrapper - first-tier invoke() callback to be directly assigned to operator typedata
+ * for operators which don't need any special invoke calls. Any operators with special invoke calls
+ * though will need to implement their own wrapper which calls the second-tier callback themselves
+ * (passing through the custom invoke function they use)
+ */
+static int ed_markers_opwrap_invoke(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, NULL);
+}
+
/* ************************** add markers *************************** */
/* add TimeMarker at curent frame */
@@ -376,6 +476,7 @@ static void MARKER_OT_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_add;
+ ot->invoke = ed_markers_opwrap_invoke;
ot->poll= ED_operator_animview_active;
/* flags */
@@ -396,7 +497,7 @@ functions:
exit() cleanup, send notifier
- cancel() to escpae from modal
+ cancel() to escape from modal
callbacks:
@@ -488,6 +589,11 @@ static int ed_marker_move_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return OPERATOR_CANCELLED;
}
+static int ed_marker_move_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_move_invoke);
+}
+
/* note, init has to be called succesfully */
static void ed_marker_move_apply(wmOperator *op)
{
@@ -665,9 +771,9 @@ static void MARKER_OT_move(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_move_exec;
- ot->invoke= ed_marker_move_invoke;
+ ot->invoke= ed_marker_move_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_animview_active;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO|OPTYPE_BLOCKING|OPTYPE_GRAB_POINTER;
@@ -744,6 +850,11 @@ static int ed_marker_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return ed_marker_move_invoke(C, op, evt);
}
+static int ed_marker_duplicate_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_duplicate_invoke);
+}
+
static void MARKER_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
@@ -753,9 +864,9 @@ static void MARKER_OT_duplicate(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_duplicate_exec;
- ot->invoke= ed_marker_duplicate_invoke;
+ ot->invoke= ed_marker_duplicate_invoke_wrapper;
ot->modal= ed_marker_move_modal;
- ot->poll= ED_operator_animview_active;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -794,7 +905,7 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
float viewx;
int x, y, cfra;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_PASS_THROUGH;
x= evt->x - CTX_wm_region(C)->winrct.xmin;
@@ -811,27 +922,27 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
#ifdef DURIAN_CAMERA_SWITCH
- if(camera) {
+ if (camera) {
Scene *scene= CTX_data_scene(C);
Base *base;
TimeMarker *marker;
int sel= 0;
-
+
if (!extend)
scene_deselect_all(scene);
-
+
for (marker= markers->first; marker; marker= marker->next) {
if(marker->frame==cfra) {
sel= (marker->flag & SELECT);
break;
}
}
-
+
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->camera) {
- if(marker->frame==cfra) {
+ if (marker->camera) {
+ if (marker->frame==cfra) {
base= object_in_scene(marker->camera, scene);
- if(base) {
+ if (base) {
ED_base_object_select(base, sel);
if(sel)
ED_base_object_activate(C, base);
@@ -839,7 +950,7 @@ static int ed_marker_select(bContext *C, wmEvent *evt, int extend, int camera)
}
}
}
-
+
WM_event_add_notifier(C, NC_SCENE|ND_OB_SELECT, scene);
}
#endif
@@ -861,6 +972,11 @@ static int ed_marker_select_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return ed_marker_select(C, evt, extend, camera);
}
+static int ed_marker_select_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, ed_marker_select_invoke);
+}
+
static void MARKER_OT_select(wmOperatorType *ot)
{
/* identifiers */
@@ -869,7 +985,7 @@ static void MARKER_OT_select(wmOperatorType *ot)
ot->idname= "MARKER_OT_select";
/* api callbacks */
- ot->invoke= ed_marker_select_invoke;
+ ot->invoke= ed_marker_select_invoke_wrapper;
ot->poll= ED_operator_animview_active;
/* flags */
@@ -917,24 +1033,18 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(v2d, xmin, ymin, &xminf, &yminf);
UI_view2d_region_to_view(v2d, xmax, ymax, &xmaxf, &ymaxf);
- /* XXX disputable */
- if(yminf > 30.0f || ymaxf < 0.0f)
- return 0;
-
- if(markers == NULL)
+ if (markers == NULL)
return 0;
/* XXX marker context */
- for(marker= markers->first; marker; marker= marker->next) {
+ for (marker= markers->first; marker; marker= marker->next) {
if ((marker->frame > xminf) && (marker->frame <= xmaxf)) {
switch (gesture_mode) {
case GESTURE_MODAL_SELECT:
- if ((marker->flag & SELECT) == 0)
- marker->flag |= SELECT;
+ marker->flag |= SELECT;
break;
case GESTURE_MODAL_DESELECT:
- if (marker->flag & SELECT)
- marker->flag &= ~SELECT;
+ marker->flag &= ~SELECT;
break;
}
}
@@ -946,6 +1056,11 @@ static int ed_marker_border_select_exec(bContext *C, wmOperator *op)
return 1;
}
+static int ed_marker_select_border_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_border_select_invoke);
+}
+
static void MARKER_OT_select_border(wmOperatorType *ot)
{
/* identifiers */
@@ -955,7 +1070,7 @@ static void MARKER_OT_select_border(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_border_select_exec;
- ot->invoke= WM_border_select_invoke;
+ ot->invoke= ed_marker_select_border_invoke_wrapper;
ot->modal= WM_border_select_modal;
ot->poll= ED_operator_animview_active;
@@ -975,17 +1090,11 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
TimeMarker *marker;
int action = RNA_enum_get(op->ptr, "action");
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
if (action == SEL_TOGGLE) {
- action = SEL_SELECT;
- for(marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
- action = SEL_DESELECT;
- break;
- }
- }
+ action = (ED_markers_has_selected(markers)) ? SEL_DESELECT : SEL_SELECT;
}
for(marker= markers->first; marker; marker= marker->next) {
@@ -997,11 +1106,7 @@ static int ed_marker_select_all_exec(bContext *C, wmOperator *op)
marker->flag &= ~SELECT;
break;
case SEL_INVERT:
- if (marker->flag & SELECT) {
- marker->flag &= ~SELECT;
- } else {
- marker->flag |= SELECT;
- }
+ marker->flag ^= SELECT;
break;
}
}
@@ -1021,6 +1126,7 @@ static void MARKER_OT_select_all(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_select_all_exec;
+ ot->invoke = ed_markers_opwrap_invoke;
ot->poll= ED_operator_animview_active;
/* flags */
@@ -1039,12 +1145,12 @@ static int ed_marker_delete_exec(bContext *C, wmOperator *UNUSED(op))
TimeMarker *marker, *nmarker;
short changed= 0;
- if(markers == NULL)
+ if (markers == NULL)
return OPERATOR_CANCELLED;
- for(marker= markers->first; marker; marker= nmarker) {
+ for (marker= markers->first; marker; marker= nmarker) {
nmarker= marker->next;
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
BLI_freelinkN(markers, marker);
changed= 1;
}
@@ -1058,6 +1164,11 @@ static int ed_marker_delete_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
+static int ed_marker_delete_invoke_wrapper(bContext *C, wmOperator *op, wmEvent *evt)
+{
+ // XXX: must we keep these confirmations?
+ return ed_markers_opwrap_invoke_custom(C, op, evt, WM_operator_confirm);
+}
static void MARKER_OT_delete(wmOperatorType *ot)
{
@@ -1067,9 +1178,9 @@ static void MARKER_OT_delete(wmOperatorType *ot)
ot->idname= "MARKER_OT_delete";
/* api callbacks */
- ot->invoke= WM_operator_confirm;
+ ot->invoke= ed_marker_delete_invoke_wrapper;
ot->exec= ed_marker_delete_exec;
- ot->poll= ED_operator_animview_active;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1084,19 +1195,19 @@ static int ed_marker_make_links_scene_exec(bContext *C, wmOperator *op)
Scene *scene_to= BLI_findlink(&CTX_data_main(C)->scene, RNA_enum_get(op->ptr, "scene"));
TimeMarker *marker, *marker_new;
- if(scene_to==NULL) {
+ if (scene_to==NULL) {
BKE_report(op->reports, RPT_ERROR, "Scene not found");
return OPERATOR_CANCELLED;
}
- if(scene_to == CTX_data_scene(C)) {
+ if (scene_to == CTX_data_scene(C)) {
BKE_report(op->reports, RPT_ERROR, "Can't re-link markers into the same scene");
return OPERATOR_CANCELLED;
}
/* copy markers */
for (marker= markers->first; marker; marker= marker->next) {
- if(marker->flag & SELECT) {
+ if (marker->flag & SELECT) {
marker_new= MEM_dupallocN(marker);
marker_new->prev= marker_new->next = NULL;
@@ -1118,7 +1229,8 @@ static void MARKER_OT_make_links_scene(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_make_links_scene_exec;
- ot->poll= ED_operator_animview_active;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1167,7 +1279,8 @@ static void MARKER_OT_camera_bind(wmOperatorType *ot)
/* api callbacks */
ot->exec= ed_marker_camera_bind_exec;
- ot->poll= ED_operator_animview_active;
+ ot->invoke = ed_markers_opwrap_invoke;
+ ot->poll= ed_markers_poll_selected_markers;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index e5e1f3cef10..54c1b473bd8 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -51,6 +51,8 @@ void ED_markers_get_minmax(ListBase *markers, short sel, float *first, float *la
void ED_markers_make_cfra_list(ListBase *markers, ListBase *lb, short sel);
+short ED_markers_has_selected(ListBase *markers);
+
/* Operators ------------------------------ */
/* called in screen_ops.c:ED_operatortypes_screen() */
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index 678558e6450..a2d116797e3 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -456,7 +456,7 @@ void ED_spacetype_action(void)
art->init= action_main_area_init;
art->draw= action_main_area_draw;
art->listener= action_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index b3636f6ccf2..d9d1f0ae3e4 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -599,7 +599,7 @@ void ED_spacetype_ipo(void)
art->init= graph_main_area_init;
art->draw= graph_main_area_draw;
art->listener= graph_region_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index 3bff1d4159f..814b7c0c2c3 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -514,7 +514,7 @@ void ED_spacetype_nla(void)
art->init= nla_main_area_init;
art->draw= nla_main_area_draw;
art->listener= nla_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D/*|ED_KEYMAP_MARKERS*/|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_ANIMATION|ED_KEYMAP_FRAMES;
BLI_addhead(&st->regiontypes, art);
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 179db47ae12..3dd8a29eac3 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -518,7 +518,7 @@ void ED_spacetype_sequencer(void)
art->init= sequencer_main_area_init;
art->draw= sequencer_main_area_draw;
art->listener= sequencer_main_area_listener;
- art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
+ art->keymapflag= ED_KEYMAP_VIEW2D|ED_KEYMAP_MARKERS|ED_KEYMAP_FRAMES|ED_KEYMAP_ANIMATION;
BLI_addhead(&st->regiontypes, art);