Commit: 572bc1364ca9d978edf5aee991849dd4f8e56a52
Author: Julian Eisel
Date:   Sun Sep 18 21:36:34 2016 +0200
Branches: master
https://developer.blender.org/rB572bc1364ca9d978edf5aee991849dd4f8e56a52

BLI_listbase: Add/use utility to move link (BLI_listbase_link_move)

We were calling BLI_remlink and then BLI_insertlinkbefore/after quite often. 
BLI_listbase_link_move simplifies code a bit and makes it easier to follow. It 
also returns if link position has changed which can be used to avoid 
unnecessary updates.

Added it to a number of list reorder operators for now and made use of return 
value. Behavior shouldn't be changed.

Also some minor cleanup.

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

M       source/blender/blenkernel/BKE_freestyle.h
M       source/blender/blenkernel/BKE_linestyle.h
M       source/blender/blenkernel/intern/freestyle.c
M       source/blender/blenkernel/intern/linestyle.c
M       source/blender/blenlib/BLI_listbase.h
M       source/blender/blenlib/intern/listbase.c
M       source/blender/editors/armature/pose_group.c
M       source/blender/editors/armature/pose_lib.c
M       source/blender/editors/gpencil/gpencil_data.c
M       source/blender/editors/object/object_vgroup.c
M       source/blender/editors/render/render_shading.c
M       source/blender/freestyle/FRS_freestyle.h
M       source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
M       source/blender/makesrna/RNA_access.h

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

diff --git a/source/blender/blenkernel/BKE_freestyle.h 
b/source/blender/blenkernel/BKE_freestyle.h
index e105946..50407f3 100644
--- a/source/blender/blenkernel/BKE_freestyle.h
+++ b/source/blender/blenkernel/BKE_freestyle.h
@@ -55,8 +55,7 @@ void BKE_freestyle_config_copy(FreestyleConfig *new_config, 
FreestyleConfig *con
 /* FreestyleConfig.modules */
 FreestyleModuleConfig *BKE_freestyle_module_add(FreestyleConfig *config);
 bool BKE_freestyle_module_delete(FreestyleConfig *config, 
FreestyleModuleConfig *module_conf);
-bool BKE_freestyle_module_move_up(FreestyleConfig *config, 
FreestyleModuleConfig *module_conf);
-bool BKE_freestyle_module_move_down(FreestyleConfig *config, 
FreestyleModuleConfig *module_conf);
+bool BKE_freestyle_module_move(FreestyleConfig *config, FreestyleModuleConfig 
*module_conf, int direction);
 
 /* FreestyleConfig.linesets */
 FreestyleLineSet *BKE_freestyle_lineset_add(struct Main *bmain, 
FreestyleConfig *config, const char *name);
diff --git a/source/blender/blenkernel/BKE_linestyle.h 
b/source/blender/blenkernel/BKE_linestyle.h
index e96ef4e..af9bf58 100644
--- a/source/blender/blenkernel/BKE_linestyle.h
+++ b/source/blender/blenkernel/BKE_linestyle.h
@@ -73,10 +73,10 @@ int BKE_linestyle_alpha_modifier_remove(FreestyleLineStyle 
*linestyle, LineStyle
 int BKE_linestyle_thickness_modifier_remove(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier);
 int BKE_linestyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier);
 
-void BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
-void BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
-void BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
-void BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
+bool BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
+bool BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
+bool BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
+bool BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction);
 
 void BKE_linestyle_modifier_list_color_ramps(FreestyleLineStyle *linestyle, 
ListBase *listbase);
 char *BKE_linestyle_path_to_color_ramp(FreestyleLineStyle *linestyle, struct 
ColorBand *color_ramp);
diff --git a/source/blender/blenkernel/intern/freestyle.c 
b/source/blender/blenkernel/intern/freestyle.c
index 3a15be5..21fc167 100644
--- a/source/blender/blenkernel/intern/freestyle.c
+++ b/source/blender/blenkernel/intern/freestyle.c
@@ -151,22 +151,14 @@ bool BKE_freestyle_module_delete(FreestyleConfig *config, 
FreestyleModuleConfig
        return true;
 }
 
-bool BKE_freestyle_module_move_up(FreestyleConfig *config, 
FreestyleModuleConfig *module_conf)
-{
-       if (BLI_findindex(&config->modules, module_conf) == -1)
-               return false;
-       BLI_remlink(&config->modules, module_conf);
-       BLI_insertlinkbefore(&config->modules, module_conf->prev, module_conf);
-       return true;
-}
-
-bool BKE_freestyle_module_move_down(FreestyleConfig *config, 
FreestyleModuleConfig *module_conf)
+/**
+ * Reinsert \a module_conf offset by \a direction from current position.
+ * \return if position of \a module_conf changed.
+ */
+bool BKE_freestyle_module_move(FreestyleConfig *config, FreestyleModuleConfig 
*module_conf, int direction)
 {
-       if (BLI_findindex(&config->modules, module_conf) == -1)
-               return false;
-       BLI_remlink(&config->modules, module_conf);
-       BLI_insertlinkafter(&config->modules, module_conf->next, module_conf);
-       return true;
+       return ((BLI_findindex(&config->modules, module_conf) > -1) &&
+               (BLI_listbase_link_move(&config->modules, module_conf, 
direction) == true));
 }
 
 void BKE_freestyle_lineset_unique_name(FreestyleConfig *config, 
FreestyleLineSet *lineset)
diff --git a/source/blender/blenkernel/intern/linestyle.c 
b/source/blender/blenkernel/intern/linestyle.c
index 430935a..bd21215 100644
--- a/source/blender/blenkernel/intern/linestyle.c
+++ b/source/blender/blenkernel/intern/linestyle.c
@@ -1343,33 +1343,25 @@ int 
BKE_linestyle_geometry_modifier_remove(FreestyleLineStyle *linestyle, LineSt
        return 0;
 }
 
-static void move_modifier(ListBase *lb, LineStyleModifier *modifier, int 
direction)
+/**
+ * Reinsert \a modifier in modifier list with an offset of \a direction.
+ * \return if position of \a modifier has changed.
+ */
+bool BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
 {
-       BLI_remlink(lb, modifier);
-       if (direction > 0)
-               BLI_insertlinkbefore(lb, modifier->prev, modifier);
-       else
-               BLI_insertlinkafter(lb, modifier->next, modifier);
+       return BLI_listbase_link_move(&linestyle->color_modifiers, modifier, 
direction);
 }
-
-void BKE_linestyle_color_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
+bool BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
 {
-       move_modifier(&linestyle->color_modifiers, modifier, direction);
+       return BLI_listbase_link_move(&linestyle->alpha_modifiers, modifier, 
direction);
 }
-
-void BKE_linestyle_alpha_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
+bool BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
 {
-       move_modifier(&linestyle->alpha_modifiers, modifier, direction);
+       return BLI_listbase_link_move(&linestyle->thickness_modifiers, 
modifier, direction);
 }
-
-void BKE_linestyle_thickness_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
-{
-       move_modifier(&linestyle->thickness_modifiers, modifier, direction);
-}
-
-void BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
+bool BKE_linestyle_geometry_modifier_move(FreestyleLineStyle *linestyle, 
LineStyleModifier *modifier, int direction)
 {
-       move_modifier(&linestyle->geometry_modifiers, modifier, direction);
+       return BLI_listbase_link_move(&linestyle->geometry_modifiers, modifier, 
direction);
 }
 
 void BKE_linestyle_modifier_list_color_ramps(FreestyleLineStyle *linestyle, 
ListBase *listbase)
diff --git a/source/blender/blenlib/BLI_listbase.h 
b/source/blender/blenlib/BLI_listbase.h
index 9dfa800..96349a7 100644
--- a/source/blender/blenlib/BLI_listbase.h
+++ b/source/blender/blenlib/BLI_listbase.h
@@ -69,6 +69,7 @@ void BLI_insertlinkbefore(struct ListBase *listbase, void 
*vnextlink, void *vnew
 void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void 
*vnewlink) ATTR_NONNULL(1);
 void BLI_listbase_sort(struct ListBase *listbase, int (*cmp)(const void *, 
const void *)) ATTR_NONNULL(1, 2);
 void BLI_listbase_sort_r(ListBase *listbase, int (*cmp)(void *, const void *, 
const void *), void *thunk) ATTR_NONNULL(1, 2);
+bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step) 
ATTR_NONNULL();
 void BLI_freelist(struct ListBase *listbase) ATTR_NONNULL(1);
 int  BLI_listbase_count_ex(const struct ListBase *listbase, const int 
count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
 int  BLI_listbase_count(const struct ListBase *listbase) 
ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1);
diff --git a/source/blender/blenlib/intern/listbase.c 
b/source/blender/blenlib/intern/listbase.c
index ebee2c7..e72eff5 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -342,6 +342,44 @@ void BLI_insertlinkbefore(ListBase *listbase, void 
*vnextlink, void *vnewlink)
        }
 }
 
+/**
+ * Reinsert \a link relative to its current position but offset by \a step. 
Doesn't move
+ * item if new position would exceed list (could optionally move to head/tail).
+ *
+ * \param step: Absolute value defines step size, sign defines direction. E.g 
pass -1
+ *              to move \a link before previous, or 1 to move behind next.
+ * \return If position of \a link has changed.
+ */
+bool BLI_listbase_link_move(ListBase *listbase, void *vlink, int step)
+{
+       Link *link = vlink;
+       Link *hook = link;
+       const bool is_up = step < 0;
+
+       if (step == 0 || vlink == NULL) {
+               return false;
+       }
+       BLI_assert(BLI_findindex(listbase, link) != -1);
+
+       /* find link to insert before/after */
+       for (int i = 0; i < ABS(step); i++) {
+               hook = is_up ? hook->prev : hook->next;
+               if (!hook) {
+                       return false;
+               }
+       }
+
+       /* reinsert link */
+       BLI_remlink(listbase, vlink);
+       if (is_up) {
+               BLI_insertlinkbefore(listbase, hook, vlink);
+       }
+       else {
+               BLI_insertlinkafter(listbase, hook, vlink);
+       }
+       return true;
+}
+
 
 /**
  * Removes and disposes of the entire contents of listbase using direct 
free(3).
diff --git a/source/blender/editors/armature/pose_group.c 
b/source/blender/editors/armature/pose_group.c
index 85bee02..85cff2e 100644
--- a/source/blender/editors/armature/pose_group.c
+++ b/source/blender/editors/armature/pose_group.c
@@ -306,50 +306,31 @@ static int group_move_exec(bContext *C, wmOperator *op)
 
        /* move bone group */
        grpIndexA = pose->active_group;
-       if (dir == 1) { /* up */
-               void *prev = grp->prev;
-               
-               if (prev == NULL)
-                       return OPERATOR_FINISHED;
-                       
-               BLI_remlink(&pose->agroups, grp);
-               BLI_insertlinkbefore(&pose->agroups, prev, grp);
-               
-               grpIndexB = grpIndexA - 1;
-               pose->active_group--;
-       }
-       else { /* down */
-               void *next = grp->next;
-               
-               if (next == NULL)
-                       return OPERATOR_FINISHED;
-                       
-               BLI_remlink(&pose->agroups, grp);
-               BLI_insertlinkafter(&pose->agroups, next, grp);
-               
-               grpIndexB = grpIndexA + 1;
-               pose->active_group++;
-       }
+       if (BLI_listbase_link_move(&pose->agroups, grp, dir)) {
+               grpIndexB = grpIndexA + dir;
+               pose->active_group += dir;
+               /* fix changed bone group indices in bones (swap grpIndexA with 
grpIndexB) */
+               for (pchan = ob->pose->chanbase.first; pchan; pchan = 
pchan->next) {
+                       if (pchan->agrp_index == grpIndex

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to