[Bf-blender-cvs] [291c286] custom-manipulators temp_manipulators_core: Split wmManipulator flag into behavior flags and state flags
Julian Eisel
noreply at git.blender.org
Tue Oct 4 02:17:13 CEST 2016
Commit: 291c28642dce6b0ab22d1a848c40ed352bef8975
Author: Julian Eisel
Date: Mon Oct 3 20:04:21 2016 +0200
Branches: custom-manipulators temp_manipulators_core
https://developer.blender.org/rB291c28642dce6b0ab22d1a848c40ed352bef8975
Split wmManipulator flag into behavior flags and state flags
===================================================================
M source/blender/windowmanager/manipulators/WM_manipulator_types.h
M source/blender/windowmanager/manipulators/intern/wm_manipulator.c
M source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
M source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
M source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
===================================================================
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 13ae223..ab9220a 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -59,19 +59,15 @@ typedef struct wmManipulatorWrapper {
} wmManipulatorWrapper;
/* wmManipulator->flag */
+/* TODO some of these could become group-type flags */
enum eManipulatorFlag {
- /* states (TODO separate bitfield) */
- WM_MANIPULATOR_HIGHLIGHT = (1 << 0),
- WM_MANIPULATOR_ACTIVE = (1 << 1),
- WM_MANIPULATOR_SELECTED = (1 << 2),
- /* settings */
- WM_MANIPULATOR_DRAW_HOVER = (1 << 3),
- WM_MANIPULATOR_DRAW_ACTIVE = (1 << 4), /* draw while dragging */
- WM_MANIPULATOR_DRAW_VALUE = (1 << 5), /* draw a indicator for the current value while dragging */
- WM_MANIPULATOR_SCALE_3D = (1 << 6),
- WM_MANIPULATOR_SCENE_DEPTH = (1 << 7), /* manipulator is depth culled with scene objects (TODO could be group flag) */
- WM_MANIPULATOR_HIDDEN = (1 << 8),
- WM_MANIPULATOR_SELECTABLE = (1 << 9),
+ WM_MANIPULATOR_DRAW_HOVER = (1 << 0), /* draw *only* while hovering */
+ WM_MANIPULATOR_DRAW_ACTIVE = (1 << 1), /* draw while dragging */
+ WM_MANIPULATOR_DRAW_VALUE = (1 << 2), /* draw a indicator for the current value while dragging */
+ WM_MANIPULATOR_SCALE_3D = (1 << 3),
+ WM_MANIPULATOR_SCENE_DEPTH = (1 << 4), /* manipulator can be depth culled with scene objects */
+ WM_MANIPULATOR_HIDDEN = (1 << 5),
+ WM_MANIPULATOR_SELECTABLE = (1 << 6),
};
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index 0d5c46b..347726e 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -185,13 +185,13 @@ bool wm_manipulator_register(wmManipulatorGroup *mgroup, wmManipulator *manipula
*/
void WM_manipulator_delete(ListBase *manipulatorlist, wmManipulatorMap *mmap, wmManipulator *manipulator, bContext *C)
{
- if (manipulator->flag & WM_MANIPULATOR_HIGHLIGHT) {
+ if (manipulator->state & WM_MANIPULATOR_HIGHLIGHT) {
wm_manipulatormap_set_highlighted_manipulator(mmap, C, NULL, 0);
}
- if (manipulator->flag & WM_MANIPULATOR_ACTIVE) {
+ if (manipulator->state & WM_MANIPULATOR_ACTIVE) {
wm_manipulatormap_set_active_manipulator(mmap, C, NULL, NULL);
}
- if (manipulator->flag & WM_MANIPULATOR_SELECTED) {
+ if (manipulator->state & WM_MANIPULATOR_SELECTED) {
wm_manipulator_deselect(mmap, manipulator);
}
@@ -338,7 +338,7 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator)
bool changed = false;
/* caller should check! */
- BLI_assert(manipulator->flag & WM_MANIPULATOR_SELECTED);
+ BLI_assert(manipulator->state & WM_MANIPULATOR_SELECTED);
/* remove manipulator from selected_manipulators array */
for (int i = 0; i < (*tot_selected); i++) {
@@ -360,7 +360,7 @@ bool wm_manipulator_deselect(wmManipulatorMap *mmap, wmManipulator *manipulator)
(*tot_selected)--;
}
- manipulator->flag &= ~WM_MANIPULATOR_SELECTED;
+ manipulator->state &= ~WM_MANIPULATOR_SELECTED;
return changed;
}
@@ -375,7 +375,7 @@ bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *m
wmManipulator ***sel = &mmap->mmap_context.selected_manipulator;
int *tot_selected = &mmap->mmap_context.tot_selected;
- if (!manipulator || (manipulator->flag & WM_MANIPULATOR_SELECTED))
+ if (!manipulator || (manipulator->state & WM_MANIPULATOR_SELECTED))
return false;
(*tot_selected)++;
@@ -383,7 +383,7 @@ bool wm_manipulator_select(bContext *C, wmManipulatorMap *mmap, wmManipulator *m
*sel = MEM_reallocN(*sel, sizeof(wmManipulator *) * (*tot_selected));
(*sel)[(*tot_selected) - 1] = manipulator;
- manipulator->flag |= WM_MANIPULATOR_SELECTED;
+ manipulator->state |= WM_MANIPULATOR_SELECTED;
if (manipulator->select) {
manipulator->select(C, manipulator, SEL_SELECT);
}
@@ -442,13 +442,13 @@ bool wm_manipulator_is_visible(wmManipulator *manipulator)
if (manipulator->flag & WM_MANIPULATOR_HIDDEN) {
return false;
}
- if ((manipulator->flag & WM_MANIPULATOR_ACTIVE) &&
+ if ((manipulator->state & WM_MANIPULATOR_ACTIVE) &&
!(manipulator->flag & (WM_MANIPULATOR_DRAW_ACTIVE | WM_MANIPULATOR_DRAW_VALUE)))
{
/* don't draw while active (while dragging) */
return false;
}
- if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->flag & WM_MANIPULATOR_HIGHLIGHT)) {
+ if ((manipulator->flag & WM_MANIPULATOR_DRAW_HOVER) && !(manipulator->state & WM_MANIPULATOR_HIGHLIGHT)) {
/* only draw on mouse hover */
return false;
}
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
index 4791282..dd284e9 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
@@ -71,7 +71,8 @@ typedef struct wmManipulator {
/* called when manipulator selection state changes */
wmManipulatorSelectFunc select;
- int flag; /* flags set by drawing and interaction, such as highlighting */
+ int flag; /* flags that influence the behavior or how the manipulators are drawn */
+ short state; /* state flags (active, highlighted, selected) */
unsigned char highlighted_part;
@@ -105,6 +106,13 @@ typedef struct wmManipulator {
PropertyRNA **props;
} wmManipulator;
+/* wmManipulator.state */
+enum {
+ WM_MANIPULATOR_HIGHLIGHT = (1 << 0), /* while hovered */
+ WM_MANIPULATOR_ACTIVE = (1 << 1), /* while dragging */
+ WM_MANIPULATOR_SELECTED = (1 << 2),
+};
+
/**
* \brief Manipulator tweak flag.
* Bitflag passed to manipulator while tweaking.
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
index c2780d3..fc869eb 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatorgroup.c
@@ -204,7 +204,7 @@ static int manipulator_select_invoke(bContext *C, wmOperator *op, const wmEvent
}
if (highlighted) {
- const bool is_selected = (highlighted->flag & WM_MANIPULATOR_SELECTED);
+ const bool is_selected = (highlighted->state & WM_MANIPULATOR_SELECTED);
bool redraw = false;
if (toggle) {
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
index 579d6b2..cac8eb1 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulatormap.c
@@ -212,13 +212,11 @@ static void manipulatormap_prepare_drawing(
for (wmManipulatorGroup *mgroup = mmap->manipulator_groups.first; mgroup; mgroup = mgroup->next) {
/* account for drawstep on manipulator-group level (do first to avoid calling mgroup->poll if not needed) */
if ((drawstep == WM_MANIPULATORMAP_DRAWSTEP_2D && mgroup->type->is_3d) ||
- (drawstep == WM_MANIPULATORMAP_DRAWSTEP_3D && !mgroup->type->is_3d))
+ (drawstep == WM_MANIPULATORMAP_DRAWSTEP_3D && !mgroup->type->is_3d) ||
+ !wm_manipulatorgroup_is_visible(mgroup, C))
{
continue;
}
- if (!wm_manipulatorgroup_is_visible(mgroup, C)) {
- continue;
- }
/* needs to be initialized on first draw */
wm_manipulatorgroup_ensure_initialized(mgroup, C);
@@ -485,7 +483,7 @@ bool wm_manipulatormap_deselect_all(wmManipulatorMap *mmap, wmManipulator ***sel
return false;
for (int i = 0; i < mmap->mmap_context.tot_selected; i++) {
- (*sel)[i]->flag &= ~WM_MANIPULATOR_SELECTED;
+ (*sel)[i]->state &= ~WM_MANIPULATOR_SELECTED;
(*sel)[i] = NULL;
}
wm_manipulatormap_selected_delete(mmap);
@@ -523,10 +521,10 @@ static bool wm_manipulatormap_select_all_intern(
GHASH_ITER_INDEX (gh_iter, hash, i) {
wmManipulator *manipulator_iter = BLI_ghashIterator_getValue(&gh_iter);
- if ((manipulator_iter->flag & WM_MANIPULATOR_SELECTED) == 0) {
+ if ((manipulator_iter->state & WM_MANIPULATOR_SELECTED) == 0) {
changed = true;
}
- manipulator_iter->flag |= WM_MANIPULATOR_SELECTED;
+ manipulator_iter->state |= WM_MANIPULATOR_SELECTED;
if (manipulator_iter->select) {
manipulator_iter->select(C, manipulator_iter, action);
}
@@ -628,14 +626,14 @@ void wm_manipulatormap_set_highlighted_manipulator(
(manipulator && part != manipulator->highlighted_part))
{
if (mmap->mmap_context.highlighted_manipulator) {
- mmap->mmap_context.highlighted_manipulator->flag &= ~WM_MANIPULATOR_HIGHLIGHT;
+ mmap->mmap_context.highlighted_manipulator->state &= ~WM_MANIPULATOR_HIGHLIGHT;
mmap->mmap_context.highlighted_manipulator->highlighted_part = 0;
}
mmap->mmap_context.highlighted_manipulator = manipulator;
if (manipulator) {
- manipulator->flag |= WM_MANIPULATOR_HIGHLIGHT;
+ manipulator->state |= WM_MANIPULATOR_HIGHLIGHT;
manipulator->highlighted_part = part;
if (C && manipulator->get_cursor) {
@@ -667,7 +665,7 @@ void wm_manipulatormap_set_active_manipulator(
wmManipulatorMap *mmap, bContext *C, const wmEvent *event, wmManipulator *manipulator)
{
if (manipulator && C) {
- manipulator->flag |= WM_MANIPULATOR_ACTIVE;
+ manipulator->state |= WM_MANIPULATOR_ACTIVE;
mmap->mmap_context.active_manipulator = manipulator;
if (manipulator->opname) {
@@ -683,7 +681,7 @@ void wm_manipulatormap_set_active_manipulator(
/* we failed to hook the manipulator to the operator handler or operator was cancelled, return */
if (!mmap->mmap_context.active_manipulator) {
- manipulator->flag &= ~WM_MANIPULATOR_ACTIVE;
+ manipulator->state &= ~WM_MANIPULATOR_ACTIVE;
/* first activate the manipulator itself */
if (manipulator->interaction_data) {
MEM_freeN(manipulator->interaction_data);
@@ -711,7 +709,7 @@ void wm_manipulatormap_set_active_manipulator(
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list