[Bf-blender-cvs] [459fe93] temp_manipulators_core: Hook up manipulator core with window-manager

Julian Eisel noreply at git.blender.org
Sun Sep 11 20:06:02 CEST 2016


Commit: 459fe932dab433991808824a7f665930e37e17f0
Author: Julian Eisel
Date:   Sun Sep 11 20:05:11 2016 +0200
Branches: temp_manipulators_core
https://developer.blender.org/rB459fe932dab433991808824a7f665930e37e17f0

Hook up manipulator core with window-manager

===================================================================

M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/screen.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_init_exit.c
M	source/blender/windowmanager/intern/wm_operators.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M	source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M	source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
M	source/blender/windowmanager/wm.h
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 157c440..b000f91 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -49,6 +49,9 @@ set(INC
 	../../../intern/smoke/extern
 	../../../intern/atomic
 	../../../intern/libmv
+
+	# XXX - BAD LEVEL CALL WM_api.h
+	../windowmanager
 )
 
 set(INC_SYS
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 857bd54..eff98ad 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -53,6 +53,10 @@
 #include "BKE_idprop.h"
 #include "BKE_screen.h"
 
+/* XXX bad level call */
+#include "WM_api.h"
+#include "WM_types.h"
+
 /* ************ Spacetype/regiontype handling ************** */
 
 /* keep global; this has to be accessible outside of windowmanager */
@@ -337,6 +341,11 @@ void BKE_area_region_free(SpaceType *st, ARegion *ar)
 			MEM_freeN(uilst->properties);
 		}
 	}
+
+	for (wmManipulatorMap *wmap = ar->widgetmaps.first, *wmap_tmp; wmap; wmap = wmap_tmp) {
+		wmap_tmp = wmap->next;
+		WM_manipulatormap_delete(wmap); /* XXX shouldn't be in blenkernel */
+	}
 	BLI_freelistN(&ar->ui_lists);
 	BLI_freelistN(&ar->ui_previews);
 	BLI_freelistN(&ar->panels_category);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 77d7439..57d65cd 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1674,7 +1674,12 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 			wm_handler_op_context(C, handler, event);
 			wm_region_mouse_co(C, event);
 			wm_event_modalkeymap(C, op, event, &dbl_click_disabled);
-			
+
+			/* attach widgetmap to handler if not there yet */
+			if (ot->wgrouptype && !handler->widgetmap) {
+				wm_manipulatorgroup_attach_to_modal_handler(C, handler, ot->wgrouptype, op);
+			}
+
 			if (ot->flag & OPTYPE_UNDO)
 				wm->op_undo_depth++;
 
@@ -1723,6 +1728,9 @@ static int wm_handler_operator_call(bContext *C, ListBase *handlers, wmEventHand
 					CTX_wm_region_set(C, NULL);
 				}
 
+				/* update widgets during modal handlers */
+				wm_manipulatormaps_handled_modal_update(C, event, handler, ot);
+
 				/* remove modal handler, operator itself should have been canceled and freed */
 				if (retval & (OPERATOR_CANCELLED | OPERATOR_FINISHED)) {
 					WM_cursor_grab_disable(CTX_wm_window(C), NULL);
@@ -2090,6 +2098,63 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 					}
 				}
 			}
+			else if (handler->widgetmap) {
+				ScrArea *area = CTX_wm_area(C);
+				ARegion *region = CTX_wm_region(C);
+				wmManipulatorMap *wmap = handler->widgetmap;
+				wmManipulator *widget = wm_manipulatormap_get_highlighted_widget(wmap);
+				unsigned char part;
+
+				wm_manipulatormap_handler_context(C, handler);
+				wm_region_mouse_co(C, event);
+
+				/* handle widget highlighting */
+				if (event->type == MOUSEMOVE && !wm_manipulatormap_get_active_widget(wmap)) {
+					if (wm_manipulatormap_is_3d(wmap)) {
+						widget = wm_manipulatormap_find_highlighted_3D(wmap, C, event, &part);
+						wm_manipulatormap_set_highlighted_widget(wmap, C, widget, part);
+					}
+					else {
+						widget = wm_manipulatormap_find_highlighted_widget(wmap, C, event, &part);
+						wm_manipulatormap_set_highlighted_widget(wmap, C, widget, part);
+					}
+				}
+				/* handle user configurable widgetmap keymap */
+				else if (widget && wmap->wmap_context.activegroup) {
+					/* get user customized keymap from default one */
+					const wmKeyMap *keymap = WM_keymap_active(wm, wmap->wmap_context.activegroup->type->keymap);
+					wmKeyMapItem *kmi;
+					/* TODO should probably add some PRINT calls here */
+
+					if (!keymap->poll || keymap->poll(C)) {
+						for (kmi = keymap->items.first; kmi; kmi = kmi->next) {
+							if (wm_eventmatch(event, kmi)) {
+								wmOperator *op = handler->op;
+
+								/* weak, but allows interactive callback to not use rawkey */
+								event->keymap_idname = kmi->idname;
+
+								/* handler->op is called later, we want keymap op to be triggered here */
+								handler->op = NULL;
+								action |= wm_handler_operator_call(C, handlers, handler, event, kmi->ptr);
+								handler->op = op;
+
+								if (action & WM_HANDLER_BREAK) {
+									break;
+								}
+							}
+						}
+					}
+				}
+
+				/* restore the area */
+				CTX_wm_area_set(C, area);
+				CTX_wm_region_set(C, region);
+
+				if (handler->op) {
+					action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
+				}
+			}
 			else {
 				/* modal, swallows all */
 				action |= wm_handler_operator_call(C, handlers, handler, event, NULL);
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 73622cd..776567f 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -530,6 +530,9 @@ void WM_exit_ext(bContext *C, const bool do_python)
 	ED_clipboard_posebuf_free();
 	BKE_node_clipboard_clear();
 
+	/* free manipulator-maps after freeing blender, so no deleted data get accessed during cleaning up of areas */
+	WM_manipulatormaptypes_free();
+
 	BLF_exit();
 
 #ifdef WITH_INTERNATIONAL
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 7177244..83c52d1 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -491,6 +491,9 @@ void WM_operatortype_remove_ptr(wmOperatorType *ot)
 	BLI_ghash_remove(global_ops_hash, ot->idname, NULL, NULL);
 
 	WM_keyconfig_update_operatortype();
+	if (ot->wgrouptype) {
+		WM_manipulatorgrouptype_unregister(NULL, G.main, ot->wgrouptype);
+	}
 
 	MEM_freeN(ot);
 }
@@ -4170,6 +4173,10 @@ void wm_operatortype_init(void)
 	WM_operatortype_append(WM_OT_previews_ensure);
 	WM_operatortype_append(WM_OT_previews_clear);
 	WM_operatortype_append(WM_OT_doc_view_manual_ui_context);
+
+	/* manipulators */
+	WM_operatortype_append(MANIPULATORGROUP_OT_manipulator_select);
+	WM_operatortype_append(MANIPULATORGROUP_OT_manipulator_tweak);
 }
 
 /* circleselect-like modal operators */
@@ -4475,6 +4482,7 @@ void wm_window_keymap(wmKeyConfig *keyconf)
 	RNA_float_set(kmi->ptr, "value", 1.0f / 1.5f);
 #endif /* WITH_INPUT_NDOF */
 
+	wm_manipulators_keymap(keyconf);
 	gesture_circle_modal_keymap(keyconf);
 	gesture_border_modal_keymap(keyconf);
 	gesture_zoom_border_modal_keymap(keyconf);
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index db556fd..a1c1eb5 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -121,7 +121,7 @@ wmManipulator *WM_manipulator_new(void (*draw)(const bContext *C, wmManipulator
 	fix_linking_manipulator_arrow2d();
 	fix_linking_manipulator_cage();
 	fix_linking_manipulator_dial();
-	fix_linking_manipulator_facemap();
+//	fix_linking_manipulator_facemap();
 	fix_linking_manipulator_primitive();
 
 	return widget;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index b5b58da..49772e5 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -94,8 +94,10 @@ void WM_manipulatorgroup_free(bContext *C, wmManipulatorMap *wmap, wmManipulator
 	MEM_freeN(wgroup);
 }
 
-void wm_manipulatorgroup_attach_to_modal_handler(bContext *C, wmEventHandler *handler,
-                                            wmManipulatorGroupType *wgrouptype, wmOperator *op)
+/* TODO could be done a bit nicer */
+void wm_manipulatorgroup_attach_to_modal_handler(
+        bContext *C, wmEventHandler *handler,
+        wmManipulatorGroupType *wgrouptype, wmOperator *op)
 {
 	/* maybe overly careful, but widgetgrouptype could come from a failed creation */
 	if (!wgrouptype) {
diff --git a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
index 877388b..faf3d0d 100644
--- a/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
+++ b/source/blender/windowmanager/manipulators/wm_manipulator_wmapi.h
@@ -126,8 +126,9 @@ typedef struct wmManipulator {
 void MANIPULATORGROUP_OT_manipulator_select(struct wmOperatorType *ot);
 void MANIPULATORGROUP_OT_manipulator_tweak(struct wmOperatorType *ot);
 
-void  wm_manipulatorgroup_attach_to_modal_handler(struct bContext *C, struct wmEventHandler *handler,
-                                             struct wmManipulatorGroupType *wgrouptype, struct wmOperator *op);
+void  wm_manipulatorgroup_attach_to_modal_handler(
+        struct bContext *C, struct wmEventHandler *handler,
+        struct wmManipulatorGroupType *wgrouptype, struct wmOperator *op);
 
 /* wmManipulatorGroupType->flag */
 enum {
diff --git a/source/blender/windowmanager/wm.h b/source/blender/windowmanager/wm.h
index 2f06dda..3dd2941 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -34,6 +34,8 @@
 struct wmWindow;
 struct ReportList;
 
+#include "manipulators/wm_manipulator_wmapi.h"
+
 typedef struct wmPaintCursor {
 	struct wmPaintCursor *next, *prev;
 
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index d8a4ddc..623f7bc 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -336,6 +336,8 @@ void WM_jobs_callbacks(struct wmJob *job,
 void WM_jobs_start(struct wmWindowManager *wm, struct wmJob *job) RET_NONE
 void WM_report(ReportType type, const char *message) RET_NONE
 
+void WM_manipulatormap_delete(struct wmManipulatorMap *wmap) RET_NONE
+
 #ifdef WITH_INPUT_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list