diff --git a/scripts/startup/bl_ui/space_image.py b/scripts/startup/bl_ui/space_image.py index d7f55519315..32b201ceec9 100644 --- a/scripts/startup/bl_ui/space_image.py +++ b/scripts/startup/bl_ui/space_image.py @@ -428,6 +428,7 @@ class IMAGE_MT_uvs(Menu): layout.operator("uv.pin").clear = False layout.operator("uv.pin", text="Unpin").clear = True + layout.operator("uv.pin", text="Invert Pins").invert = True layout.separator() diff --git a/source/blender/editors/uvedit/uvedit_ops.cc b/source/blender/editors/uvedit/uvedit_ops.cc index f2c7d1933bf..e44a7251212 100644 --- a/source/blender/editors/uvedit/uvedit_ops.cc +++ b/source/blender/editors/uvedit/uvedit_ops.cc @@ -1343,6 +1343,7 @@ static int uv_pin_exec(bContext *C, wmOperator *op) BMIter iter, liter; const ToolSettings *ts = scene->toolsettings; const bool clear = RNA_boolean_get(op->ptr, "clear"); + const bool invert = RNA_boolean_get(op->ptr, "invert"); const bool synced_selection = (ts->uv_flag & UV_SYNC_SELECTION) != 0; uint objects_len = 0; @@ -1371,7 +1372,12 @@ static int uv_pin_exec(bContext *C, wmOperator *op) if (uvedit_uv_select_test(scene, l, offsets)) { changed = true; - BM_ELEM_CD_SET_BOOL(l, offsets.pin, !clear); + if (invert) { + BM_ELEM_CD_SET_BOOL(l, offsets.pin, !BM_ELEM_CD_GET_BOOL(l, offsets.pin)); + } + else { + BM_ELEM_CD_SET_BOOL(l, offsets.pin, !clear); + } } } } @@ -1402,6 +1408,11 @@ static void UV_OT_pin(wmOperatorType *ot) /* properties */ RNA_def_boolean( ot->srna, "clear", false, "Clear", "Clear pinning for the selection instead of setting it"); + RNA_def_boolean(ot->srna, + "invert", + false, + "Invert", + "Invert pinning for the selection instead of setting it"); } /** \} */