Index: source/blender/editors/CMakeLists.txt =================================================================== --- source/blender/editors/CMakeLists.txt (revision 26005) +++ source/blender/editors/CMakeLists.txt (working copy) @@ -27,7 +27,7 @@ FILE(GLOB SRC */*.c) SET(INC ../windowmanager - ../editors/include + ../editors/include ../editors/interface ../../../intern/guardedalloc ../../../intern/memutil ../blenlib ../makesdna ../makesrna ../blenkernel ../include ../imbuf ../render/extern/include Index: source/blender/editors/interface/interface.c =================================================================== --- source/blender/editors/interface/interface.c (revision 26005) +++ source/blender/editors/interface/interface.c (working copy) @@ -942,7 +942,42 @@ /* *************************************************************** */ +void ui_delete_linkline(uiLinkLine *line, uiBut *but) +{ + uiLink *link; + int a, b; + + BLI_remlink(&but->link->lines, line); + link= line->from->link; + + /* are there more pointers allowed? */ + if(link->ppoin) { + + if(*(link->totlink)==1) { + *(link->totlink)= 0; + MEM_freeN(*(link->ppoin)); + *(link->ppoin)= NULL; + } + else { + b= 0; + for(a=0; a< (*(link->totlink)); a++) { + + if( (*(link->ppoin))[a] != line->to->poin ) { + (*(link->ppoin))[b]= (*(link->ppoin))[a]; + b++; + } + } + (*(link->totlink))--; + } + } + else { + *(link->poin)= NULL; + } + + MEM_freeN(line); + //REDRAW +} /* XXX 2.50 no links supported yet */ #if 0 static void ui_delete_active_linkline(uiBlock *block) Index: source/blender/editors/interface/interface_intern.h =================================================================== --- source/blender/editors/interface/interface_intern.h (revision 26005) +++ source/blender/editors/interface/interface_intern.h (working copy) @@ -318,6 +318,8 @@ /* interface.c */ +extern void ui_delete_linkline(uiLinkLine *line, uiBut *but); + extern int ui_translate_buttons(void); extern int ui_translate_menus(void); extern int ui_translate_tooltips(void); @@ -441,6 +443,7 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y3); void ui_draw_menu_back(struct uiStyle *style, uiBlock *block, rcti *rect); void ui_draw_search_back(struct uiStyle *style, uiBlock *block, rcti *rect); +int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol); void ui_draw_link_bezier(rcti *rect); extern void ui_draw_but(const struct bContext *C, ARegion *ar, struct uiStyle *style, uiBut *but, rcti *rect); Index: source/blender/editors/interface/interface_widgets.c =================================================================== --- source/blender/editors/interface/interface_widgets.c (revision 26007) +++ source/blender/editors/interface/interface_widgets.c (working copy) @@ -1839,8 +1839,8 @@ rect->xmax -= textofs; } - -static int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol) +//static int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol) +int ui_link_bezier_points(rcti *rect, float coord_array[][2], int resol) { float dist, vec[4][2]; Index: source/blender/editors/screen/screen_ops.c =================================================================== --- source/blender/editors/screen/screen_ops.c (revision 26005) +++ source/blender/editors/screen/screen_ops.c (working copy) @@ -2185,7 +2185,53 @@ ot->poll= ED_operator_areaactive; ot->flag= 0; } +/* ************** header pan to left + mouse over editor changes operator ***************************** */ +// This is a hacky, or a workaround if you prefer +// I like being able to quickly switch Editors (ALT+MOUSEWHEEL) +// Since the editor switcher is not always visible (and it should IMHO) this operator helps you with that :) +static int header_focus_exec(bContext *C, wmOperator *op) +{ + int i; + int bounds[4] = {0,20,0,0}; + ARegion *ar= CTX_wm_region(C); + + /* find the header region + * - try context first, but upon failing, search all regions in area... + */ + if((ar == NULL) || (ar->regiontype != RGN_TYPE_HEADER)) { + ScrArea *sa= CTX_wm_area(C); + + /* loop over all regions until a matching one is found */ + for (ar= sa->regionbase.first; ar; ar= ar->next) { + if(ar->regiontype == RGN_TYPE_HEADER) + break; + } + + /* don't do anything if no region */ + if(ar == NULL) + return OPERATOR_CANCELLED; + } + for (i =0; i <40; i++){ + WM_operator_name_call(C, "VIEW2D_OT_scroll_left", WM_OP_INVOKE_DEFAULT, NULL); + } + + return OPERATOR_FINISHED; +} + +static void SCREEN_OT_header_focus(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Header Focus"; + ot->idname= "SCREEN_OT_header_focus"; + + /* api callbacks */ + ot->exec= header_focus_exec; + + ot->poll= ED_operator_areaactive; + ot->flag= 0; +} + /* ************** header flip operator ***************************** */ /* flip a header region alignment */ @@ -2257,7 +2303,7 @@ uiItemO(layout, "Flip to Bottom", 0, "SCREEN_OT_header_flip"); else uiItemO(layout, "Flip to Top", 0, "SCREEN_OT_header_flip"); - + uiItemO(layout, "Focus on Editor Type", 0, "SCREEN_OT_header_focus"); uiItemS(layout); /* file browser should be fullscreen all the time, but other regions can be maximised/restored... */ @@ -3814,6 +3860,7 @@ WM_operatortype_append(SCREEN_OT_region_flip); WM_operatortype_append(SCREEN_OT_header_flip); WM_operatortype_append(SCREEN_OT_header_toolbox); + WM_operatortype_append(SCREEN_OT_header_focus); WM_operatortype_append(SCREEN_OT_screen_set); WM_operatortype_append(SCREEN_OT_screen_full_area); WM_operatortype_append(SCREEN_OT_back_to_previous); @@ -3898,6 +3945,7 @@ keymap= WM_keymap_find(keyconf, "Header", 0, 0); WM_keymap_add_item(keymap, "SCREEN_OT_header_toolbox", RIGHTMOUSE, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "SCREEN_OT_header_focus", MIDDLEMOUSE, KM_PRESS, KM_ALT, 0); /* Screen General ------------------------------------------------ */ keymap= WM_keymap_find(keyconf, "Screen", 0, 0); Index: source/blender/editors/space_logic/logic_buttons.c =================================================================== --- source/blender/editors/space_logic/logic_buttons.c (revision 26005) +++ source/blender/editors/space_logic/logic_buttons.c (working copy) @@ -64,6 +64,7 @@ #include "UI_resources.h" #include "UI_view2d.h" +#include "interface_intern.h" #include "logic_intern.h" #if 0 @@ -143,5 +144,90 @@ ot->flag= 0; } +/* Remove Logic Bricks Connections */ +/* ********************** Cut Link operator ***************** */ +#define LINK_RESOL 12 +static int cut_links_intersect(uiLinkLine *line, float mcoords[][2], int tot) +{ + float coord_array[LINK_RESOL+1][2]; + int i, b; + rcti rectlink; + rectlink.xmin= (int) (line->from->x1 + line->from->x2) / 2; + rectlink.ymin= (int) (line->from->y1 + line->from->y2) / 2; + rectlink.xmax= (int) (line->to->x1 + line->to->x2) / 2; + rectlink.ymax= (int) (line->to->y1 + line->to->y2) / 2; + + if(ui_link_bezier_points(&rectlink, coord_array, LINK_RESOL)){ + for(i=0; i 0) + return 1; + } + return 0; +} + +static int cut_links_exec(bContext *C, wmOperator *op) +{ + ARegion *ar= CTX_wm_region(C); + float mcoords[256][2]; + int i= 0; + + RNA_BEGIN(op->ptr, itemptr, "path") { + float loc[2]; + + RNA_float_get_array(&itemptr, "loc", loc); + UI_view2d_region_to_view(&ar->v2d, (short)loc[0], (short)loc[1], + &mcoords[i][0], &mcoords[i][1]); + i++; + if(i>= 256) break; + } + RNA_END; + + if (i>1) { + uiBlock *block; + uiLinkLine *line, *nline; + uiBut *but, *bt; + for(block= ar->uiblocks.first; block; block= block->next) + { + but= block->buttons.first; + while(but) { + if(but->type==LINK && but->link) { + for(line= but->link->lines.first; line; line= nline) { + nline= line->next; + + if(cut_links_intersect(line, mcoords, i)) { + ui_delete_linkline(line, but); + } + } + } + but= but->next; + } + } + return OPERATOR_FINISHED; + } + return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH; +} + +void LOGIC_OT_links_cut(wmOperatorType *ot) +{ + PropertyRNA *prop; + + ot->name= "Cut links"; + ot->idname= "LOGIC_OT_links_cut"; + + ot->invoke= WM_gesture_lines_invoke; + ot->modal= WM_gesture_lines_modal; + ot->exec= cut_links_exec; + + ot->poll= ED_operator_logic_active; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + prop= RNA_def_property(ot->srna, "path", PROP_COLLECTION, PROP_NONE); + RNA_def_property_struct_runtime(prop, &RNA_OperatorMousePath); + /* internal */ + RNA_def_int(ot->srna, "cursor", BC_KNIFECURSOR, 0, INT_MAX, "Cursor", "", 0, INT_MAX); +} \ No newline at end of file Index: source/blender/editors/space_logic/logic_intern.h =================================================================== --- source/blender/editors/space_logic/logic_intern.h (revision 26005) +++ source/blender/editors/space_logic/logic_intern.h (working copy) @@ -50,6 +50,7 @@ /* logic_buttons.c */ void logic_buttons_register(struct ARegionType *art); void LOGIC_OT_properties(struct wmOperatorType *ot); +void LOGIC_OT_links_cut(struct wmOperatorType *ot); /* logic_window.c */ void logic_buttons(struct bContext *C, struct ARegion *ar); Index: source/blender/editors/space_logic/SConscript =================================================================== --- source/blender/editors/space_logic/SConscript (revision 26005) +++ source/blender/editors/space_logic/SConscript (working copy) @@ -5,7 +5,7 @@ incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include' -incs += ' ../../makesrna' +incs += ' ../../makesrna ../interface' defs = [] Index: source/blender/editors/space_logic/space_logic.c =================================================================== --- source/blender/editors/space_logic/space_logic.c (revision 26005) +++ source/blender/editors/space_logic/space_logic.c (working copy) @@ -183,7 +183,7 @@ void logic_operatortypes(void) { WM_operatortype_append(LOGIC_OT_properties); - + WM_operatortype_append(LOGIC_OT_links_cut); } void logic_keymap(struct wmKeyConfig *keyconf) @@ -191,6 +191,7 @@ wmKeyMap *keymap= WM_keymap_find(keyconf, "Logic Editor", SPACE_LOGIC, 0); WM_keymap_add_item(keymap, "LOGIC_OT_properties", NKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "LOGIC_OT_links_cut", LEFTMOUSE, KM_PRESS, KM_CTRL, 0); } static void logic_refresh(const bContext *C, ScrArea *sa)