diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-02-15 20:24:09 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-02-15 20:24:09 +0300 |
commit | e05742b64d9a9fcecd42d0a58af1d6d4706c7759 (patch) | |
tree | 489d7a4438c8ba1ef403918aede46bc8db1ec6f0 /source | |
parent | 121c8c258463212077cfb2b7526a2d72d8439d9f (diff) |
added back sequencer RMB select Ctrl/Alt modifier keys.
Diffstat (limited to 'source')
4 files changed, 128 insertions, 101 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index ea1b36af137..a9a3591c54f 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -255,51 +255,45 @@ int mouse_frame_side(View2D *v2d, short mouse_x, int frame ) /* choose the side based on which side of the playhead the mouse is on */ UI_view2d_region_to_view(v2d, mval[0], mval[1], &mouseloc[0], &mouseloc[1]); - return mouseloc[0] > frame; + return mouseloc[0] > frame ? SEQ_SIDE_RIGHT : SEQ_SIDE_LEFT; } Sequence *find_neighboring_sequence(Scene *scene, Sequence *test, int lr, int sel) { -/* looks to the left on lr==1, to the right on lr==2 - sel - 0==unselected, 1==selected, -1==done care*/ + /* sel - 0==unselected, 1==selected, -1==done care*/ Sequence *seq; Editing *ed= seq_give_editing(scene, FALSE); - if(ed==NULL) return NULL; if (sel>0) sel = SELECT; - seq= ed->seqbasep->first; - while(seq) { + for(seq= ed->seqbasep->first; seq; seq= seq->next) { if( (seq!=test) && (test->machine==seq->machine) && - (test->depth==seq->depth) && ((sel == -1) || (sel && (seq->flag & SELECT)) || (sel==0 && (seq->flag & SELECT)==0) )) { switch (lr) { - case 1: + case SEQ_SIDE_LEFT: if (test->startdisp == (seq->enddisp)) { return seq; } break; - case 2: + case SEQ_SIDE_RIGHT: if (test->enddisp == (seq->startdisp)) { return seq; } break; } } - seq= seq->next; } return NULL; } Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel) { -/* looks to the left on lr==1, to the right on lr==2 - sel - 0==unselected, 1==selected, -1==done care*/ + /* sel - 0==unselected, 1==selected, -1==done care*/ Sequence *seq,*best_seq = NULL; Editing *ed= seq_give_editing(scene, FALSE); @@ -321,12 +315,12 @@ Sequence *find_next_prev_sequence(Scene *scene, Sequence *test, int lr, int sel) dist = MAXFRAME*2; switch (lr) { - case 1: + case SEQ_SIDE_LEFT: if (seq->enddisp <= test->startdisp) { dist = test->enddisp - seq->startdisp; } break; - case 2: + case SEQ_SIDE_RIGHT: if (seq->startdisp >= test->enddisp) { dist = seq->startdisp - test->enddisp; } @@ -355,7 +349,7 @@ Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2]) float pixelx; float handsize; float displen; - *hand= 0; + *hand= SEQ_SIDE_NONE; if(ed==NULL) return NULL; @@ -390,9 +384,9 @@ Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2]) } if( handsize+seq->startdisp >=x ) - *hand= 1; + *hand= SEQ_SIDE_LEFT; else if( -handsize+seq->enddisp <=x ) - *hand= 2; + *hand= SEQ_SIDE_RIGHT; } } return seq; diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h index 0942d31d733..18c08d94094 100644 --- a/source/blender/editors/space_sequencer/sequencer_intern.h +++ b/source/blender/editors/space_sequencer/sequencer_intern.h @@ -110,6 +110,7 @@ void SEQUENCER_OT_add_effect_strip(struct wmOperatorType *ot); /* RNA enums, just to be more readable */ enum { + SEQ_SIDE_NONE=0, SEQ_SIDE_LEFT, SEQ_SIDE_RIGHT, SEQ_SIDE_BOTH, diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c index a595755163a..d7ca063f4c5 100644 --- a/source/blender/editors/space_sequencer/sequencer_ops.c +++ b/source/blender/editors/space_sequencer/sequencer_ops.c @@ -105,6 +105,7 @@ void sequencer_operatortypes(void) void sequencer_keymap(wmWindowManager *wm) { ListBase *keymap= WM_keymap_listbase(wm, "Sequencer", SPACE_SEQ, 0); + wmKeymapItem *kmi; WM_keymap_add_item(keymap, "SEQUENCER_OT_deselect_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_invert", IKEY, KM_PRESS, KM_CTRL, 0); @@ -138,15 +139,37 @@ void sequencer_keymap(wmWindowManager *wm) WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all", HOMEKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0); - + + /* Mouse selection, a bit verbose :/ */ WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, 0, 0); - RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0)->ptr, "linked_left", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0)->ptr, "linked_right", 1); + + kmi= WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL|KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "linked_left", 1); + RNA_boolean_set(kmi->ptr, "linked_right", 1); + + kmi= WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL|KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + RNA_boolean_set(kmi->ptr, "linked_left", 1); + RNA_boolean_set(kmi->ptr, "linked_right", 1); + + kmi= WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + RNA_boolean_set(kmi->ptr, "linked_left", 1); + + kmi= WM_keymap_add_item(keymap, "SEQUENCER_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0); + RNA_boolean_set(kmi->ptr, "extend", 1); + RNA_boolean_set(kmi->ptr, "linked_right", 1); + + WM_keymap_add_item(keymap, "SEQUENCER_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_pick_linked", LKEY, KM_PRESS, 0, 0); - RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select_pick_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", 1); + RNA_boolean_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_select_pick_linked", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", 1); WM_keymap_add_item(keymap, "SEQUENCER_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index 3451d324006..f7548aa556a 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -85,13 +85,13 @@ void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK { Sequence *neighbor; - neighbor=find_neighboring_sequence(scene, test, 1, -1); + neighbor=find_neighboring_sequence(scene, test, SEQ_SIDE_LEFT, -1); if (neighbor) { neighbor->flag |= SELECT; recurs_sel_seq(neighbor); neighbor->flag |= SEQ_RIGHTSEL; } - neighbor=find_neighboring_sequence(scene, test, 2, -1); + neighbor=find_neighboring_sequence(scene, test, SEQ_SIDE_RIGHT, -1); if (neighbor) { neighbor->flag |= SELECT; recurs_sel_seq(neighbor); @@ -99,6 +99,35 @@ void select_surrounding_handles(Scene *scene, Sequence *test) /* XXX BRING BACK } test->flag |= SELECT; } + +/* used for mouse selection and for SEQUENCER_OT_select_active_side() */ +static void select_active_side(ListBase *seqbase, int sel_side, int channel, int frame) +{ + Sequence *seq; + + for(seq= seqbase->first; seq; seq=seq->next) { + if(channel==seq->machine) { + switch(sel_side) { + case SEQ_SIDE_LEFT: + if (frame > (seq->startdisp)) { + seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); + seq->flag |= SELECT; + } + break; + case SEQ_SIDE_RIGHT: + if (frame < (seq->startdisp)) { + seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); + seq->flag |= SELECT; + } + break; + case SEQ_SIDE_BOTH: + seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); + break; + } + } + } +} + #if 0 // BRING BACK void select_surround_from_last(Scene *scene) { @@ -144,13 +173,13 @@ void select_neighbor_from_last(Scene *scene, int lr) neighbor=find_neighboring_sequence(scene, seq, lr, -1); if (neighbor) { switch (lr) { - case 1: + case SEQ_SIDE_LEFT: neighbor->flag |= SELECT; recurs_sel_seq(neighbor); neighbor->flag |= SEQ_RIGHTSEL; seq->flag |= SEQ_LEFTSEL; break; - case 2: + case SEQ_SIDE_RIGHT: neighbor->flag |= SELECT; recurs_sel_seq(neighbor); neighbor->flag |= SEQ_LEFTSEL; @@ -253,30 +282,25 @@ void SEQUENCER_OT_select_invert(struct wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } - -/* *****************Selection Operators******************* */ -static EnumPropertyItem prop_select_types[] = { - {0, "EXCLUSIVE", "Exclusive", ""}, - {1, "EXTEND", "Extend", ""}, - {0, NULL, NULL, NULL} -}; - static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { ARegion *ar= CTX_wm_region(C); View2D *v2d= UI_view2d_fromcontext(C); Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, FALSE); - short extend= RNA_enum_is_equal(op->ptr, "type", "EXTEND"); + short extend= RNA_boolean_get(op->ptr, "extend"); + short linked_left= RNA_boolean_get(op->ptr, "linked_left"); + short linked_right= RNA_boolean_get(op->ptr, "linked_right"); + short mval[2]; Sequence *seq,*neighbor; - int hand,seldir, shift= 0; // XXX + int hand,sel_side, shift= 0; // XXX TimeMarker *marker; if(ed==NULL) return OPERATOR_CANCELLED; - + marker=find_nearest_marker(SCE_MARKERS, 1); //XXX - dummy function for now mval[0]= event->x - ar->winrct.xmin; @@ -300,7 +324,8 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) } else { seq= find_nearest_seq(scene, v2d, &hand, mval); - if (extend == 0) + + if(extend == 0 && linked_left==0 && linked_right==0) deselect_all_seq(scene); if(seq) { @@ -318,60 +343,67 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) } if(extend && (seq->flag & SELECT)) { - if(hand==0) seq->flag &= SEQ_DESEL; - else if(hand==1) { - if(seq->flag & SEQ_LEFTSEL) - seq->flag &= ~SEQ_LEFTSEL; - else seq->flag |= SEQ_LEFTSEL; - } - else if(hand==2) { - if(seq->flag & SEQ_RIGHTSEL) - seq->flag &= ~SEQ_RIGHTSEL; - else seq->flag |= SEQ_RIGHTSEL; + switch(hand) { + case SEQ_SIDE_NONE: + if (linked_left==0 && linked_right==0) + seq->flag &= SEQ_DESEL; + break; + case SEQ_SIDE_LEFT: + seq->flag ^= SEQ_LEFTSEL; + break; + case SEQ_SIDE_RIGHT: + seq->flag ^= SEQ_RIGHTSEL; + break; } } else { seq->flag |= SELECT; - if(hand==1) seq->flag |= SEQ_LEFTSEL; - if(hand==2) seq->flag |= SEQ_RIGHTSEL; + if(hand==SEQ_SIDE_LEFT) seq->flag |= SEQ_LEFTSEL; + if(hand==SEQ_SIDE_RIGHT) seq->flag |= SEQ_RIGHTSEL; } /* On Ctrl-Alt selection, select the strip and bordering handles */ - if (0) { // XXX (G.qual & LR_CTRLKEY) && (G.qual & LR_ALTKEY)) { + if (linked_left && linked_right) { if(extend==0) deselect_all_seq(scene); seq->flag |= SELECT; select_surrounding_handles(scene, seq); - - /* Ctrl signals Left, Alt signals Right - First click selects adjacent handles on that side. - Second click selects all strips in that direction. - If there are no adjacent strips, it just selects all in that direction. */ - } -#if 0 //XXX - else if (0) { // XXX ((G.qual & LR_CTRLKEY) || (G.qual & LR_ALTKEY)) && (seq->flag & SELECT)) { - - if (0); // G.qual & LR_CTRLKEY) seldir=1; - else seldir=2; - neighbor=find_neighboring_sequence(scene, seq, seldir, -1); + else if ((linked_left || linked_right) && (seq->flag & SELECT)) { + /* + * First click selects adjacent handles on that side. + * Second click selects all strips in that direction. + * If there are no adjacent strips, it just selects all in that direction. + */ + sel_side= linked_left ? SEQ_SIDE_LEFT:SEQ_SIDE_RIGHT; + neighbor=find_neighboring_sequence(scene, seq, sel_side, -1); if (neighbor) { - switch (seldir) { - case 1: - if ((seq->flag & SEQ_LEFTSEL)&&(neighbor->flag & SEQ_RIGHTSEL)) { + switch (sel_side) { + case SEQ_SIDE_LEFT: + if ((seq->flag & SEQ_LEFTSEL) && (neighbor->flag & SEQ_RIGHTSEL)) { if(extend==0) deselect_all_seq(scene); - select_channel_direction(scene, seq,1); + seq->flag |= SELECT; + + select_active_side(ed->seqbasep, SEQ_SIDE_LEFT, seq->machine, seq->startdisp); } else { + if(extend==0) deselect_all_seq(scene); + seq->flag |= SELECT; + neighbor->flag |= SELECT; recurs_sel_seq(neighbor); neighbor->flag |= SEQ_RIGHTSEL; seq->flag |= SEQ_LEFTSEL; } break; - case 2: - if ((seq->flag & SEQ_RIGHTSEL)&&(neighbor->flag & SEQ_LEFTSEL)) { + case SEQ_SIDE_RIGHT: + if ((seq->flag & SEQ_RIGHTSEL) && (neighbor->flag & SEQ_LEFTSEL)) { if(extend==0) deselect_all_seq(scene); - select_channel_direction(scene, seq,2); + seq->flag |= SELECT; + + select_active_side(ed->seqbasep, SEQ_SIDE_RIGHT, seq->machine, seq->startdisp); } else { + if(extend==0) deselect_all_seq(scene); + seq->flag |= SELECT; + neighbor->flag |= SELECT; recurs_sel_seq(neighbor); neighbor->flag |= SEQ_LEFTSEL; @@ -381,10 +413,9 @@ static int sequencer_select_invoke(bContext *C, wmOperator *op, wmEvent *event) } } else { if(extend==0) deselect_all_seq(scene); - select_channel_direction(scene, seq,seldir); + select_active_side(ed->seqbasep, sel_side, seq->machine, seq->startdisp); } } -#endif recurs_sel_seq(seq); } } @@ -426,7 +457,9 @@ void SEQUENCER_OT_select(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", ""); + RNA_def_boolean(ot->srna, "extend", 0, "Extend", "extend the selection"); + RNA_def_boolean(ot->srna, "linked_left", 0, "Linked Left", "Select strips to the left of the active strip"); + RNA_def_boolean(ot->srna, "linked_right", 0, "Linked Right", "Select strips to the right of the active strip"); } @@ -460,14 +493,14 @@ static int select_more_less_seq__internal(Scene *scene, int sel, int linked) { if((int)(seq->flag & SELECT) == sel) { if ((linked==0 && seq->tmp)==0) { /* only get unselected nabours */ - neighbor = find_neighboring_sequence(scene, seq, 1, isel); + neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_LEFT, isel); if (neighbor) { if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);} else neighbor->flag &= ~SELECT; if (linked==0) neighbor->tmp = (Sequence *)1; change = 1; } - neighbor = find_neighboring_sequence(scene, seq, 2, isel); + neighbor = find_neighboring_sequence(scene, seq, SEQ_SIDE_RIGHT, isel); if (neighbor) { if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);} else neighbor->flag &= ~SELECT; @@ -548,7 +581,7 @@ static int sequencer_select_pick_linked_invoke(bContext *C, wmOperator *op, wmEv ARegion *ar= CTX_wm_region(C); View2D *v2d= UI_view2d_fromcontext(C); - short extend= RNA_enum_is_equal(op->ptr, "type", "EXTEND"); + short extend= RNA_boolean_get(op->ptr, "extend"); short mval[2]; Sequence *mouse_seq; @@ -592,7 +625,7 @@ void SEQUENCER_OT_select_pick_linked(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; /* properties */ - RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", "Type of select linked operation"); + RNA_def_boolean(ot->srna, "extend", 0, "Extend", "extend the selection"); } @@ -686,35 +719,13 @@ static int sequencer_select_active_side_exec(bContext *C, wmOperator *op) Scene *scene= CTX_data_scene(C); Editing *ed= seq_give_editing(scene, 0); Sequence *seq_act=get_last_seq(scene); - Sequence *seq; - int sel_side= RNA_enum_get(op->ptr, "side"); - if (ed==NULL) + if (ed==NULL || seq_act==NULL) return OPERATOR_CANCELLED; seq_act->flag |= SELECT; - for(seq= ed->seqbasep->first; seq; seq=seq->next) { - if(seq!=seq_act && seq_act->machine==seq->machine) { - switch(sel_side) { - case SEQ_SIDE_LEFT: - if (seq_act->startdisp > (seq->startdisp)) { - seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); - seq->flag |= SELECT; - } - break; - case SEQ_SIDE_RIGHT: - if (seq_act->startdisp < (seq->startdisp)) { - seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); - seq->flag |= SELECT; - } - break; - case SEQ_SIDE_BOTH: - seq->flag &= ~(SEQ_RIGHTSEL|SEQ_LEFTSEL); - break; - } - } - } + select_active_side(ed->seqbasep, RNA_enum_get(op->ptr, "side"), seq_act->machine, seq_act->startdisp); ED_area_tag_redraw(CTX_wm_area(C)); @@ -805,6 +816,4 @@ void SEQUENCER_OT_borderselect(wmOperatorType *ot) RNA_def_int(ot->srna, "xmax", 0, INT_MIN, INT_MAX, "X Max", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "ymin", 0, INT_MIN, INT_MAX, "Y Min", "", INT_MIN, INT_MAX); RNA_def_int(ot->srna, "ymax", 0, INT_MIN, INT_MAX, "Y Max", "", INT_MIN, INT_MAX); - - RNA_def_enum(ot->srna, "type", prop_select_types, 0, "Type", ""); } |