[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33675] trunk/blender: bugfix [#25230] Quick extrude Ctrl-LMB : wrong behaviour of 'RotateSource' option.

Campbell Barton ideasman42 at gmail.com
Wed Dec 15 05:06:20 CET 2010


Revision: 33675
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33675
Author:   campbellbarton
Date:     2010-12-15 05:06:19 +0100 (Wed, 15 Dec 2010)

Log Message:
-----------
bugfix [#25230] Quick extrude Ctrl-LMB : wrong behaviour of 'RotateSource' option.

Problem is is with operator redo which click-extrude exposed.

Check if redo operator can run, otherwise lock the UI and add a label that the operator doesn't support redo.
This is clunky but IMHO better then failing silently and leaving the user confused.

- Merged redo functions into ED_undo_operator_repeat(), code was duplicated in a few places.
- added WM_operator_repeat_check to check if WM_operator_repeat() can run, avoids an undo call when redo work.

Unrelated changes
- GHOST_SystemWin32.cpp set to utf8 encoding.
- cmake_consistency_check.py now checks source files are utf8.

Modified Paths:
--------------
    trunk/blender/build_files/cmake/cmake_consistency_check.py
    trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
    trunk/blender/source/blender/editors/include/ED_util.h
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
    trunk/blender/source/blender/editors/util/undo.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/build_files/cmake/cmake_consistency_check.py
===================================================================
--- trunk/blender/build_files/cmake/cmake_consistency_check.py	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/build_files/cmake/cmake_consistency_check.py	2010-12-15 04:06:19 UTC (rev 33675)
@@ -192,3 +192,16 @@
     if not is_ignore(hf):
         if hf not in global_h:
             print("missing_h: ", hf)
+
+# test encoding
+import traceback
+for files in (global_c, global_h):
+    for f in sorted(files):
+        i = 1
+        try:
+            for l in open(f, "r", encoding="utf8"):
+                i += 1
+        except:
+            print("Non utf8: %s:%d" % (f, i))
+            if i > 1:
+                traceback.print_exc()

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp	2010-12-15 04:06:19 UTC (rev 33675)
@@ -855,7 +855,7 @@
 					 * specifies a character code generated by a dead key. A dead key is a key that 
 					 * generates a character, such as the umlaut (double-dot), that is combined with 
 					 * another character to form a composite character. For example, the umlaut-O 
-					 * character (\xD9) is generated by typing the dead key for the umlaut character, and 
+					 * character (Ù) is generated by typing the dead key for the umlaut character, and
 					 * then typing the O key.
 					 */
 				case WM_SYSDEADCHAR:

Modified: trunk/blender/source/blender/editors/include/ED_util.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_util.h	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/editors/include/ED_util.h	2010-12-15 04:06:19 UTC (rev 33675)
@@ -51,6 +51,11 @@
 void	ED_OT_undo				(struct wmOperatorType *ot);
 void	ED_OT_redo				(struct wmOperatorType *ot);
 
+int		ED_undo_operator_repeat(struct bContext *C, struct wmOperator *op);
+	/* convenience since UI callbacks use this mostly*/
+void	ED_undo_operator_repeat_cb(struct bContext *C, void *arg_op, void *arg_unused);
+void	ED_undo_operator_repeat_cb_evt(struct bContext *C, void *arg_op, int arg_unused);
+
 /* undo_editmode.c */
 void undo_editmode_push(struct bContext *C, const char *name, 
 						void * (*getdata)(struct bContext *C),
@@ -66,7 +71,6 @@
 void	undo_editmode_clear			(void);
 void	undo_editmode_step			(struct bContext *C, int step);
 
-
 /* ************** XXX OLD CRUFT WARNING ************* */
 
 void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, float fac3, int invert);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2010-12-15 04:06:19 UTC (rev 33675)
@@ -1392,26 +1392,6 @@
 	uiBlockEndAlign(block);
 }
 
-/* op->invoke */
-static void redo_cb(bContext *C, void *arg_op, void *arg2)
-{
-	wmOperator *lastop= arg_op;
-	
-	if(lastop) {
-		int retval;
-		
-		if (G.f & G_DEBUG)
-			printf("operator redo %s\n", lastop->type->name);
-		ED_undo_pop(C);
-		retval= WM_operator_repeat(C, lastop);
-		if((retval & OPERATOR_FINISHED)==0) {
-			if (G.f & G_DEBUG)
-				printf("operator redo failed %s\n", lastop->type->name);
-			ED_undo_redo(C);
-		}
-	}
-}
-
 static void view3d_panel_operator_redo(const bContext *C, Panel *pa)
 {
 	wmWindowManager *wm= CTX_wm_manager(C);
@@ -1429,7 +1409,7 @@
 	if(op==NULL)
 		return;
 	
-	uiBlockSetFunc(block, redo_cb, op, NULL);
+	uiBlockSetFunc(block, ED_undo_operator_repeat_cb, op, NULL);
 	
 	if(!op->properties) {
 		IDPropertyTemplate val = {0};

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_toolbar.c	2010-12-15 04:06:19 UTC (rev 33675)
@@ -63,38 +63,6 @@
 
 /* ******************* view3d space & buttons ************** */
 
-
-/* op->exec */
-/* XXX DUPLICATE CODE */
-static void redo_cb(bContext *C, void *arg_op, void *UNUSED(arg2))
-{
-	wmOperator *lastop= arg_op;
-	
-	if(lastop) {
-		ARegion *ar= CTX_wm_region(C);
-		ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
-		int retval;
-		
-		if(ar1)
-			CTX_wm_region_set(C, ar1);
-		
-		if (G.f & G_DEBUG)
-			printf("operator redo %s\n", lastop->type->name);
-		
-		ED_undo_pop_op(C, lastop);
-		retval= WM_operator_repeat(C, lastop);
-		
-		if((retval & OPERATOR_FINISHED)==0) {
-			if (G.f & G_DEBUG)
-				printf("operator redo failed %s\n", lastop->type->name);
-			ED_undo_redo(C);
-		}
-		
-		/* set region back */
-		CTX_wm_region_set(C, ar);
-	}
-}
-
 static wmOperator *view3d_last_operator(const bContext *C)
 {
 	wmWindowManager *wm= CTX_wm_manager(C);
@@ -118,6 +86,13 @@
 		op->properties= IDP_New(IDP_GROUP, val, "wmOperatorProperties");
 	}
 	
+	/* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
+	 * just fails silently */
+	if(!WM_operator_repeat_check(C, op)) {
+		uiBlockSetButLock(uiLayoutGetBlock(pa->layout), TRUE, "Operator cannot redo");
+		uiItemL(pa->layout, "* Redo Unsupported *", 0); // XXX, could give some nicer feedback or not show redo panel at all?
+	}
+
 	RNA_pointer_create(&wm->id, op->type->srna, op->properties, &ptr);
 	if(op->type->ui) {
 		op->layout= pa->layout;
@@ -161,7 +136,7 @@
 	
 	block= uiLayoutGetBlock(pa->layout);
 
-	uiBlockSetFunc(block, redo_cb, op, NULL);
+	uiBlockSetFunc(block, ED_undo_operator_repeat_cb, op, NULL);
 	
 	view3d_panel_operator_redo_operator(C, pa, op);
 }

Modified: trunk/blender/source/blender/editors/util/undo.c
===================================================================
--- trunk/blender/source/blender/editors/util/undo.c	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/editors/util/undo.c	2010-12-15 04:06:19 UTC (rev 33675)
@@ -38,6 +38,8 @@
 
 #include "BKE_blender.h"
 #include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_screen.h"
 
 #include "BLI_blenlib.h"
 #include "BLI_editVert.h"
@@ -261,3 +263,53 @@
 }
 
 
+/* ui callbacks should call this rather then calling WM_operator_repeat() themselves */
+int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
+{
+	int ret= 0;
+
+	if(op) {
+		ARegion *ar= CTX_wm_region(C);
+		ARegion *ar1= BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_WINDOW);
+
+		if(ar1)
+			CTX_wm_region_set(C, ar1);
+
+		if(WM_operator_repeat_check(C, op) && WM_operator_poll(C, op->type)) {
+			int retval;
+
+			if (G.f & G_DEBUG)
+				printf("redo_cb: operator redo %s\n", op->type->name);
+			ED_undo_pop_op(C, op);
+			retval= WM_operator_repeat(C, op);
+			if((retval & OPERATOR_FINISHED)==0) {
+				if (G.f & G_DEBUG)
+					printf("redo_cb: operator redo failed: %s, return %d\n", op->type->name, retval);
+				ED_undo_redo(C);
+			}
+			else {
+				ret= 1;
+			}
+		}
+
+		/* set region back */
+		CTX_wm_region_set(C, ar);
+	}
+	else {
+		if (G.f & G_DEBUG) {
+			printf("redo_cb: WM_operator_repeat_check returned false %s\n", op->type->name);
+		}
+	}
+
+	return ret;
+}
+
+void ED_undo_operator_repeat_cb(bContext *C, void *arg_op, void *UNUSED(arg_unused))
+{
+	ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}
+
+void ED_undo_operator_repeat_cb_evt(bContext *C, void *arg_op, int UNUSED(arg_event))
+{
+	ED_undo_operator_repeat(C, (wmOperator *)arg_op);
+}

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2010-12-15 04:06:19 UTC (rev 33675)
@@ -221,6 +221,7 @@
 int			WM_operator_poll_context(struct bContext *C, struct wmOperatorType *ot, int context);
 int			WM_operator_call		(struct bContext *C, struct wmOperator *op);
 int			WM_operator_repeat		(struct bContext *C, struct wmOperator *op);
+int			WM_operator_repeat_check(const struct bContext *C, struct wmOperator *op);
 int			WM_operator_name_call	(struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
 int			WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, int context, struct PointerRNA *properties, struct ReportList *reports);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2010-12-15 04:06:19 UTC (rev 33675)
@@ -514,6 +514,14 @@
 {
 	return wm_operator_exec(C, op, 1);
 }
+/* TRUE if WM_operator_repeat can run
+ * simple check for now but may become more involved.
+ * To be sure the operator can run call WM_operator_poll(C, op->type) also, since this call
+ * checks if WM_operator_repeat() can run at all, not that it WILL run at any time. */
+int WM_operator_repeat_check(const bContext *UNUSED(C), wmOperator *op)
+{
+	return op->type->exec != NULL;
+}
 
 static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
 {

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-12-15 03:53:56 UTC (rev 33674)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2010-12-15 04:06:19 UTC (rev 33675)
@@ -869,17 +869,6 @@
 	return 1;
 }
 
-/* op->exec */
-static void redo_cb(bContext *C, void *arg_op, int UNUSED(event))
-{
-	wmOperator *lastop= arg_op;
-	
-	if(lastop) {
-		ED_undo_pop_op(C, lastop);
-		WM_operator_repeat(C, lastop);
-	}
-}
-
 static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
 {
 	wmWindowManager *wm= CTX_wm_manager(C);
@@ -896,10 +885,10 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list