[Bf-blender-cvs] [d928155] wiggly-widgets: Fixes to highlight code, now widgetmaps remember last active widget and reset accordingly.

Antony Riakiotakis noreply at git.blender.org
Wed Oct 1 18:44:46 CEST 2014


Commit: d928155df1421ccdc54dcbe465933a9fadd28b2b
Author: Antony Riakiotakis
Date:   Wed Oct 1 18:44:40 2014 +0200
Branches: wiggly-widgets
https://developer.blender.org/rBd928155df1421ccdc54dcbe465933a9fadd28b2b

Fixes to highlight code, now widgetmaps remember last active widget and
reset accordingly.

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

M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_widgets.c
M	source/blender/windowmanager/wm_event_system.h

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

diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 25e8c19..48fb9ab 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -891,7 +891,7 @@ static void draw_manipulator_axes_single(View3D *v3d, RegionView3D *rv3d, int co
 					else if (flagx & MAN_TRANS_X) GPU_select_load_id(selectionbase + MAN_SEL_TRANS_X);
 				}
 				else {
-					manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->tw_idot[0]), (highlight & MAN_TRANS_X) != 0);
+					manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->tw_idot[0]), (highlight & (MAN_TRANS_X | MAN_SCALE_X)) != 0);
 				}
 				glBegin(GL_LINES);
 				glVertex3f(0.2f, 0.0f, 0.0f);
@@ -906,7 +906,7 @@ static void draw_manipulator_axes_single(View3D *v3d, RegionView3D *rv3d, int co
 					else if (flagy & MAN_TRANS_Y) GPU_select_load_id(selectionbase + MAN_SEL_TRANS_Y);
 				}
 				else {
-					manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->tw_idot[1]), (highlight & MAN_TRANS_Y) != 0);
+					manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->tw_idot[1]), (highlight & (MAN_TRANS_Y | MAN_SCALE_Y)) != 0);
 				}
 				glBegin(GL_LINES);
 				glVertex3f(0.0f, 0.2f, 0.0f);
@@ -921,7 +921,7 @@ static void draw_manipulator_axes_single(View3D *v3d, RegionView3D *rv3d, int co
 					else if (flagz & MAN_TRANS_Z) GPU_select_load_id(selectionbase + MAN_SEL_TRANS_Z);
 				}
 				else {
-					manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->tw_idot[2]), (highlight & MAN_TRANS_Y) != 0);
+					manipulator_setcolor(v3d, 'Z', colcode, axisBlendAngle(rv3d->tw_idot[2]), (highlight & (MAN_TRANS_Z | MAN_SCALE_Z)) != 0);
 				}
 				glBegin(GL_LINES);
 				glVertex3f(0.0f, 0.0f, 0.2f);
@@ -1636,7 +1636,10 @@ void BIF_draw_manipulator(const bContext *C, wmWidget *widget)
 	View3D *v3d = sa->spacedata.first;
 	RegionView3D *rv3d = ar->regiondata;
 	int totsel;
-	int highlight = *((int *)widget->customdata);
+	int highlight = 0;
+	
+	if (widget->flag & WM_WIDGET_HIGHLIGHT)
+		highlight = *((int *)widget->customdata);
 	
 	v3d->twflag &= ~V3D_DRAW_MANIPULATOR;
 	
@@ -1748,6 +1751,7 @@ int BIF_manipulator_handler(bContext *C, const struct wmEvent *event, wmWidget *
 	int constraint_axis[3] = {0, 0, 0};
 	int val;
 	int shift = event->shift;
+	int *prevval = ((int *)widget->customdata);
 
 	struct IDProperty *properties = NULL;	/* operator properties, assigned to ptr->data and can be written to a file */
 	struct PointerRNA *ptr = NULL;			/* rna pointer to access properties */
@@ -1766,8 +1770,10 @@ int BIF_manipulator_handler(bContext *C, const struct wmEvent *event, wmWidget *
 	else 
 		val = 0;
 	
-	ED_region_tag_redraw(ar);
-	*((int *)widget->customdata) = val;
+	if (*prevval != val) {
+		*prevval = val;
+		ED_region_tag_redraw(ar);
+	}
 	
 	if (!((v3d->twflag & V3D_USE_MANIPULATOR) && (v3d->twflag & V3D_DRAW_MANIPULATOR)) ||
 	    !(event->keymodifier == 0 || event->keymodifier == KM_SHIFT) || 
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index b6d5a7b..8ee270f 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1972,19 +1972,23 @@ static int wm_handlers_do_intern(bContext *C, wmEvent *event, ListBase *handlers
 			}
 			else if (handler->widgetmap) {
 				int ret;
+				struct wmWidgetMap *wmap = handler->widgetmap;
+				wmWidget *widget = NULL;
 				
-				if (wm_widgetmap_is_3d(handler->widgetmap)) {
+				if (wm_widgetmap_is_3d(wmap)) {
 					/* similar interface to operators */
-					if ((ret = wm_widget_find_active_3D (handler->widgetmap, C, event)) != -1)
+					if ((ret = wm_widget_find_active_3D (wmap, C, event)) != -1)
 					{
-						ListBase *widgets = wm_widgetmap_widget_list(handler->widgetmap);
-						wmWidget *widget = BLI_findlink(widgets, ret >> 8);
-						
+						ListBase *widgets = wm_widgetmap_widget_list(wmap);
+						widget = BLI_findlink(widgets, ret >> 8);
+												
 						if ((ret = widget->handler(C, event, widget, ret & 0xFF)) == OPERATOR_FINISHED) {
 							action |= WM_HANDLER_BREAK;
 						}
 					}
 				}
+
+				wm_widgetmap_set_active_widget(wmap, C, widget);
 			}
 			else {
 				/* modal, swallows all */
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index ec169d7..b6d06a3 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -54,6 +54,7 @@
 #include "BKE_screen.h"
 
 #include "ED_view3d.h"
+#include "ED_screen.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -78,6 +79,9 @@ typedef struct wmWidgetMap {
 	char idname[KMAP_MAX_NAME];
 	/* check if widgetmap does 3D drawing */
 	bool is_3d;
+	
+	/* active widget for this map. We redraw the widgetmap when this changes  */
+	wmWidget *active_widget;
 } wmWidgetMap;
 
 /* store all widgetboxmaps here. Anyone who wants to register a widget for a certain 
@@ -316,3 +320,21 @@ int wm_widget_find_active_3D (struct wmWidgetMap *wmap, bContext *C, const struc
 	
 	return -1;
 }
+
+void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C, struct wmWidget *widget)
+{
+	ARegion *ar = CTX_wm_region(C);
+		
+	if (widget != wmap->active_widget) {
+		if (wmap->active_widget) {
+			wmap->active_widget->flag &= ~WM_WIDGET_HIGHLIGHT;
+		}
+		wmap->active_widget = widget;
+		
+		if (widget)
+			widget->flag |= WM_WIDGET_HIGHLIGHT;
+
+		/* tag the region for redraw */		
+		ED_region_tag_redraw(ar);
+	}
+}
diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h
index a0e7911..f617576 100644
--- a/source/blender/windowmanager/wm_event_system.h
+++ b/source/blender/windowmanager/wm_event_system.h
@@ -109,7 +109,8 @@ void        wm_drags_check_ops(bContext *C, wmEvent *event);
 void        wm_drags_draw(bContext *C, wmWindow *win, rcti *rect);
 
 /* wm_widgets.c */
-int wm_widget_find_active_3D (struct wmWidgetMap *wmap, struct bContext *C, const struct wmEvent *event);
+int wm_widget_find_active_3D(struct wmWidgetMap *wmap, struct bContext *C, const struct wmEvent *event);
+void wm_widgetmap_set_active_widget(struct wmWidgetMap *wmap, struct bContext *C, struct wmWidget *widget);
 
 #endif /* __WM_EVENT_SYSTEM_H__ */




More information about the Bf-blender-cvs mailing list