[Bf-blender-cvs] [72386c64efd] geometry-nodes: UI: Improvements to interaction with active modifier

Hans Goudey noreply at git.blender.org
Tue Nov 24 04:38:36 CET 2020


Commit: 72386c64efd8a4234e46dcef067b37f596854437
Author: Hans Goudey
Date:   Mon Nov 23 22:38:12 2020 -0500
Branches: geometry-nodes
https://developer.blender.org/rB72386c64efd8a4234e46dcef067b37f596854437

UI: Improvements to interaction with active modifier

This commit includes these improvements to operators and how they
relate to the active modifier:

 - Shortcuts performed while there is an active modifier will affect
   only that modifier.
 - Clicking anywhere on the empty space in a modifier's panel will make
   it active.
 - Clicking anywhere in the empty properties space will clear the
   active.

These changes require some refactoring of object modifier code. First
is splitting up the modifier property invoke callback, which now needs
to be able to get the active modifier separately from the hovered
modifier for the different operators. Second is a change to removing
modifiers, where there is now a separate function to remove a modifier
from an object's list, in order to handle changing the active. Finally
the panel handler neeeds a small tweak so that this "click in panel"
event can be handled afterwards.

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

M	release/scripts/presets/keyconfig/keymap_data/blender_default.py
M	source/blender/blenkernel/BKE_modifier.h
M	source/blender/blenkernel/intern/fluid.c
M	source/blender/blenkernel/intern/modifier.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/editors/interface/interface_panel.c
M	source/blender/editors/object/object_data_transfer.c
M	source/blender/editors/object/object_hook.c
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_modifier.c
M	source/blender/editors/object/object_relations.c
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_ui_common.c
M	source/blender/nodes/geometry/node_geometry_tree.cc

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

diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index d66d7c45dd4..5c7c96b05b6 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -742,6 +742,7 @@ def km_property_editor(_params):
         ("buttons.start_filter", {"type": 'F', "value": 'PRESS', "ctrl": True}, None),
         ("buttons.clear_filter", {"type": 'F', "value": 'PRESS', "alt": True}, None),
         # Modifier panels
+        ("object.modifier_set_active", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
         ("object.modifier_remove", {"type": 'X', "value": 'PRESS'}, {"properties": [("report", True)]}),
         ("object.modifier_remove", {"type": 'DEL', "value": 'PRESS'}, {"properties": [("report", True)]}),
         ("object.modifier_copy", {"type": 'D', "value": 'PRESS', "shift": True}, None),
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 2491f0953c0..b0a7d89e3d8 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -407,6 +407,7 @@ struct ModifierData *BKE_modifier_new(int type);
 
 void BKE_modifier_free_ex(struct ModifierData *md, const int flag);
 void BKE_modifier_free(struct ModifierData *md);
+void BKE_modifier_remove_from_list(struct Object *ob, struct ModifierData *md);
 
 /* Generate new UUID for the given modifier. */
 void BKE_modifier_session_uuid_generate(struct ModifierData *md);
diff --git a/source/blender/blenkernel/intern/fluid.c b/source/blender/blenkernel/intern/fluid.c
index 434456a922e..7eac4bf32e3 100644
--- a/source/blender/blenkernel/intern/fluid.c
+++ b/source/blender/blenkernel/intern/fluid.c
@@ -4559,7 +4559,7 @@ void BKE_fluid_particle_system_destroy(struct Object *ob, const int particle_typ
     if (psys->part->type == particle_type) {
       /* clear modifier */
       pfmd = psys_get_modifier(ob, psys);
-      BLI_remlink(&ob->modifiers, pfmd);
+      BKE_modifier_remove_from_list(ob, pfmd);
       BKE_modifier_free((ModifierData *)pfmd);
 
       /* clear particle system */
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 3c8b685a0e0..de820786549 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -212,6 +212,26 @@ void BKE_modifier_free(ModifierData *md)
   BKE_modifier_free_ex(md, 0);
 }
 
+/**
+ * Use instead of `BLI_remlink` when the object's active modifier should change.
+ */
+void BKE_modifier_remove_from_list(Object *ob, ModifierData *md)
+{
+  BLI_assert(BLI_findindex(&ob->modifiers, md) != -1);
+
+  if (md->flag & eModifierFlag_Active) {
+    /* Prefer the previous modifier but use the next if this modifier is the first in the list. */
+    if (md->prev != NULL) {
+      BKE_object_modifier_set_active(ob, md->prev);
+    }
+    else if (md->next != NULL) {
+      BKE_object_modifier_set_active(ob, md->next);
+    }
+  }
+
+  BLI_remlink(&ob->modifiers, md);
+}
+
 void BKE_modifier_session_uuid_generate(ModifierData *md)
 {
   md->session_uuid = BLI_session_uuid_generate();
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 0b331fb88d2..d516de535f9 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -4046,7 +4046,7 @@ void object_remove_particle_system(Main *bmain, Scene *UNUSED(scene), Object *ob
   /* Clear modifier, skip empty ones. */
   psmd = psys_get_modifier(ob, psys);
   if (psmd) {
-    BLI_remlink(&ob->modifiers, psmd);
+    BKE_modifier_remove_from_list(ob, (ModifierData *)psmd);
     BKE_modifier_free((ModifierData *)psmd);
   }
 
@@ -5401,7 +5401,7 @@ void BKE_particle_system_blend_read_lib(BlendLibReader *reader,
     else {
       /* particle modifier must be removed before particle system */
       ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
-      BLI_remlink(&ob->modifiers, psmd);
+      BKE_modifier_remove_from_list(ob, (ModifierData *)psmd);
       BKE_modifier_free((ModifierData *)psmd);
 
       BLI_remlink(particles, psys);
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index e4b6cfe5f08..15cad7c36eb 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -2450,20 +2450,13 @@ int ui_handler_panel_region(bContext *C,
       continue;
     }
 
-    /* All mouse clicks inside panels should return in break, but continue handling
-     * in case there is a sub-panel header at the mouse location. */
-    if (event->type == LEFTMOUSE &&
-        ELEM(mouse_state, PANEL_MOUSE_INSIDE_CONTENT, PANEL_MOUSE_INSIDE_HEADER)) {
-      retval = WM_UI_HANDLER_BREAK;
-    }
-
     if (mouse_state == PANEL_MOUSE_INSIDE_HEADER) {
+      /* All mouse clicks inside panel headers should return in break. */
+      retval = WM_UI_HANDLER_BREAK;
       if (ELEM(event->type, EVT_RETKEY, EVT_PADENTER, LEFTMOUSE)) {
-        retval = WM_UI_HANDLER_BREAK;
         ui_handle_panel_header(C, block, mx, event->type, event->ctrl, event->shift);
       }
       else if (event->type == RIGHTMOUSE) {
-        retval = WM_UI_HANDLER_BREAK;
         ui_popup_context_menu_for_panel(C, region, block->panel);
       }
       break;
diff --git a/source/blender/editors/object/object_data_transfer.c b/source/blender/editors/object/object_data_transfer.c
index 99989f86381..4cbb8858bf4 100644
--- a/source/blender/editors/object/object_data_transfer.c
+++ b/source/blender/editors/object/object_data_transfer.c
@@ -864,7 +864,7 @@ static int datalayout_transfer_exec(bContext *C, wmOperator *op)
 
 static int datalayout_transfer_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
-  if (edit_modifier_invoke_properties(C, op, NULL, NULL)) {
+  if (edit_modifier_invoke_properties(C, op)) {
     return datalayout_transfer_exec(C, op);
   }
   return WM_menu_invoke(C, op, event);
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 91c9916d227..d56ee17a73f 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -717,7 +717,7 @@ static int object_hook_remove_exec(bContext *C, wmOperator *op)
 
   /* remove functionality */
 
-  BLI_remlink(&ob->modifiers, (ModifierData *)hmd);
+  BKE_modifier_remove_from_list(ob, (ModifierData *)hmd);
   BKE_modifier_free((ModifierData *)hmd);
 
   DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 207057ea6a6..c5783135323 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -156,10 +156,16 @@ bool edit_modifier_poll_generic(struct bContext *C,
                                 const bool is_editmode_allowed,
                                 const bool is_liboverride_allowed);
 void edit_modifier_properties(struct wmOperatorType *ot);
-bool edit_modifier_invoke_properties(struct bContext *C,
-                                     struct wmOperator *op,
-                                     const struct wmEvent *event,
-                                     int *r_retval);
+bool edit_modifier_invoke_properties(struct bContext *C, struct wmOperator *op);
+bool edit_modifier_invoke_properties_with_hover_no_active(struct bContext *C,
+                                                          struct wmOperator *op,
+                                                          const struct wmEvent *event,
+                                                          int *r_retval);
+bool edit_modifier_invoke_properties_with_hover(struct bContext *C,
+                                                struct wmOperator *op,
+                                                const struct wmEvent *event,
+                                                int *r_retval);
+
 struct ModifierData *edit_modifier_property_get(struct wmOperator *op,
                                                 struct Object *ob,
                                                 int type);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index b05f3454391..1a499075d5d 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -36,6 +36,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_object_force_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_space_types.h"
 
 #include "BLI_bitmap.h"
 #include "BLI_listbase.h"
@@ -386,7 +387,7 @@ static bool object_modifier_remove(
     ob->mode &= ~OB_MODE_PARTICLE_EDIT;
   }
 
-  BLI_remlink(&ob->modifiers, md);
+  BKE_modifier_remove_from_list(ob, md);
   BKE_modifier_free(md);
   BKE_object_free_derived_caches(ob);
 
@@ -446,8 +447,7 @@ bool ED_object_modifier_move_up(ReportList *reports, Object *ob, ModifierData *m
       }
     }
 
-    BLI_remlink(&ob->modifiers, md);
-    BLI_insertlinkbefore(&ob->modifiers, md->prev, md);
+    BLI_listbase_swaplinks(&ob->modifiers, md, md->prev);
   }
   else {
     BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the start of the list");
@@ -471,8 +471,7 @@ bool ED_object_modifier_move_down(ReportList *reports, Object *ob, ModifierData
       }
     }
 
-    BLI_remlink(&ob->modifiers, md);
-    BLI_insertlinkafter(&ob->modifiers, md->next, md);
+    BLI_listbase_swaplinks(&ob->modifiers, md, md->next);
   }
   else {
     BKE_report(reports, RPT_WARNING, "Cannot move modifier beyond the end of the list");
@@ -898,7 +897,7 @@ bool ED_object_modifier_apply(Main *bmain,
   md_eval->mode = prev_mode;
 
   if (!keep_modifier) {
-    BLI_remlink(&ob->modifiers, md);
+    BKE_modifier_remove_from_list(ob, md);
     BKE_modifier_free(md);
   }
 
@@ -916,6 +915,7 @@ int ED_object_modifier_copy(
     nmd = object_copy_particle_system(bmain, scene, ob, ((ParticleSystemModifierData *)md)->psys);
     BL

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list