[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15282] branches/blender2.5/blender/source /blender: == Rip Area into new Window Operator ==

Andrea Weikert elubie at gmx.net
Thu Jun 19 21:10:08 CEST 2008


Revision: 15282
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15282
Author:   elubie
Date:     2008-06-19 21:09:21 +0200 (Thu, 19 Jun 2008)

Log Message:
-----------
== Rip Area into new Window Operator ==
- operator that rips current area into new window
- implemented on the window level.
- sets C->area in current context if necessary
== fix ==
- small bugfix: missing return in WM_event_add_keymap_handler

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_window.h

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-06-19 15:35:44 UTC (rev 15281)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-06-19 19:09:21 UTC (rev 15282)
@@ -56,6 +56,7 @@
 void	ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
 void	ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
 bScreen *ED_screen_duplicate(struct wmWindow *win, bScreen *sc);
+bScreen *ED_screen_riparea(struct wmWindow *win, bScreen *sc, struct ScrArea *sa);
 void	ED_screen_set_subwinactive(struct wmWindow *win);
 
 void	ED_operatortypes_screen(void);

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-06-19 15:35:44 UTC (rev 15281)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-06-19 19:09:21 UTC (rev 15282)
@@ -410,7 +410,12 @@
 	MEM_freeN(sa);
 }
 
-bScreen *addscreen(wmWindow *win, char *name)
+/* Helper function to join 2 areas, it has a return value, 0=failed 1=success
+ * 	used by the split, join and rip operators
+ */
+int screen_join_areas(bScreen *scr, ScrArea *sa1, ScrArea *sa2);
+
+static bScreen *addscreen_area(wmWindow *win, char *name, short headertype, short spacetype)
 {
 	bScreen *sc;
 	ScrVert *sv1, *sv2, *sv3, *sv4;
@@ -429,11 +434,15 @@
 	screen_addedge(sc, sv3, sv4);
 	screen_addedge(sc, sv4, sv1);
 	
-	screen_addarea(sc, sv1, sv2, sv3, sv4, HEADERDOWN, SPACE_INFO);
+	screen_addarea(sc, sv1, sv2, sv3, sv4, headertype, spacetype);
 		
 	return sc;
 }
 
+static bScreen *addscreen(wmWindow *win, char *name) 
+{
+	return addscreen_area(win, name, HEADERDOWN, SPACE_INFO);
+}
 
 static void screen_copy(bScreen *to, bScreen *from)
 {
@@ -482,6 +491,34 @@
 
 }
 
+bScreen *ED_screen_riparea(struct wmWindow *win, bScreen *sc, struct ScrArea *sa)
+{
+	bScreen *newsc=NULL;
+	ScrArea *newa;
+	ScrArea *tsa;
+
+	if(sc->full != SCREENNORMAL) return NULL; /* XXX handle this case! */
+	
+	/* make new screen: */
+	newsc= addscreen_area(win, sc->id.name+2, sa->headertype, sa->spacetype);
+
+	/* new area is first (and only area) added to new win */
+	newa = (ScrArea *)newsc->areabase.first;
+	area_copy_data(newa, sa, 0);
+
+	/*remove the original area if possible*/
+	for(tsa= sc->areabase.first; tsa; tsa= tsa->next) {
+		if (screen_join_areas(sc,tsa,sa)) 
+			break;
+	}
+
+	removedouble_scredges(sc);
+	removenotused_scredges(sc);
+	removenotused_scrverts(sc);
+
+	return newsc;
+}
+
 bScreen *ED_screen_duplicate(wmWindow *win, bScreen *sc)
 {
 	bScreen *newsc;
@@ -665,6 +702,55 @@
 }
 
 
+/* Helper function to join 2 areas, it has a return value, 0=failed 1=success
+ * 	used by the split, join and rip operators
+ */
+int screen_join_areas(bScreen* scr, ScrArea *sa1, ScrArea *sa2) 
+{
+	int dir;
+	
+	dir = area_getorientation(scr, sa1, sa2);
+	/*printf("dir is : %i \n", dir);*/
+	
+	if (dir < 0)
+	{
+		if (sa1 ) sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
+		if (sa2 ) sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
+		return 0;
+	}
+	
+	if(dir == 0) {
+		sa1->v1= sa2->v1;
+		sa1->v2= sa2->v2;
+		screen_addedge(scr, sa1->v2, sa1->v3);
+		screen_addedge(scr, sa1->v1, sa1->v4);
+	}
+	else if(dir == 1) {
+		sa1->v2= sa2->v2;
+		sa1->v3= sa2->v3;
+		screen_addedge(scr, sa1->v1, sa1->v2);
+		screen_addedge(scr, sa1->v3, sa1->v4);
+	}
+	else if(dir == 2) {
+		sa1->v3= sa2->v3;
+		sa1->v4= sa2->v4;
+		screen_addedge(scr, sa1->v2, sa1->v3);
+		screen_addedge(scr, sa1->v1, sa1->v4);
+	}
+	else if(dir == 3) {
+		sa1->v1= sa2->v1;
+		sa1->v4= sa2->v4;
+		screen_addedge(scr, sa1->v1, sa1->v2);
+		screen_addedge(scr, sa1->v3, sa1->v4);
+	}
+	
+	screen_delarea(scr, sa2);
+	removedouble_scrverts(scr);
+	sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
+	
+	return 1;
+}
+
 /* *************************************************************** */
 
 /* test if screen vertices should be scaled */
@@ -1508,54 +1594,19 @@
 	return OPERATOR_RUNNING_MODAL;
 }
 
-/* join areas */
-static void split_joincurrent(bContext *C, sAreaSplitData *sd)
+static int split_area_cancel(bContext *C, wmOperator *op)
 {
-	int orientation= area_getorientation(C->window->screen, sd->sarea, sd->narea);
-	if(orientation>-1) {
-		if(orientation==0) {
-			sd->sarea->v1= sd->narea->v1;
-			sd->sarea->v2= sd->narea->v2;
-			screen_addedge(C->screen, sd->sarea->v2, sd->sarea->v3);
-			screen_addedge(C->screen, sd->sarea->v1, sd->sarea->v4);
-		}
-		else if(orientation==1) {
-			sd->sarea->v2= sd->narea->v2;
-			sd->sarea->v3= sd->narea->v3;
-			screen_addedge(C->screen, sd->sarea->v1, sd->sarea->v2);
-			screen_addedge(C->screen, sd->sarea->v3, sd->sarea->v4);
-		}
-		else if(orientation==2) {
-			sd->sarea->v3= sd->narea->v3;
-			sd->sarea->v4= sd->narea->v4;
-			screen_addedge(C->screen, sd->sarea->v2,sd-> sarea->v3);
-			screen_addedge(C->screen, sd->sarea->v1, sd->sarea->v4);
-		}
-		else if(orientation==3) {
-			sd->sarea->v1= sd->narea->v1;
-			sd->sarea->v4= sd->narea->v4;
-			screen_addedge(C->screen, sd->sarea->v1, sd->sarea->v2);
-			screen_addedge(C->screen, sd->sarea->v3, sd->sarea->v4);
-		}
+	sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
 
+	WM_event_remove_modal_handler(&C->window->handlers, op);
+
+	OP_set_int(op, "delta", 0);
+	if (screen_join_areas(C->screen,sd->sarea, sd->narea)) {
 		if (C->area == sd->narea) {
 			C->area = NULL;
 		}
-		screen_delarea(C->screen, sd->narea);
 		sd->narea = NULL;
-		removedouble_scrverts(C->screen);
-		removedouble_scredges(C->screen);
 	}
-}
-
-static int split_area_cancel(bContext *C, wmOperator *op)
-{
-	sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
-
-	WM_event_remove_modal_handler(&C->window->handlers, op);
-
-	OP_set_int(op, "delta", 0);
-	split_joincurrent(C, sd);
 	split_area_exit(C, op);
 
 	return OPERATOR_CANCELLED;
@@ -1602,7 +1653,12 @@
 				/* area containing cursor has changed */
 				if(sa && sd->sarea!=sa && sd->narea!=sa) {
 					sold= sd->sarea;
-					split_joincurrent(C, sd);
+					if (screen_join_areas(C->screen,sd->sarea, sd->narea)) {
+						if (C->area == sd->narea) {
+							C->area = NULL;
+						}
+						sd->narea = NULL;
+					}
 
 					/* now find aedge with same orientation as sd->dir (inverted) */
 					if(dir=='v') {
@@ -1734,48 +1790,13 @@
 	sAreaJoinData *jd = (sAreaJoinData *)op->customdata;
 	if (!jd) return 0;
 
-	jd->dir = area_getorientation(C->screen, jd->sa1, jd->sa2);
-	printf("dir is : %i \n", jd->dir);
-	if (jd->dir < 0)
-	{
-		if (jd->sa1 ) jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
-		if (jd->sa2 ) jd->sa2->flag &= ~AREA_FLAG_DRAWJOINTO;
+	if(!screen_join_areas(C->screen,jd->sa1,jd->sa2)){
 		return 0;
 	}
-	
-	if(jd->dir == 0) {
-		jd->sa1->v1= jd->sa2->v1;
-		jd->sa1->v2= jd->sa2->v2;
-		screen_addedge(C->screen, jd->sa1->v2, jd->sa1->v3);
-		screen_addedge(C->screen, jd->sa1->v1, jd->sa1->v4);
-	}
-	else if(jd->dir == 1) {
-		jd->sa1->v2= jd->sa2->v2;
-		jd->sa1->v3= jd->sa2->v3;
-		screen_addedge(C->screen, jd->sa1->v1, jd->sa1->v2);
-		screen_addedge(C->screen, jd->sa1->v3, jd->sa1->v4);
-	}
-	else if(jd->dir == 2) {
-		jd->sa1->v3= jd->sa2->v3;
-		jd->sa1->v4= jd->sa2->v4;
-		screen_addedge(C->screen, jd->sa1->v2,jd-> sa1->v3);
-		screen_addedge(C->screen, jd->sa1->v1, jd->sa1->v4);
-	}
-	else if(jd->dir == 3) {
-		jd->sa1->v1= jd->sa2->v1;
-		jd->sa1->v4= jd->sa2->v4;
-		screen_addedge(C->screen, jd->sa1->v1, jd->sa1->v2);
-		screen_addedge(C->screen, jd->sa1->v3, jd->sa1->v4);
-	}
-
 	if (C->area == jd->sa2) {
 		C->area = NULL;
 	}
-	screen_delarea(C->screen, jd->sa2);
-	jd->sa2 = NULL;
 
-	jd->sa1->flag &= ~AREA_FLAG_DRAWJOINFROM;
-
 	return 1;
 }
 

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-06-19 15:35:44 UTC (rev 15281)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm.c	2008-06-19 19:09:21 UTC (rev 15282)
@@ -80,6 +80,7 @@
 {
 	/* note, this doesn't replace existing keymap items */
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_duplicate", AKEY, KM_PRESS, 0, 0);
+	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_rip", RKEY, KM_PRESS, KM_ALT, 0);
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_save_homefile", UKEY, KM_PRESS, KM_CTRL, 0);
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_window_fullscreen_toggle", FKEY, KM_PRESS, 0, 0);
 	WM_keymap_verify_item(&wm->windowkeymap, "WM_OT_exit_blender", QKEY, KM_PRESS, KM_CTRL, 0);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-06-19 15:35:44 UTC (rev 15281)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-06-19 19:09:21 UTC (rev 15282)
@@ -479,7 +479,7 @@
 	/* only allow same keymap once */
 	for(handler= handlers->first; handler; handler= handler->next)
 		if(handler->keymap==keymap)
-			return;
+			return handler;
 
 	handler= MEM_callocN(sizeof(wmEventHandler), "event handler");
 	BLI_addtail(handlers, handler);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-06-19 15:35:44 UTC (rev 15281)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c	2008-06-19 19:09:21 UTC (rev 15282)
@@ -98,6 +98,16 @@
 	ot->poll= WM_operator_winactive;
 }
 
+static void WM_OT_window_rip(wmOperatorType *ot)
+{
+	ot->name= "Rip Area into New Window";
+	ot->idname= "WM_OT_window_rip";
+	
+	ot->invoke= wm_window_rip_op; //WM_operator_confirm;
+	ot->exec= NULL;
+	ot->poll= WM_operator_winactive;
+}
+
 static void WM_OT_save_homefile(wmOperatorType *ot)
 {
 	ot->name= "Save User Settings";
@@ -256,6 +266,7 @@
 void wm_operatortype_init(void)
 {
 	WM_operatortype_append(WM_OT_window_duplicate);
+	WM_operatortype_append(WM_OT_window_rip);
 	WM_operatortype_append(WM_OT_save_homefile);
 	WM_operatortype_append(WM_OT_window_fullscreen_toggle);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list