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__ */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to