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