[Bf-blender-cvs] [8709a46e969] modifier-panels-ui: Add modifier move to index API function

Hans Goudey noreply at git.blender.org
Thu Apr 2 16:58:55 CEST 2020


Commit: 8709a46e969c3c6d72eb302437ba99ca142d146c
Author: Hans Goudey
Date:   Wed Apr 1 13:58:18 2020 -0500
Branches: modifier-panels-ui
https://developer.blender.org/rB8709a46e969c3c6d72eb302437ba99ca142d146c

Add modifier move to index API function

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

M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index 3b38969d6bf..b4dd7181966 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -355,12 +355,17 @@ bool ED_object_modifier_remove(struct ReportList *reports,
                                struct Object *ob,
                                struct ModifierData *md);
 void ED_object_modifier_clear(struct Main *bmain, struct Object *ob);
-int ED_object_modifier_move_down(struct ReportList *reports,
-                                 struct Object *ob,
-                                 struct ModifierData *md);
-int ED_object_modifier_move_up(struct ReportList *reports,
-                               struct Object *ob,
-                               struct ModifierData *md);
+bool ED_object_modifier_move_down(struct ReportList *reports,
+                                  struct Object *ob,
+                                  struct ModifierData *md);
+bool ED_object_modifier_move_up(struct ReportList *reports,
+                                struct Object *ob,
+                                struct ModifierData *md);
+bool ED_object_modifier_move_to_index(struct ReportList *reports,
+                                      struct Object *ob,
+                                      struct ModifierData *md,
+                                      const int index);
+
 int ED_object_modifier_convert(struct ReportList *reports,
                                struct Main *bmain,
                                struct Depsgraph *depsgraph,
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 0c9ad11cd9b..3557a6eda24 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -431,7 +431,7 @@ void ED_object_modifier_clear(Main *bmain, Object *ob)
   DEG_relations_tag_update(bmain);
 }
 
-int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
+bool ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md)
 {
   if (md->prev) {
     const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -441,18 +441,22 @@ int ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *md
 
       if (nmti->flags & eModifierTypeFlag_RequiresOriginalData) {
         BKE_report(reports, RPT_WARNING, "Cannot move above a modifier requiring original data");
-        return 0;
+        return false;
       }
     }
 
     BLI_remlink(&ob->modifiers, md);
     BLI_insertlinkbefore(&ob->modifiers, md->prev, md);
   }
+  else {
+    BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the start of the list");
+    return false;
+  }
 
-  return 1;
+  return true;
 }
 
-int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *md)
+bool ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *md)
 {
   if (md->next) {
     const ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -462,15 +466,53 @@ int ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData *
 
       if (nmti->type != eModifierTypeType_OnlyDeform) {
         BKE_report(reports, RPT_WARNING, "Cannot move beyond a non-deforming modifier");
-        return 0;
+        return false;
       }
     }
 
     BLI_remlink(&ob->modifiers, md);
     BLI_insertlinkafter(&ob->modifiers, md->next, md);
   }
+  else {
+    BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the end of the list");
+    return false;
+  }
 
-  return 1;
+  return true;
+}
+
+bool ED_object_modifier_move_to_index(ReportList *reports,
+                                      Object *ob,
+                                      ModifierData *md,
+                                      const int index)
+{
+  BLI_assert(md != NULL);
+  BLI_assert(index > 0);
+  if (index >= BLI_listbase_count(&ob->modifiers)) {
+    BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the end of the stack");
+    return false;
+  }
+
+  int md_index = BLI_findindex(&ob->modifiers, md);
+  BLI_assert(md_index != -1);
+  if (md_index < index) {
+    /* Move modifier down in list. */
+    for (; md_index < index; md_index++) {
+      if (!ED_object_modifier_move_down(reports, ob, md)) {
+        break;
+      }
+    }
+  }
+  else {
+    /* Move modifier up in list. */
+    for (; md_index > index; md_index--) {
+      if (!ED_object_modifier_move_up(reports, ob, md)) {
+        break;
+      }
+    }
+  }
+
+  return true;
 }
 
 int ED_object_modifier_convert(ReportList *UNUSED(reports),
@@ -984,6 +1026,39 @@ bool edit_modifier_poll_generic(bContext *C,
   return true;
 }
 
+bool edit_active_modifier_poll_generic(bContext *C, const bool is_editmode_allowed)
+{
+  Object *ob = CTX_data_active_object(C);
+
+  if (!ob || ID_IS_LINKED(ob)) {
+    return false;
+  }
+
+  int modifiers_len = BLI_listbase_count(&ob->modifiers);
+  ModifierData *md = BLI_findlink(&ob->modifiers, ob->active_mod_index);
+
+  if (ob->active_mod_index >= modifiers_len) {
+    return false;
+  }
+  if (md == NULL) {
+    return false;
+  }
+
+  if (ID_IS_OVERRIDE_LIBRARY(ob)) {
+    if ((md->flag & eModifierFlag_OverrideLibrary_Local) == 0) {
+      CTX_wm_operator_poll_msg_set(C, "Cannot edit modifiers coming from library override");
+      return false;
+    }
+  }
+
+  if (!is_editmode_allowed && CTX_data_edit_object(C) != NULL) {
+    CTX_wm_operator_poll_msg_set(C, "This modifier operation is not allowed from Edit mode");
+    return false;
+  }
+
+  return true;
+}
+
 bool edit_modifier_poll(bContext *C)
 {
   return edit_modifier_poll_generic(C, &RNA_Modifier, 0, true);
@@ -1110,6 +1185,11 @@ void OBJECT_OT_modifier_remove(wmOperatorType *ot)
 /** \name Remove Active Modifier Operator
  * \{ */
 
+static bool modifier_active_remove_poll(bContext *C)
+{
+  return edit_active_modifier_poll_generic(C, true);
+}
+
 static int modifier_active_remove_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
   if (edit_modifier_active_invoke_properties(C, op)) {
@@ -1128,7 +1208,7 @@ void OBJECT_OT_modifier_active_remove(wmOperatorType *ot)
 
   ot->invoke = modifier_active_remove_invoke;
   ot->exec = modifier_remove_exec;
-  ot->poll = edit_modifier_poll;
+  ot->poll = modifier_active_remove_poll;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
@@ -1233,6 +1313,11 @@ void OBJECT_OT_modifier_move_down(wmOperatorType *ot)
 /** \name Move Active Modifier Operator
  * \{ */
 
+static bool modifier_active_move_poll(bContext *C)
+{
+  return edit_active_modifier_poll_generic(C, true);
+}
+
 static int modifier_active_move_exec(bContext *C, wmOperator *op)
 {
   Object *ob = ED_object_active_context(C);
@@ -1283,7 +1368,7 @@ void OBJECT_OT_modifier_active_move(wmOperatorType *ot)
 
   ot->invoke = modifier_active_move_invoke;
   ot->exec = modifier_active_move_exec;
-  ot->poll = edit_modifier_poll;
+  ot->poll = modifier_active_move_poll;
 
   /* flags */
   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;



More information about the Bf-blender-cvs mailing list