New icons for Blender 2.8x

@billrey - updated.
@a.monti - I kept the order of arranging the icons in the set from your original proposal, so the code should be easy to reuse. The only difference is the Transform Cache and Armature Constraint icons which are in N25 and N26 cells.

Next big thing is to change the way icons are stored, since the sheet got extremely crowded and unorganized.

1 Like

I was just writing about this, I thought it would be good to arrange them in the same order as in the add panel like this:
002333

It looks a bit different from the file You’ve sent me before. Will rearrange them then.

Thanks. Yes, I rearranged them in the last days, I thought it would have been a matter of months before commit :slight_smile:

Should be ok now, although I made it in a hurry, so double check it please.

3 Likes

Seems like I can’t load a diff file here in Devtalk, should I create a differential in d.b.o even if not everything is currently working?

Otherwise I can do this maybe (hopefully the alignment won’t get screwed up):

Summary
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index 048f30bdf26..f9e9e342ee5 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -493,33 +493,33 @@ DEF_ICON(HOLDOUT_ON)
 DEF_ICON(INDIRECT_ONLY_OFF)
 DEF_ICON(INDIRECT_ONLY_ON)
 
-/* EMPTY */
-DEF_ICON_BLANK(501)
-DEF_ICON_BLANK(502)
-DEF_ICON_BLANK(503)
-DEF_ICON_BLANK(504)
-DEF_ICON_BLANK(505)
-DEF_ICON_BLANK(506)
-DEF_ICON_BLANK(507)
-DEF_ICON_BLANK(508)
-DEF_ICON_BLANK(509)
-DEF_ICON_BLANK(510)
-DEF_ICON_BLANK(511)
-DEF_ICON_BLANK(512)
-DEF_ICON_BLANK(513)
-DEF_ICON_BLANK(514)
-DEF_ICON_BLANK(515)
-DEF_ICON_BLANK(516)
-DEF_ICON_BLANK(517)
-DEF_ICON_BLANK(518)
-DEF_ICON_BLANK(519)
-DEF_ICON_BLANK(520)
-DEF_ICON_BLANK(521)
-DEF_ICON_BLANK(522)
-DEF_ICON_BLANK(523)
-DEF_ICON_BLANK(524)
-DEF_ICON_BLANK(525)
-DEF_ICON_BLANK(526)
+/* CONSTRAINTS */
+DEF_ICON_MODIFIER(CON_CAMERASOLVER)
+DEF_ICON_MODIFIER(CON_FOLLOWTRACK)
+DEF_ICON_MODIFIER(CON_OBJECTSOLVER)
+DEF_ICON_MODIFIER(CON_LOCLIKE)
+DEF_ICON_MODIFIER(CON_ROTLIKE)
+DEF_ICON_MODIFIER(CON_SIZELIKE)
+DEF_ICON_MODIFIER(CON_TRANSLIKE)
+DEF_ICON_MODIFIER(CON_DISTLIMIT)
+DEF_ICON_MODIFIER(CON_LOCLIMIT)
+DEF_ICON_MODIFIER(CON_ROTLIMIT)
+DEF_ICON_MODIFIER(CON_SIZELIMIT)
+DEF_ICON_MODIFIER(CON_SAMEVOL)
+DEF_ICON_MODIFIER(CON_TRANSFORM)
+DEF_ICON_MODIFIER(CON_TRANSFORM_CACHE)
+DEF_ICON_MODIFIER(CON_CLAMPTO)
+DEF_ICON_MODIFIER(CON_KINEMATIC)
+DEF_ICON_MODIFIER(CON_LOCKTRACK)
+DEF_ICON_MODIFIER(CON_SPLINEIK)
+DEF_ICON_MODIFIER(CON_STRETCHTO)
+DEF_ICON_MODIFIER(CON_TRACKTO)
+DEF_ICON_MODIFIER(CON_ARMATURE)
+DEF_ICON_MODIFIER(CON_CHILDOF)
+DEF_ICON_MODIFIER(CON_FLOOR)
+DEF_ICON_MODIFIER(CON_FOLLOWPATH)
+DEF_ICON_MODIFIER(CON_PIVOT)
+DEF_ICON_MODIFIER(CON_SHRINKWRAP)
 
 /* MODIFIERS */
 DEF_ICON_MODIFIER(MODIFIER_DATA)
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 33602818fd4..b1d404e8ab4 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -2441,24 +2441,12 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
 
   /* open/close */
   UI_block_emboss_set(block, UI_EMBOSS_NONE);
-  uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+  uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NONE);
+
+  /* constraint-type icon */
+  uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
   UI_block_emboss_set(block, UI_EMBOSS);
 
-  /* name */
-  uiDefBut(block,
-           UI_BTYPE_LABEL,
-           0,
-           typestr,
-           xco + 0.5f * UI_UNIT_X,
-           yco,
-           5 * UI_UNIT_X,
-           0.9f * UI_UNIT_Y,
-           NULL,
-           0.0,
-           0.0,
-           0.0,
-           0.0,
-           "");
 
   if (con->flag & CONSTRAINT_DISABLE) {
     uiLayoutSetRedAlert(row, true);
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index d994152ba67..8c02c828313 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -31,6 +31,7 @@
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
+#include "DNA_constraint_types.h"
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
@@ -1856,6 +1857,129 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
       case TSE_LINKED_PSYS:
         data.icon = ICON_PARTICLES;
         break;
+      case TSE_CONSTRAINT: {
+        Object *ob = (Object *)tselem->id;
+
+        /*
+        * I wasn't able to get the correct pose channel per bone
+        * so for now, to avoid Blender to crash, every time an armature goes in pose mode
+        * the icon will be a dot as before.
+        * There is also a problem with the update of the outliner, if the order
+        * of the constraints change.
+        */
+        
+        if (ob->mode & OB_MODE_POSE) { /*placeholder filter for testing*/          
+          /*
+          bPoseChannel *pchan = BLI_findlink(&ob->pose->chanbase, 0);
+          
+          bConstraint *con = BLI_findlink(&pchan->constraints, tselem->nr-1000);
+          
+          switch ((eBConstraint_Types)con->type) {
+            case CONSTRAINT_TYPE_SIZELIKE:
+              data.icon = ICON_CON_SIZELIKE;
+              break;
+            default:
+              data.icon = ICON_DOT;
+              break;  
+          }*/
+          data.icon = ICON_DOT;
+        }
+        else {
+          bConstraint *con = BLI_findlink(&ob->constraints, tselem->nr);
+          
+          switch ((eBConstraint_Types)con->type) {
+          case CONSTRAINT_TYPE_CAMERASOLVER:
+            data.icon = ICON_CON_CAMERASOLVER;
+            break;
+          case CONSTRAINT_TYPE_FOLLOWTRACK:
+            data.icon = ICON_CON_FOLLOWTRACK;
+            break;
+          case CONSTRAINT_TYPE_OBJECTSOLVER:
+            data.icon = ICON_CON_OBJECTSOLVER;
+            break;
+          case CONSTRAINT_TYPE_LOCLIKE:
+            data.icon = ICON_CON_LOCLIKE;
+            break;
+          case CONSTRAINT_TYPE_ROTLIKE:
+            data.icon = ICON_CON_ROTLIKE;
+            break;
+          case CONSTRAINT_TYPE_SIZELIKE:
+            data.icon = ICON_CON_SIZELIKE;
+            break;
+          case CONSTRAINT_TYPE_TRANSLIKE:
+            data.icon = ICON_CON_TRANSLIKE;
+            break;
+          case CONSTRAINT_TYPE_DISTLIMIT:
+            data.icon = ICON_CON_DISTLIMIT;
+            break;
+          case CONSTRAINT_TYPE_LOCLIMIT:
+            data.icon = ICON_CON_LOCLIMIT;
+            break;
+          case CONSTRAINT_TYPE_ROTLIMIT:
+            data.icon = ICON_CON_ROTLIMIT;
+            break;
+          case CONSTRAINT_TYPE_SIZELIMIT:
+            data.icon = ICON_CON_SIZELIMIT;
+            break;
+          case CONSTRAINT_TYPE_SAMEVOL:
+            data.icon = ICON_CON_SAMEVOL;
+            break;
+          case CONSTRAINT_TYPE_TRANSFORM:
+            data.icon = ICON_CON_TRANSFORM;
+            break;
+          case CONSTRAINT_TYPE_TRANSFORM_CACHE:
+            data.icon = ICON_MOD_MESHDEFORM;
+            break;
+          case CONSTRAINT_TYPE_CLAMPTO:
+            data.icon = ICON_CON_CLAMPTO;
+            break;
+          case CONSTRAINT_TYPE_DAMPTRACK:
+            data.icon = ICON_CON_TRACKTO;
+            break;
+          case CONSTRAINT_TYPE_KINEMATIC:
+            data.icon = ICON_CON_KINEMATIC;
+            break;
+          case CONSTRAINT_TYPE_LOCKTRACK:
+            data.icon = ICON_CON_LOCKTRACK;
+            break;
+          case CONSTRAINT_TYPE_SPLINEIK:
+            data.icon = ICON_CON_SPLINEIK;
+            break;
+          case CONSTRAINT_TYPE_STRETCHTO:
+            data.icon = ICON_CON_STRETCHTO;
+            break;
+          case CONSTRAINT_TYPE_TRACKTO:
+            data.icon = ICON_CON_TRACKTO;
+            break;
+          case CONSTRAINT_TYPE_ACTION:
+            data.icon = ICON_ACTION;
+            break;
+          case CONSTRAINT_TYPE_ARMATURE:
+            data.icon = ICON_MOD_ARMATURE;
+            break;
+          case CONSTRAINT_TYPE_CHILDOF:
+            data.icon = ICON_CON_CHILDOF;
+            break;
+          case CONSTRAINT_TYPE_MINMAX:
+            data.icon = ICON_CON_FLOOR;
+            break;
+          case CONSTRAINT_TYPE_FOLLOWPATH:
+            data.icon = ICON_CON_FOLLOWPATH;
+            break;
+          case CONSTRAINT_TYPE_PIVOT:
+            data.icon = ICON_CON_PIVOT;
+            break;
+          case CONSTRAINT_TYPE_SHRINKWRAP:
+            data.icon = ICON_CON_SHRINKWRAP;
+            break;
+          
+          case NUM_CONSTRAINT_TYPES:
+            data.icon = ICON_DOT;
+            break;
+          }
+        }
+      } 
+        break;
       case TSE_MODIFIER: {
         Object *ob = (Object *)tselem->id;
         if (ob->type != OB_GPENCIL) {
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index ac319a545ac..7b174867dc8 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -44,133 +44,133 @@
 /* please keep the names in sync with constraint.c */
 const EnumPropertyItem rna_enum_constraint_type_items[] = {
     {0, "", 0, N_("Motion Tracking"), ""},
-    {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CONSTRAINT, "Camera Solver", ""},
-    {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CONSTRAINT, "Follow Track", ""},
-    {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CONSTRAINT, "Object Solver", ""},
+    {CONSTRAINT_TYPE_CAMERASOLVER, "CAMERA_SOLVER", ICON_CON_CAMERASOLVER, "Camera Solver", ""},
+    {CONSTRAINT_TYPE_FOLLOWTRACK, "FOLLOW_TRACK", ICON_CON_FOLLOWTRACK, "Follow Track", ""},
+    {CONSTRAINT_TYPE_OBJECTSOLVER, "OBJECT_SOLVER", ICON_CON_OBJECTSOLVER, "Object Solver", ""},
     {0, "", 0, N_("Transform"), ""},
     {CONSTRAINT_TYPE_LOCLIKE,
      "COPY_LOCATION",
-     ICON_CONSTRAINT,
+     ICON_CON_LOCLIKE,
      "Copy Location",
      "Copy the location of a target (with an optional offset), so that they move together"},
     {CONSTRAINT_TYPE_ROTLIKE,
      "COPY_ROTATION",
-     ICON_CONSTRAINT,
+     ICON_CON_ROTLIKE,
      "Copy Rotation",
      "Copy the rotation of a target (with an optional offset), so that they rotate together"},
     {CONSTRAINT_TYPE_SIZELIKE,
      "COPY_SCALE",
-     ICON_CONSTRAINT,
+     ICON_CON_SIZELIKE,
      "Copy Scale",
      "Copy the scale factors of a target (with an optional offset), so that they are scaled by "
      "the same amount"},
     {CONSTRAINT_TYPE_TRANSLIKE,
      "COPY_TRANSFORMS",
-     ICON_CONSTRAINT,
+     ICON_CON_TRANSLIKE,
      "Copy Transforms",
      "Copy all the transformations of a target, so that they move together"},
     {CONSTRAINT_TYPE_DISTLIMIT,
      "LIMIT_DISTANCE",
-     ICON_CONSTRAINT,
+     ICON_CON_DISTLIMIT,
      "Limit Distance",
      "Restrict movements to within a certain distance of a target (at the time of constraint "
      "evaluation only)"},
     {CONSTRAINT_TYPE_LOCLIMIT,
      "LIMIT_LOCATION",
-     ICON_CONSTRAINT,
+     ICON_CON_LOCLIMIT,
      "Limit Location",
      "Restrict movement along each axis within given ranges"},
     {CONSTRAINT_TYPE_ROTLIMIT,
      "LIMIT_ROTATION",
-     ICON_CONSTRAINT,
+     ICON_CON_ROTLIMIT,
      "Limit Rotation",
      "Restrict rotation along each axis within given ranges"},
     {CONSTRAINT_TYPE_SIZELIMIT,
      "LIMIT_SCALE",
-     ICON_CONSTRAINT,
+     ICON_CON_SIZELIMIT,
      "Limit Scale",
      "Restrict scaling along each axis with given ranges"},
     {CONSTRAINT_TYPE_SAMEVOL,
      "MAINTAIN_VOLUME",
-     ICON_CONSTRAINT,
+     ICON_CON_SAMEVOL,
      "Maintain Volume",
      "Compensate for scaling one axis by applying suitable scaling to the other two axes"},
     {CONSTRAINT_TYPE_TRANSFORM,
      "TRANSFORM",
-     ICON_CONSTRAINT,
+     ICON_CON_TRANSFORM,
      "Transformation",
      "Use one transform property from target to control another (or same) property on owner"},
     {CONSTRAINT_TYPE_TRANSFORM_CACHE,
      "TRANSFORM_CACHE",
-     ICON_CONSTRAINT,
+     ICON_CON_TRANSFORM_CACHE,
      "Transform Cache",
      "Look up the transformation matrix from an external file"},
     {0, "", 0, N_("Tracking"), ""},
     {CONSTRAINT_TYPE_CLAMPTO,
      "CLAMP_TO",
-     ICON_CONSTRAINT,
+     ICON_CON_CLAMPTO,
      "Clamp To",
      "Restrict movements to lie along a curve by remapping location along curve's longest axis"},
     {CONSTRAINT_TYPE_DAMPTRACK,
      "DAMPED_TRACK",
-     ICON_CONSTRAINT,
+     ICON_CON_TRACKTO,
      "Damped Track",
      "Point towards a target by performing the smallest rotation necessary"},
     {CONSTRAINT_TYPE_KINEMATIC,
      "IK",
-     ICON_CONSTRAINT,
+     ICON_CON_KINEMATIC,
      "Inverse Kinematics",
      "Control a chain of bones by specifying the endpoint target (Bones only)"},
     {CONSTRAINT_TYPE_LOCKTRACK,
      "LOCKED_TRACK",
-     ICON_CONSTRAINT,
+     ICON_CON_LOCKTRACK,
      "Locked Track",
      "Rotate around the specified ('locked') axis to point towards a target"},
     {CONSTRAINT_TYPE_SPLINEIK,
      "SPLINE_IK",
-     ICON_CONSTRAINT,
+     ICON_CON_SPLINEIK,
      "Spline IK",
      "Align chain of bones along a curve (Bones only)"},
     {CONSTRAINT_TYPE_STRETCHTO,
      "STRETCH_TO",
-     ICON_CONSTRAINT,
+     ICON_CON_STRETCHTO,
      "Stretch To",
      "Stretch along Y-Axis to point towards a target"},
     {CONSTRAINT_TYPE_TRACKTO,
      "TRACK_TO",
-     ICON_CONSTRAINT,
+     ICON_CON_TRACKTO,
      "Track To",
      "Legacy tracking constraint prone to twisting artifacts"},
     {0, "", 0, N_("Relationship"), ""},
     {CONSTRAINT_TYPE_ACTION,
      "ACTION",
-     ICON_CONSTRAINT,
+     ICON_ACTION,
      "Action",
      "Use transform property of target to look up pose for owner from an Action"},
     {CONSTRAINT_TYPE_ARMATURE,
      "ARMATURE",
-     ICON_CONSTRAINT,
+     ICON_CON_ARMATURE,
      "Armature",
      "Apply weight-blended transformation from multiple bones like the Armature modifier"},
     {CONSTRAINT_TYPE_CHILDOF,
      "CHILD_OF",
-     ICON_CONSTRAINT,
+     ICON_CON_CHILDOF,
      "Child Of",
      "Make target the 'detachable' parent of owner"},
     {CONSTRAINT_TYPE_MINMAX,
      "FLOOR",
-     ICON_CONSTRAINT,
+     ICON_CON_FLOOR,
      "Floor",
      "Use position (and optionally rotation) of target to define a 'wall' or 'floor' that the "
      "owner can not cross"},
     {CONSTRAINT_TYPE_FOLLOWPATH,
      "FOLLOW_PATH",
-     ICON_CONSTRAINT,
+     ICON_CON_FOLLOWPATH,
      "Follow Path",
      "Use to animate an object/bone following a path"},
     {CONSTRAINT_TYPE_PIVOT,
      "PIVOT",
-     ICON_CONSTRAINT,
+     ICON_CON_PIVOT,
      "Pivot",
      "Change pivot point for transforms (buggy)"},
 #if 0
@@ -187,7 +187,7 @@ const EnumPropertyItem rna_enum_constraint_type_items[] = {
 #endif
     {CONSTRAINT_TYPE_SHRINKWRAP,
      "SHRINKWRAP",
-     ICON_CONSTRAINT,
+     ICON_CON_SHRINKWRAP,
      "Shrinkwrap",
      "Restrict movements to surface of target mesh"},
     {0, NULL, 0, NULL, NULL},
@@ -865,6 +865,7 @@ static void rna_def_constraint_childof(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Child Of Constraint", "Create constraint-based parent-child relationship");
   RNA_def_struct_sdna_from(srna, "bChildOfConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_CHILDOF);
 
   rna_def_constraint_target_common(srna);
 
@@ -967,6 +968,7 @@ static void rna_def_constraint_armature_deform_targets(BlenderRNA *brna, Propert
   RNA_def_struct_sdna(srna, "bConstraint");
   RNA_def_struct_ui_text(
       srna, "Armature Deform Constraint Targets", "Collection of target bones and weights");
+  RNA_def_struct_ui_icon(srna, ICON_CON_ARMATURE);
 
   func = RNA_def_function(srna, "new", "rna_ArmatureConstraint_target_new");
   RNA_def_function_flag(func, FUNC_USE_SELF_ID | FUNC_USE_MAIN);
@@ -995,6 +997,7 @@ static void rna_def_constraint_armature_deform(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Armature Constraint", "Applies transformations done by the Armature modifier");
   RNA_def_struct_sdna_from(srna, "bArmatureConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_MOD_ARMATURE);
 
   prop = RNA_def_property(srna, "targets", PROP_COLLECTION, PROP_NONE);
   RNA_def_property_collection_sdna(prop, NULL, "targets", NULL);
@@ -1047,6 +1050,7 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "KinematicConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Kinematic Constraint", "Inverse Kinematics");
   RNA_def_struct_sdna_from(srna, "bKinematicConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_KINEMATIC);
 
   rna_def_constraint_target_common(srna);
 
@@ -1193,6 +1197,8 @@ static void rna_def_constraint_track_to(BlenderRNA *brna)
 
   rna_def_constraint_target_common(srna);
 
+  RNA_def_struct_ui_icon(srna, ICON_CON_TRACKTO);
+
   prop = RNA_def_property(srna, "track_axis", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "reserved1");
   RNA_def_property_enum_items(prop, track_axis_items);
@@ -1219,6 +1225,7 @@ static void rna_def_constraint_locate_like(BlenderRNA *brna)
 
   srna = RNA_def_struct(brna, "CopyLocationConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Copy Location Constraint", "Copy the location of the target");
+  RNA_def_struct_ui_icon(srna, ICON_CON_LOCLIKE);
 
   rna_def_constraint_headtail_common(srna);
 
@@ -1270,6 +1277,7 @@ static void rna_def_constraint_rotate_like(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "CopyRotationConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Copy Rotation Constraint", "Copy the rotation of the target");
   RNA_def_struct_sdna_from(srna, "bRotateLikeConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_ROTLIKE);
 
   rna_def_constraint_target_common(srna);
 
@@ -1317,6 +1325,7 @@ static void rna_def_constraint_size_like(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "CopyScaleConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Copy Scale Constraint", "Copy the scale of the target");
   RNA_def_struct_sdna_from(srna, "bSizeLikeConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_SIZELIKE);
 
   rna_def_constraint_target_common(srna);
 
@@ -1394,6 +1403,7 @@ static void rna_def_constraint_same_volume(BlenderRNA *brna)
                          "Maintain Volume Constraint",
                          "Maintain a constant volume along a single scaling axis");
   RNA_def_struct_sdna_from(srna, "bSameVolumeConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_SAMEVOL);
 
   prop = RNA_def_property(srna, "free_axis", PROP_ENUM, PROP_NONE);
   RNA_def_property_enum_sdna(prop, NULL, "free_axis");
@@ -1426,6 +1436,8 @@ static void rna_def_constraint_transform_like(BlenderRNA *brna)
 
   RNA_def_struct_sdna_from(srna, "bTransLikeConstraint", "data");
 
+  RNA_def_struct_ui_icon(srna, ICON_CON_TRANSLIKE);
+
   rna_def_constraint_target_common(srna);
 }
 
@@ -1448,6 +1460,7 @@ static void rna_def_constraint_minmax(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Floor Constraint", "Use the target object for location limitation");
   RNA_def_struct_sdna_from(srna, "bMinMaxConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_FLOOR);
 
   rna_def_constraint_target_common(srna);
 
@@ -1496,6 +1509,7 @@ static void rna_def_constraint_action(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Action Constraint", "Map an action to the transform axes of a bone");
   RNA_def_struct_sdna_from(srna, "bActionConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_ACTION);
 
   rna_def_constraint_target_common(srna);
 
@@ -1568,6 +1582,7 @@ static void rna_def_constraint_locked_track(BlenderRNA *brna)
       srna,
       "Locked Track Constraint",
       "Point toward the target along the track axis, while locking the other axis");
+  RNA_def_struct_ui_icon(srna, ICON_CON_LOCKTRACK);
 
   rna_def_constraint_headtail_common(srna);
 
@@ -1613,7 +1628,8 @@ static void rna_def_constraint_follow_path(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "FollowPathConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Follow Path Constraint", "Lock motion to the target path");
   RNA_def_struct_sdna_from(srna, "bFollowPathConstraint", "data");
-
+  RNA_def_struct_ui_icon(srna, ICON_CON_FOLLOWPATH);
+  
   prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "tar");
   RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_Curve_object_poll");
@@ -1689,6 +1705,7 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna)
 
   srna = RNA_def_struct(brna, "StretchToConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Stretch To Constraint", "Stretch to meet the target object");
+  RNA_def_struct_ui_icon(srna, ICON_CON_STRETCHTO);
 
   rna_def_constraint_headtail_common(srna);
 
@@ -1770,6 +1787,7 @@ static void rna_def_constraint_clamp_to(BlenderRNA *brna)
       "Clamp To Constraint",
       "Constrain an object's location to the nearest point along the target path");
   RNA_def_struct_sdna_from(srna, "bClampToConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_CLAMPTO);
 
   prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "tar");
@@ -1808,6 +1826,7 @@ static void rna_def_constraint_transform(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Transformation Constraint", "Map transformations of the target to the object");
   RNA_def_struct_sdna_from(srna, "bTransformConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_TRANSFORM);
 
   rna_def_constraint_target_common(srna);
 
@@ -2079,6 +2098,7 @@ static void rna_def_constraint_location_limit(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Limit Location Constraint", "Limit the location of the constrained object");
   RNA_def_struct_sdna_from(srna, "bLocLimitConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_LOCLIMIT);
 
   prop = RNA_def_property(srna, "use_min_x", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMIN);
@@ -2162,6 +2182,7 @@ static void rna_def_constraint_rotation_limit(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Limit Rotation Constraint", "Limit the rotation of the constrained object");
   RNA_def_struct_sdna_from(srna, "bRotLimitConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_ROTLIMIT);
 
   prop = RNA_def_property(srna, "use_limit_x", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XROT);
@@ -2230,6 +2251,7 @@ static void rna_def_constraint_size_limit(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Limit Size Constraint", "Limit the scaling of the constrained object");
   RNA_def_struct_sdna_from(srna, "bSizeLimitConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_SIZELIMIT);
 
   prop = RNA_def_property(srna, "use_min_x", PROP_BOOLEAN, PROP_NONE);
   RNA_def_property_boolean_sdna(prop, NULL, "flag", LIMIT_XMIN);
@@ -2316,7 +2338,8 @@ static void rna_def_constraint_distance_limit(BlenderRNA *brna)
   rna_def_constraint_headtail_common(srna);
 
   RNA_def_struct_sdna_from(srna, "bDistLimitConstraint", "data");
-
+  RNA_def_struct_ui_icon(srna, ICON_CON_DISTLIMIT);
+  
   rna_def_constraint_target_common(srna);
 
   prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
@@ -2388,6 +2411,7 @@ static void rna_def_constraint_shrinkwrap(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Shrinkwrap Constraint", "Create constraint-based shrinkwrap relationship");
   RNA_def_struct_sdna_from(srna, "bShrinkwrapConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_SHRINKWRAP);
 
   prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "target"); /* TODO, mesh type */
@@ -2484,6 +2508,7 @@ static void rna_def_constraint_damped_track(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "DampedTrackConstraint", "Constraint");
   RNA_def_struct_ui_text(
       srna, "Damped Track Constraint", "Point toward target by taking the shortest rotation path");
+  RNA_def_struct_ui_icon(srna, ICON_CON_TRACKTO);
 
   rna_def_constraint_headtail_common(srna);
 
@@ -2541,6 +2566,7 @@ static void rna_def_constraint_spline_ik(BlenderRNA *brna)
   srna = RNA_def_struct(brna, "SplineIKConstraint", "Constraint");
   RNA_def_struct_ui_text(srna, "Spline IK Constraint", "Align 'n' bones along a curve");
   RNA_def_struct_sdna_from(srna, "bSplineIKConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_SPLINEIK);
 
   /* target chain */
   prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
@@ -2709,6 +2735,8 @@ static void rna_def_constraint_pivot(BlenderRNA *brna)
 
   RNA_def_struct_sdna_from(srna, "bPivotConstraint", "data");
 
+  RNA_def_struct_ui_icon(srna, ICON_CON_PIVOT);
+
   /* target-defined pivot */
   prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "tar");
@@ -2765,6 +2793,7 @@ static void rna_def_constraint_follow_track(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Follow Track Constraint", "Lock motion to the target motion track");
   RNA_def_struct_sdna_from(srna, "bFollowTrackConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_FOLLOWTRACK);
 
   /* movie clip */
   prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
@@ -2852,6 +2881,7 @@ static void rna_def_constraint_camera_solver(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Camera Solver Constraint", "Lock motion to the reconstructed camera movement");
   RNA_def_struct_sdna_from(srna, "bCameraSolverConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_CAMERASOLVER);
 
   /* movie clip */
   prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
@@ -2877,6 +2907,7 @@ static void rna_def_constraint_object_solver(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Object Solver Constraint", "Lock motion to the reconstructed object movement");
   RNA_def_struct_sdna_from(srna, "bObjectSolverConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_OBJECTSOLVER);
 
   /* movie clip */
   prop = RNA_def_property(srna, "clip", PROP_POINTER, PROP_NONE);
@@ -2922,6 +2953,7 @@ static void rna_def_constraint_transform_cache(BlenderRNA *brna)
   RNA_def_struct_ui_text(
       srna, "Transform Cache Constraint", "Look up transformation from an external file");
   RNA_def_struct_sdna_from(srna, "bTransformCacheConstraint", "data");
+  RNA_def_struct_ui_icon(srna, ICON_CON_TRANSFORM_CACHE);
 
   prop = RNA_def_property(srna, "cache_file", PROP_POINTER, PROP_NONE);
   RNA_def_property_pointer_sdna(prop, NULL, "cache_file");
1 Like

These look great now! But I really think @a.monti’s alternative for scale is way clearer:

2 Likes

This version of Previous / Next icons were clear and nice to me from the first moment.
58
It’s a shame, I can’t see nothing more than “fishes” in current version …

I’m not sure if it solves fishy issue completely, but what about this?
29

4 Likes

I like that design a lot!

I’ve been using 2.8 almost exclusively for the past few weeks now, and most of the icons have grown on me. The only ones I still have trouble with on a regular basis are the particles and physics tab icons in the properties editor. It takes me at least half a second to work out which is which - I find myself inching the mouse towards them or dancing it back and forth over them in a sort of holding pattern while my brain catches up. Clearly there’s some room for improvement in terms of readability.

Others have had a crack at these icons before, so I thought I’d give it a try; the particles icon in particular (I’m also strongly in favour of a bouncing ball for physics).

From left to right: the current icon, a slight edit, and a new icon (with flipped variant).
Each style shown both without and with tab highlighted.

bparticleicon0bparticleicon0flip

The edit slightly shortens the lines between circles, so they read as distinct particles with trails emanating from an origin, and less like a sort of network or graph.

The new icon is meant to look like particles emitting from a plane. A potential con is that they look a little like trees, but maybe it could be flipped upside-down to get around that (post edit: added).

This icon is a lot “boxier” than the surrounding icons, so on that alone it should be easier to distinguish it from the physics icon at a glance (eg. even if you do see trees, you at least don’t see physics).

thanks for your consideration :slightly_smiling_face:

12 Likes

stylistically is nicer but the concept isnt too much improvement from the previous

I am also struggling with the physics and particles tab on a regular basis, very often going to the wrong one. The current particles tab looks way more like it means “physics” to me. I really like your design! But it should definitely be rotated upside down because particles more commonly fall than float, and it would make it look less like trees as you pointed out. I also agree that a bouncing ball would be far better for physics, since that planet orbit doesn’t represent the same type of small-scale, everyday kinematics used in Blender compared to the planetary dynamics that the icon implies, which isn’t a feature.

1 Like

Or even more radical … since buttons are symetric left / right and icons well known … is it readable?
Or is it too big twist for you?
03

2 Likes

I like that slight edit you did!

1 Like

Too minimalist in my opinion. If I look at the icons there is a feeling of uncertainty for a brief moment, which is a bad sign. One can figure out what the buttons do quickly, but there is this tiny mental barrier which might never vanish.

Furthermore, the symbols for jumping to the start or end are well known and understood. “Jump to keyframe” is not something you see a lot, so we could deviate here. An indication of the direction of the action is still a good thing to add however.

I’m still in favor of separating the keyframe buttons, because they are not related to playback control. Maybe there is even another design solution with the buttons in their own group?

I think if they are pointing downwards they will be much better understood, and in general that new icon is far better than the one we have right now IMHO :slight_smile:

about the constraints icons. Im content with the genral look except the Limit ones. I think they can be far more refined stylistically not that they dont do their purpose already.

Thanks for your opinion.
Just a note to your last paragraph.

Buttons related to playback are only the middle two “left / right” play buttons.
Buttons to jump at “start / end” as well “previous / next” keyframe are both position (place) on timeline.
So … I don’t see a reason to separate them from current group.

1 Like

@billrey @jendrzych How would you feel about a re-organization of the icon sheet before 2.80?

I think we could gain some space and making it slightly more future proof just re-arranging some stuff around, while also making it a bit more consistent.
There are also some icons that are never used and others that are exact duplicates for, in my opinion, no reason.

So: blue -> duplicates | yellow -> defined but not used | red -> not defined

  1. This icon is defined as RENDER_RESULT but never actually used in that context, only as a substitute of the RENDERLAYERS one.

  2. These icons are exact copies (apart from metaball) of the one used in the outliner for ob_data.
    Since I think we want the outliner to be consistent with the properties editor, I don’t personally see the reason to keep those (the bottom light icon is also defined as a shading one, like the red ones in the properties editor, strange).

  3. This one, RIGHTARROW_THIN, was different from RIGHTARROW in 2.7 but is identical now, in blender’s core it’s only used once in interface.c:


    Legacy stuff I guess, not sure if changing it could cause problems…

  4. Is this one supposed to be for movie_clip in the outliner? Right now it’s using the clip editor icon.

Within the ones marked in yellow, only the car one is used in a couple of addons, the other ones are never used in blender’s core nor in addons.
About the ones marked in red I don’t know what they should be used for.

As for the re-organization, this is what I would personally do:

1 Like

Depeche mode - once I’ve got short chat with @billrey 'bout icons reorganisation and the conclusion was that the best option is to switch to individual files with proper naming. The sheet is messy and hard to manage and soon it deffinitely will get more and more messy despite all the clean/reorganisation efforts.
Besides, I imagine, that changing and maintaining proper in-the-sheet icons coordinates in the code, can be challenging. Calling file’s name should be way simpler.