[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42843] trunk/blender/source/blender/ editors/screen/screen_ops.c: Fix #29652: operator tab can not be maximised

Sergey Sharybin sergey.vfx at gmail.com
Fri Dec 23 13:56:57 CET 2011


Revision: 42843
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42843
Author:   nazgul
Date:     2011-12-23 12:56:48 +0000 (Fri, 23 Dec 2011)
Log Message:
-----------
Fix #29652: operator tab can not be maximised

Clamp region's size on expand to max allowed size, so it wouldn't
be automatically hidden just after expand.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/screen/screen_ops.c

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2011-12-23 09:04:21 UTC (rev 42842)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2011-12-23 12:56:48 UTC (rev 42843)
@@ -1666,6 +1666,47 @@
 	return OPERATOR_FINISHED;
 }
 
+static int region_scale_get_maxsize(RegionMoveData *rmd)
+{
+	int maxsize= 0;
+
+	if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT) {
+		return rmd->sa->winx - UI_UNIT_X;
+	}
+
+	if(rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS) {
+		/* this calculation seems overly verbose
+		 * can someone explain why this method is necessary? - campbell */
+		maxsize = rmd->maxsize - ((rmd->sa->headertype==HEADERTOP)?UI_UNIT_Y*2:UI_UNIT_Y) - (UI_UNIT_Y/4);
+	}
+
+	return maxsize;
+}
+
+static void region_scale_validate_size(RegionMoveData *rmd)
+{
+	if((rmd->ar->flag & RGN_FLAG_HIDDEN)==0) {
+		short *size, maxsize= -1;
+
+
+		if(rmd->edge==AE_LEFT_TO_TOPRIGHT || rmd->edge==AE_RIGHT_TO_TOPLEFT)
+			size= &rmd->ar->sizex;
+		else
+			size= &rmd->ar->sizey;
+
+		maxsize= region_scale_get_maxsize(rmd);
+
+		if(*size > maxsize && maxsize > 0)
+			*size= maxsize;
+	}
+}
+
+static void region_scale_toggle_hidden(bContext *C, RegionMoveData *rmd)
+{
+	ED_region_toggle_hidden(C, rmd->ar);
+	region_scale_validate_size(rmd);
+}
+
 static int region_scale_modal(bContext *C, wmOperator *op, wmEvent *event)
 {
 	RegionMoveData *rmd= op->customdata;
@@ -1685,35 +1726,29 @@
 				if(rmd->ar->sizex < UI_UNIT_X) {
 					rmd->ar->sizex= rmd->origval;
 					if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
-						ED_region_toggle_hidden(C, rmd->ar);
+						region_scale_toggle_hidden(C, rmd);
 				}
 				else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
-					ED_region_toggle_hidden(C, rmd->ar);
+					region_scale_toggle_hidden(C, rmd);
 			}
 			else {
-				int maxsize=0;
+				int maxsize= region_scale_get_maxsize(rmd);
 				delta= event->y - rmd->origy;
 				if(rmd->edge==AE_BOTTOM_TO_TOPLEFT) delta= -delta;
 				
 				rmd->ar->sizey= rmd->origval + delta;
 				CLAMP(rmd->ar->sizey, 0, rmd->maxsize);
 
-				if(rmd->ar->regiontype == RGN_TYPE_TOOL_PROPS) {
-					/* this calculation seems overly verbose
-					 * can someone explain why this method is necessary? - campbell */
-					maxsize = rmd->maxsize - ((rmd->sa->headertype==HEADERTOP)?UI_UNIT_Y*2:UI_UNIT_Y) - (UI_UNIT_Y/4);
-				}
-
 				/* note, 'UI_UNIT_Y/4' means you need to drag the header almost
 				 * all the way down for it to become hidden, this is done
 				 * otherwise its too easy to do this by accident */
 				if(rmd->ar->sizey < UI_UNIT_Y/4 || (maxsize > 0 && (rmd->ar->sizey > maxsize)) ) {
 					rmd->ar->sizey= rmd->origval;
 					if(!(rmd->ar->flag & RGN_FLAG_HIDDEN))
-						ED_region_toggle_hidden(C, rmd->ar);
+						region_scale_toggle_hidden(C, rmd);
 				}
 				else if(rmd->ar->flag & RGN_FLAG_HIDDEN)
-					ED_region_toggle_hidden(C, rmd->ar);
+					region_scale_toggle_hidden(C, rmd);
 			}
 			ED_area_tag_redraw(rmd->sa);
 			WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -1725,10 +1760,14 @@
 				
 				if(ABS(event->x - rmd->origx) < 2 && ABS(event->y - rmd->origy) < 2) {
 					if(rmd->ar->flag & RGN_FLAG_HIDDEN) {
-						ED_region_toggle_hidden(C, rmd->ar);
-						ED_area_tag_redraw(rmd->sa);
-						WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
+						region_scale_toggle_hidden(C, rmd);
 					}
+					else if(rmd->ar->flag & RGN_FLAG_TOO_SMALL) {
+						region_scale_validate_size(rmd);
+					}
+
+					ED_area_tag_redraw(rmd->sa);
+					WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
 				}
 				MEM_freeN(op->customdata);
 				op->customdata = NULL;




More information about the Bf-blender-cvs mailing list