Index: source/blender/src/editscreen.c =================================================================== RCS file: /cvsroot/bf-blender/blender/source/blender/src/editscreen.c,v retrieving revision 1.155 diff -u -p -u -r1.155 editscreen.c --- source/blender/src/editscreen.c 12 Apr 2007 06:21:31 -0000 1.155 +++ source/blender/src/editscreen.c 16 Apr 2007 17:31:45 -0000 @@ -745,6 +745,35 @@ void splash(void *data, int datasize, ch static void moveareas(ScrEdge *edge); static void joinarea_interactive(ScrArea *area, ScrEdge *onedge); static void splitarea_interactive(ScrArea *area, ScrEdge *onedge); +static ScrArea *test_edge_area(ScrArea *sa, ScrEdge *se); +static ScrEdge *screen_findedge(bScreen *sc, ScrVert *v1, ScrVert *v2); + +static int isjoinable(ScrArea *area, ScrEdge *onedge) +{ + struct ScrArea *sa1 = area, *sa2; + struct ScrEdge *se; + + sa1 = test_edge_area(sa1, onedge); + if(sa1==0) return 0; + + /* find directions with same edge */ + sa2= G.curscreen->areabase.first; + while(sa2) { + if(sa2 != sa1) { + se= screen_findedge(G.curscreen, sa2->v1, sa2->v2); + if(onedge==se) return 1; + se= screen_findedge(G.curscreen, sa2->v2, sa2->v3); + if(onedge==se) return 1; + se= screen_findedge(G.curscreen, sa2->v3, sa2->v4); + if(onedge==se) return 1; + se= screen_findedge(G.curscreen, sa2->v4, sa2->v1); + if(onedge==se) return 1; + } + sa2= sa2->next; + } + + return 0; +} static void screen_edge_edit_event(ScrArea *actarea, ScrEdge *actedge, short evt, short val) { @@ -757,21 +786,34 @@ static void screen_edge_edit_event(ScrAr if (evt==LEFTMOUSE) { moveareas(actedge); } else if (evt==MIDDLEMOUSE || evt==RIGHTMOUSE) { - int edgeop; - + int edgeop, joinable= 1; + char *str; + + str= MEM_callocN(32, "temp string"); + strcpy(str, "Split Area|"); + + if(isjoinable(actarea, actedge)) { + strcat(str, "Join Areas|"); + joinable= 0; + } + if (!actarea->headertype) { - edgeop= pupmenu("Split Area|Join Areas|Add Header"); + strcat(str, "Add Header"); + edgeop= pupmenu(str); } else { - edgeop= pupmenu("Split Area|Join Areas|No Header"); + strcat(str, "No Header"); + edgeop= pupmenu(str); } if (edgeop==1) { splitarea_interactive(actarea, actedge); - } else if (edgeop==2) { + } else if (edgeop==2+joinable) { joinarea_interactive(actarea, actedge); - } else if (edgeop==3) { + } else if (edgeop==3-joinable) { scrarea_change_headertype(actarea, actarea->headertype?0:HEADERDOWN); } + + MEM_freeN(str); } else blenderqread(evt, val); // global hotkeys }