[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13194] branches/blender2.5/blender/source /blender: Blender 2.5 project: added first more complex handler + operator

Ton Roosendaal ton at blender.org
Thu Jan 10 18:38:17 CET 2008


Revision: 13194
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13194
Author:   ton
Date:     2008-01-10 18:38:17 +0100 (Thu, 10 Jan 2008)

Log Message:
-----------
Blender 2.5 project: added first more complex handler + operator

- on mouse-over edge, you can drag area borders around.
- note it's a handerized system now, so it updates UI while you
  move mouse.

Feedback needed:

- read bottom part of the screen_edit.c file. It's the proposed
  method for adding tools and handlers. I think it's close, but
  might need some tweaks.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/area.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_intern.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/screen/spacetypes.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_screen_types.h
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_files.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_operators.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c

Removed Paths:
-------------
    branches/blender2.5/blender/source/blender/editors/screen/ed_screen.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/screen_edit.c

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-01-10 12:31:40 UTC (rev 13193)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2008-01-10 17:38:17 UTC (rev 13194)
@@ -4576,7 +4576,6 @@
 		if(sa->headertype) {
 			ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
 			BLI_addtail(&sa->regionbase, ar);
-			ar->winrct= sa->headrct;
 			ar->regiontype= RGN_TYPE_HEADER;
 			ar->minsize= HEADERY;	// DNA_screen_types.h
 			if(sa->headertype==1)
@@ -4587,7 +4586,7 @@
 		
 		ar= MEM_callocN(sizeof(ARegion), "area region from do_versions");
 		BLI_addtail(&sa->regionbase, ar);
-		ar->winrct= sa->winrct;
+		ar->winrct= sa->totrct;
 		ar->regiontype= RGN_TYPE_WINDOW;
 	}
 }

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-01-10 12:31:40 UTC (rev 13193)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-01-10 17:38:17 UTC (rev 13194)
@@ -54,8 +54,14 @@
 void	ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
 void	ED_screen_do_listen(bScreen *screen, struct wmNotifier *note);
 bScreen *ED_screen_duplicate(struct wmWindow *win, bScreen *sc);
+void	ED_screen_set_subwinactive(struct wmWindow *win);
 
 void	ed_screen_keymap(struct wmWindowManager *wm);
 
+/* operators; context poll callbacks */
+int		ED_operator_screenactive(bContext *C);
+int		ED_operator_screen_mainwinactive(bContext *C);
+
+
 #endif /* ED_SCREEN_H */
 

Modified: branches/blender2.5/blender/source/blender/editors/screen/area.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-01-10 12:31:40 UTC (rev 13193)
+++ branches/blender2.5/blender/source/blender/editors/screen/area.c	2008-01-10 17:38:17 UTC (rev 13194)
@@ -88,15 +88,19 @@
 
 void ED_region_do_listen(ARegion *ar, wmNotifier *note)
 {
-	if(ar->type->listener)
-		ar->type->listener(ar, note);
 	
-	/* generic notes */
-	if(note->type==WM_NOTE_REDRAW)
-		ar->do_draw= 1;
-	if(note->type==WM_NOTE_REFRESH)
-		ar->do_refresh= 1;
-	
+	/* generic notes first */
+	switch(note->type) {
+		case WM_NOTE_WINDOW_REDRAW:
+			ar->do_draw= 1;
+			break;
+		case WM_NOTE_SCREEN_CHANGED:
+			ar->do_draw= ar->do_refresh= 1;
+			break;
+		default:
+			if(ar->type->listener)
+				ar->type->listener(ar, note);
+	}
 }
 
 void ED_region_do_draw(bContext *C, ARegion *ar)

Deleted: branches/blender2.5/blender/source/blender/editors/screen/ed_screen.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/ed_screen.c	2008-01-10 12:31:40 UTC (rev 13193)
+++ branches/blender2.5/blender/source/blender/editors/screen/ed_screen.c	2008-01-10 17:38:17 UTC (rev 13194)
@@ -1,57 +0,0 @@
-/**
- * $Id:
- *
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. 
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2007 Blender Foundation.
- * All rights reserved.
- *
- * 
- * Contributor(s): Blender Foundation
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-#include "WM_api.h"
-
-#include "MEM_guardedalloc.h"
-
-#include "ED_area.h"
-#include "ED_screen.h"
-
-
-static void del_area(ScrArea *sa)
-{
-	
-	freespacelist(sa);
-	
-//	uiFreeBlocks(&sa->uiblocks);
-//	uiFreePanels(&sa->panels);
-	
-//	BPY_free_scriptlink(&sa->scriptlink);
-	
-}
-
-
-/* bad level to blenkernel, solve */
-void unlink_screen(bScreen *sc) 
-{
-	ScrArea *sa;
-	
-	for (sa= sc->areabase.first; sa; sa= sa->next)	
-		del_area(sa);
-}
\ No newline at end of file

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-01-10 12:31:40 UTC (rev 13193)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-01-10 17:38:17 UTC (rev 13194)
@@ -237,7 +237,7 @@
 	return (se->v1->vec.y == se->v2->vec.y);
 }
 
-static ScrEdge *screen_find_active_scredge(bScreen *sc, short *mval)
+static ScrEdge *screen_find_active_scredge(bScreen *sc, int mx, int my)
 {
 	ScrEdge *se;
 	
@@ -247,7 +247,7 @@
 			min= MIN2(se->v1->vec.x, se->v2->vec.x);
 			max= MAX2(se->v1->vec.x, se->v2->vec.x);
 			
-			if (abs(mval[1]-se->v1->vec.y)<=2 && mval[0] >= min && mval[0]<=max)
+			if (abs(my-se->v1->vec.y)<=2 && mx>=min && mx<=max)
 				return se;
 		} 
 		else {
@@ -255,7 +255,7 @@
 			min= MIN2(se->v1->vec.y, se->v2->vec.y);
 			max= MAX2(se->v1->vec.y, se->v2->vec.y);
 			
-			if (abs(mval[0]-se->v1->vec.x)<=2 && mval[1] >= min && mval[1]<=max)
+			if (abs(mx-se->v1->vec.x)<=2 && my>=min && my<=max)
 				return se;
 		}
 	}
@@ -263,6 +263,7 @@
 	return NULL;
 }
 
+/* danger: is used while areamove! */
 static void select_connected_scredge(bScreen *sc, ScrEdge *edge)
 {
 	ScrEdge *se;
@@ -278,7 +279,7 @@
 	
 	sv= sc->vertbase.first;
 	while(sv) {
-		sv->flag= 0;
+		sv->flag = 0;
 		sv= sv->next;
 	}
 	
@@ -410,13 +411,11 @@
 /* *************************************************************** */
 
 /* test if screen vertices should be scaled */
-/* also check offset */
 void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
 {
 	ScrVert *sv=NULL;
-	ScrEdge *se;
 	ScrArea *sa, *san;
-	int sizex, sizey, yval;
+	int sizex, sizey;
 	float facx, facy, tempf, min[2], max[2];
 	
 	/* calculate size */
@@ -472,29 +471,6 @@
 			MEM_freeN(sa);
 		}
 	}
-	
-	/* make each window at least HEADERY high */
-	for(sa= sc->areabase.first; sa; sa= sa->next) {
-		
-		if(sa->v1->vec.y+HEADERY > sa->v2->vec.y) {
-			/* lower edge */
-			se= screen_findedge(sc, sa->v4, sa->v1);
-			if(se && sa->v1!=sa->v2 ) {
-				select_connected_scredge(sc, se);
-				
-				/* all selected vertices get the right offset */
-				yval= sa->v2->vec.y-HEADERY;
-				sv= sc->vertbase.first;
-				while(sv) {
-					/* if is a collapsed area */
-					if(sv!=sa->v2 && sv!=sa->v3) {
-						if(sv->flag) sv->vec.y= yval;
-					}
-					sv= sv->next;
-				}
-			}
-		}
-	}
 }
 
 
@@ -529,12 +505,14 @@
 {
 	
 	/* generic notes */
-	if(note->type==WM_NOTE_REDRAW)
-		screen->do_draw= 1;
-	if(note->type==WM_NOTE_REFRESH)
-		if(note->swinid==0)
-			screen->do_refresh= screen->do_draw= 1;
-	
+	switch(note->type) {
+		case WM_NOTE_WINDOW_REDRAW:
+			screen->do_draw= 1;
+			break;
+		case WM_NOTE_SCREEN_CHANGED:
+			screen->do_draw= screen->do_refresh= 1;
+			break;
+	}
 }
 
 
@@ -552,7 +530,7 @@
 }
 
 /* make this screen usable */
-/* for file read and first use, for scaling window */
+/* for file read and first use, for scaling window, area moves */
 void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
 {
 	ScrArea *sa;
@@ -592,28 +570,48 @@
 
 void placeholder()
 {
-	removedouble_scrverts(NULL);
 	removenotused_scrverts(NULL);
-	removedouble_scredges(NULL);
 	removenotused_scredges(NULL);
 }
 
-/* *************************************************** */
+/* called in wm_event_system.c. sets state var in screen */
+void ED_screen_set_subwinactive(wmWindow *win)
+{
+	if(win->screen) {
+		wmEvent *event= win->eventstate;
+		ScrArea *sa;
+		
+		for(sa= win->screen->areabase.first; sa; sa= sa->next) {
+			if(event->x > sa->totrct.xmin && event->x < sa->totrct.xmax)
+				if(event->y > sa->totrct.ymin && event->y < sa->totrct.ymax)
+					break;
+		}
+		if(sa) {
+			ARegion *ar;
+			for(ar= sa->regionbase.first; ar; ar= ar->next) {
+				if(BLI_in_rcti(&ar->winrct, event->x, event->y))
+					win->screen->subwinactive= ar->swinid;
+			}
+		}
+		else
+			win->screen->subwinactive= win->screen->mainwin;
+		
+	}
+}
 
+/* ****************** cursor near edge operator ********************************* */
+
 /* operator cb */
 int screen_cursor_test(bContext *C, wmOperator *op, wmEvent *event)
 {
-	short mval[2]= {event->x, event->y};
-	ScrEdge *actedge= screen_find_active_scredge(C->screen, mval);
-	
-	if (actedge) {
-		if (scredge_is_horizontal(actedge)) {
+	if (C->screen->subwinactive==C->screen->mainwin) {
+		ScrEdge *actedge= screen_find_active_scredge(C->screen, event->x, event->y);
+		
+		if (actedge && scredge_is_horizontal(actedge)) {
 			WM_set_cursor(C, CURSOR_Y_MOVE);
 		} else {
 			WM_set_cursor(C, CURSOR_X_MOVE);
 		}
-		// this does global hotkeys too
-//		screen_edge_edit_event(g_activearea, actedge, event, val);
 	} else {
 		WM_set_cursor(C, CURSOR_STD);
 	}
@@ -622,3 +620,190 @@
 }
 
 
+
+/* ************** move area edge operator ********************************************** */
+
+/* operator state vars used:  
+           op->veci   mouse coord near edge
+           op->delta  movement of edge
+
+   callbacks:
+
+   init()   find edge based on op->veci, test if the edge can be moved, select edges,
+            clear delta, calculate min and max movement
+
+   exec()	apply op->delta on selection
+   
+   invoke() handler gets called on a mouse click near edge
+            call init()
+            add handler
+
+   modal()	accept modal events while doing it
+			call exec() with delta motion
+            call exit() and remove handler
+
+   exit()	cleanup, send notifier
+
+*/
+
+/* "global" variables for all functions inside this operator */
+/*  we could do it with properties? */
+static int	bigger, smaller, dir, origval;
+	
+/* validate selection inside screen, set variables OK */
+/* return 0: init failed */
+static int move_areas_init (bContext *C, wmOperator *op)
+{
+	ScrEdge *actedge= screen_find_active_scredge(C->screen, op->veci.x, op->veci.y);
+	ScrArea *sa;
+	
+	if(actedge==NULL) return 0;
+	

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list