added back sequencer RMB select Ctrl/Alt modifier keys.

This commit is contained in:
2009-02-15 17:24:09 +00:00
parent 121c8c2584
commit e05742b64d
4 changed files with 128 additions and 101 deletions

View File

@@ -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;

View File

@@ -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,

View File

@@ -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);

View File

@@ -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", "");
}