Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Eisel <julian@blender.org>2022-03-03 15:18:23 +0300
committerJulian Eisel <julian@blender.org>2022-03-03 15:18:23 +0300
commit76879e37024504d6f14609730be9ac17b5a02293 (patch)
treedeaa5af2812e65f94e3fa257a93779546c67683a /source/blender/editors/space_outliner/outliner_draw.cc
parent9b12889a1a4e6edb595c988168e5c1dff4bf00d9 (diff)
Outliner: Display respective data-block icon in library overrides mode
Just showing the library override icon for every item doesn't add much information, it's just redundant. Displaying the data-block type icon on the other hand can be useful. Differential Revision: https://developer.blender.org/D14208
Diffstat (limited to 'source/blender/editors/space_outliner/outliner_draw.cc')
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.cc420
1 files changed, 186 insertions, 234 deletions
diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc
index 423f11e0641..77e603f9427 100644
--- a/source/blender/editors/space_outliner/outliner_draw.cc
+++ b/source/blender/editors/space_outliner/outliner_draw.cc
@@ -66,6 +66,7 @@
#include "outliner_intern.hh"
#include "tree/tree_display.hh"
#include "tree/tree_element.hh"
+#include "tree/tree_element_overrides.hh"
#include "tree/tree_element_rna.hh"
using namespace blender::ed::outliner;
@@ -2222,6 +2223,185 @@ static void outliner_draw_warning_column(const bContext *C,
/* ****************************************************** */
/* Normal Drawing... */
+static BIFIconID tree_element_get_icon_from_id(const ID *id)
+{
+ if (GS(id->name) == ID_OB) {
+ const Object *ob = (Object *)id;
+ switch (ob->type) {
+ case OB_LAMP:
+ return ICON_OUTLINER_OB_LIGHT;
+ case OB_MESH:
+ return ICON_OUTLINER_OB_MESH;
+ case OB_CAMERA:
+ return ICON_OUTLINER_OB_CAMERA;
+ case OB_CURVES_LEGACY:
+ return ICON_OUTLINER_OB_CURVE;
+ case OB_MBALL:
+ return ICON_OUTLINER_OB_META;
+ case OB_LATTICE:
+ return ICON_OUTLINER_OB_LATTICE;
+ case OB_ARMATURE:
+ return ICON_OUTLINER_OB_ARMATURE;
+ case OB_FONT:
+ return ICON_OUTLINER_OB_FONT;
+ case OB_SURF:
+ return ICON_OUTLINER_OB_SURFACE;
+ case OB_SPEAKER:
+ return ICON_OUTLINER_OB_SPEAKER;
+ case OB_LIGHTPROBE:
+ return ICON_OUTLINER_OB_LIGHTPROBE;
+ case OB_CURVES:
+ return ICON_OUTLINER_OB_CURVES;
+ case OB_POINTCLOUD:
+ return ICON_OUTLINER_OB_POINTCLOUD;
+ case OB_VOLUME:
+ return ICON_OUTLINER_OB_VOLUME;
+ case OB_EMPTY:
+ if (ob->instance_collection && (ob->transflag & OB_DUPLICOLLECTION)) {
+ return ICON_OUTLINER_OB_GROUP_INSTANCE;
+ }
+ else if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
+ return ICON_OUTLINER_OB_IMAGE;
+ }
+ else if (ob->pd && ob->pd->forcefield) {
+ return ICON_OUTLINER_OB_FORCE_FIELD;
+ }
+ else {
+ return ICON_OUTLINER_OB_EMPTY;
+ }
+ case OB_GPENCIL:
+ return ICON_OUTLINER_OB_GREASEPENCIL;
+ }
+
+ return ICON_NONE;
+ }
+
+ /* TODO(sergey): Casting to short here just to handle ID_NLA which is
+ * NOT inside of IDType enum.
+ */
+ switch ((short)GS(id->name)) {
+ case ID_SCE:
+ return ICON_SCENE_DATA;
+ case ID_ME:
+ return ICON_OUTLINER_DATA_MESH;
+ case ID_CU_LEGACY: {
+ const Curve *cu = (Curve *)id;
+ const short obtype = BKE_curve_type_get(cu);
+
+ switch (obtype) {
+ case OB_FONT:
+ return ICON_OUTLINER_DATA_FONT;
+ case OB_SURF:
+ return ICON_OUTLINER_DATA_SURFACE;
+ default:
+ return ICON_OUTLINER_DATA_CURVE;
+ }
+ break;
+ }
+ case ID_MB:
+ return ICON_OUTLINER_DATA_META;
+ case ID_LT:
+ return ICON_OUTLINER_DATA_LATTICE;
+ case ID_LA: {
+ const Light *la = (Light *)id;
+ switch (la->type) {
+ case LA_LOCAL:
+ return ICON_LIGHT_POINT;
+ case LA_SUN:
+ return ICON_LIGHT_SUN;
+ case LA_SPOT:
+ return ICON_LIGHT_SPOT;
+ case LA_AREA:
+ return ICON_LIGHT_AREA;
+ default:
+ return ICON_OUTLINER_DATA_LIGHT;
+ }
+ }
+ case ID_MA:
+ return ICON_MATERIAL_DATA;
+ case ID_TE:
+ return ICON_TEXTURE_DATA;
+ case ID_IM:
+ return ICON_IMAGE_DATA;
+ case ID_SPK:
+ case ID_SO:
+ return ICON_OUTLINER_DATA_SPEAKER;
+ case ID_AR:
+ return ICON_OUTLINER_DATA_ARMATURE;
+ case ID_CA:
+ return ICON_OUTLINER_DATA_CAMERA;
+ case ID_KE:
+ return ICON_SHAPEKEY_DATA;
+ case ID_WO:
+ return ICON_WORLD_DATA;
+ case ID_AC:
+ return ICON_ACTION;
+ case ID_NLA:
+ return ICON_NLA;
+ case ID_TXT: {
+ const Text *text = (Text *)id;
+ if (text->filepath == nullptr || (text->flags & TXT_ISMEM)) {
+ return ICON_FILE_TEXT;
+ }
+ else {
+ /* Helps distinguish text-based formats like the file-browser does. */
+ return (BIFIconID)ED_file_extension_icon(text->filepath);
+ }
+ }
+ case ID_GR:
+ return ICON_OUTLINER_COLLECTION;
+ case ID_CV:
+ return ICON_OUTLINER_DATA_CURVES;
+ case ID_PT:
+ return ICON_OUTLINER_DATA_POINTCLOUD;
+ case ID_VO:
+ return ICON_OUTLINER_DATA_VOLUME;
+ case ID_LI:
+ if (id->tag & LIB_TAG_MISSING) {
+ return ICON_LIBRARY_DATA_BROKEN;
+ }
+ else if (((Library *)id)->parent) {
+ return ICON_LIBRARY_DATA_INDIRECT;
+ }
+ else {
+ return ICON_LIBRARY_DATA_DIRECT;
+ }
+ case ID_LS:
+ return ICON_LINE_DATA;
+ case ID_GD:
+ return ICON_OUTLINER_DATA_GREASEPENCIL;
+ case ID_LP: {
+ const LightProbe *lp = (LightProbe *)id;
+ switch (lp->type) {
+ case LIGHTPROBE_TYPE_CUBE:
+ return ICON_LIGHTPROBE_CUBEMAP;
+ case LIGHTPROBE_TYPE_PLANAR:
+ return ICON_LIGHTPROBE_PLANAR;
+ case LIGHTPROBE_TYPE_GRID:
+ return ICON_LIGHTPROBE_GRID;
+ default:
+ return ICON_LIGHTPROBE_CUBEMAP;
+ }
+ }
+ case ID_BR:
+ return ICON_BRUSH_DATA;
+ case ID_SCR:
+ case ID_WS:
+ return ICON_WORKSPACE;
+ case ID_MSK:
+ return ICON_MOD_MASK;
+ case ID_MC:
+ return ICON_SEQUENCE;
+ case ID_PC:
+ return ICON_CURVE_BEZCURVE;
+ case ID_SIM:
+ /* TODO: Use correct icon. */
+ return ICON_PHYSICS;
+ default:
+ return ICON_NONE;
+ }
+}
+
TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
{
TreeElementIcon data = {nullptr};
@@ -2356,7 +2536,11 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
data.icon = ICON_MODIFIER_DATA;
data.drag_id = tselem->id;
break;
- case TSE_LIBRARY_OVERRIDE_BASE:
+ case TSE_LIBRARY_OVERRIDE_BASE: {
+ TreeElementOverridesBase *base_te = tree_element_cast<TreeElementOverridesBase>(te);
+ data.icon = tree_element_get_icon_from_id(&base_te->id);
+ break;
+ }
case TSE_LIBRARY_OVERRIDE:
data.icon = ICON_LIBRARY_DATA_OVERRIDE;
break;
@@ -2580,239 +2764,7 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
else if (tselem->id) {
data.drag_id = tselem->id;
data.drag_parent = (data.drag_id && te->parent) ? TREESTORE(te->parent)->id : nullptr;
-
- if (GS(tselem->id->name) == ID_OB) {
- Object *ob = (Object *)tselem->id;
- switch (ob->type) {
- case OB_LAMP:
- data.icon = ICON_OUTLINER_OB_LIGHT;
- break;
- case OB_MESH:
- data.icon = ICON_OUTLINER_OB_MESH;
- break;
- case OB_CAMERA:
- data.icon = ICON_OUTLINER_OB_CAMERA;
- break;
- case OB_CURVES_LEGACY:
- data.icon = ICON_OUTLINER_OB_CURVE;
- break;
- case OB_MBALL:
- data.icon = ICON_OUTLINER_OB_META;
- break;
- case OB_LATTICE:
- data.icon = ICON_OUTLINER_OB_LATTICE;
- break;
- case OB_ARMATURE:
- data.icon = ICON_OUTLINER_OB_ARMATURE;
- break;
- case OB_FONT:
- data.icon = ICON_OUTLINER_OB_FONT;
- break;
- case OB_SURF:
- data.icon = ICON_OUTLINER_OB_SURFACE;
- break;
- case OB_SPEAKER:
- data.icon = ICON_OUTLINER_OB_SPEAKER;
- break;
- case OB_LIGHTPROBE:
- data.icon = ICON_OUTLINER_OB_LIGHTPROBE;
- break;
- case OB_CURVES:
- data.icon = ICON_OUTLINER_OB_CURVES;
- break;
- case OB_POINTCLOUD:
- data.icon = ICON_OUTLINER_OB_POINTCLOUD;
- break;
- case OB_VOLUME:
- data.icon = ICON_OUTLINER_OB_VOLUME;
- break;
- case OB_EMPTY:
- if (ob->instance_collection && (ob->transflag & OB_DUPLICOLLECTION)) {
- data.icon = ICON_OUTLINER_OB_GROUP_INSTANCE;
- }
- else if (ob->empty_drawtype == OB_EMPTY_IMAGE) {
- data.icon = ICON_OUTLINER_OB_IMAGE;
- }
- else if (ob->pd && ob->pd->forcefield) {
- data.icon = ICON_OUTLINER_OB_FORCE_FIELD;
- }
- else {
- data.icon = ICON_OUTLINER_OB_EMPTY;
- }
- break;
- case OB_GPENCIL:
- data.icon = ICON_OUTLINER_OB_GREASEPENCIL;
- break;
- }
- }
- else {
- /* TODO(sergey): Casting to short here just to handle ID_NLA which is
- * NOT inside of IDType enum.
- */
- switch ((short)GS(tselem->id->name)) {
- case ID_SCE:
- data.icon = ICON_SCENE_DATA;
- break;
- case ID_ME:
- data.icon = ICON_OUTLINER_DATA_MESH;
- break;
- case ID_CU_LEGACY: {
- const Curve *cu = (Curve *)tselem->id;
- const short obtype = BKE_curve_type_get(cu);
-
- switch (obtype) {
- case OB_FONT:
- data.icon = ICON_OUTLINER_DATA_FONT;
- break;
- case OB_SURF:
- data.icon = ICON_OUTLINER_DATA_SURFACE;
- break;
- default:
- data.icon = ICON_OUTLINER_DATA_CURVE;
- break;
- }
- break;
- }
- case ID_MB:
- data.icon = ICON_OUTLINER_DATA_META;
- break;
- case ID_LT:
- data.icon = ICON_OUTLINER_DATA_LATTICE;
- break;
- case ID_LA: {
- Light *la = (Light *)tselem->id;
- switch (la->type) {
- case LA_LOCAL:
- data.icon = ICON_LIGHT_POINT;
- break;
- case LA_SUN:
- data.icon = ICON_LIGHT_SUN;
- break;
- case LA_SPOT:
- data.icon = ICON_LIGHT_SPOT;
- break;
- case LA_AREA:
- data.icon = ICON_LIGHT_AREA;
- break;
- default:
- data.icon = ICON_OUTLINER_DATA_LIGHT;
- break;
- }
- break;
- }
- case ID_MA:
- data.icon = ICON_MATERIAL_DATA;
- break;
- case ID_TE:
- data.icon = ICON_TEXTURE_DATA;
- break;
- case ID_IM:
- data.icon = ICON_IMAGE_DATA;
- break;
- case ID_SPK:
- case ID_SO:
- data.icon = ICON_OUTLINER_DATA_SPEAKER;
- break;
- case ID_AR:
- data.icon = ICON_OUTLINER_DATA_ARMATURE;
- break;
- case ID_CA:
- data.icon = ICON_OUTLINER_DATA_CAMERA;
- break;
- case ID_KE:
- data.icon = ICON_SHAPEKEY_DATA;
- break;
- case ID_WO:
- data.icon = ICON_WORLD_DATA;
- break;
- case ID_AC:
- data.icon = ICON_ACTION;
- break;
- case ID_NLA:
- data.icon = ICON_NLA;
- break;
- case ID_TXT: {
- Text *text = (Text *)tselem->id;
- if (text->filepath == nullptr || (text->flags & TXT_ISMEM)) {
- data.icon = ICON_FILE_TEXT;
- }
- else {
- /* Helps distinguish text-based formats like the file-browser does. */
- data.icon = ED_file_extension_icon(text->filepath);
- }
- break;
- }
- case ID_GR:
- data.icon = ICON_OUTLINER_COLLECTION;
- break;
- case ID_CV:
- data.icon = ICON_OUTLINER_DATA_CURVES;
- break;
- case ID_PT:
- data.icon = ICON_OUTLINER_DATA_POINTCLOUD;
- break;
- case ID_VO:
- data.icon = ICON_OUTLINER_DATA_VOLUME;
- break;
- case ID_LI:
- if (tselem->id->tag & LIB_TAG_MISSING) {
- data.icon = ICON_LIBRARY_DATA_BROKEN;
- }
- else if (((Library *)tselem->id)->parent) {
- data.icon = ICON_LIBRARY_DATA_INDIRECT;
- }
- else {
- data.icon = ICON_LIBRARY_DATA_DIRECT;
- }
- break;
- case ID_LS:
- data.icon = ICON_LINE_DATA;
- break;
- case ID_GD:
- data.icon = ICON_OUTLINER_DATA_GREASEPENCIL;
- break;
- case ID_LP: {
- LightProbe *lp = (LightProbe *)tselem->id;
- switch (lp->type) {
- case LIGHTPROBE_TYPE_CUBE:
- data.icon = ICON_LIGHTPROBE_CUBEMAP;
- break;
- case LIGHTPROBE_TYPE_PLANAR:
- data.icon = ICON_LIGHTPROBE_PLANAR;
- break;
- case LIGHTPROBE_TYPE_GRID:
- data.icon = ICON_LIGHTPROBE_GRID;
- break;
- default:
- data.icon = ICON_LIGHTPROBE_CUBEMAP;
- break;
- }
- break;
- }
- case ID_BR:
- data.icon = ICON_BRUSH_DATA;
- break;
- case ID_SCR:
- case ID_WS:
- data.icon = ICON_WORKSPACE;
- break;
- case ID_MSK:
- data.icon = ICON_MOD_MASK;
- break;
- case ID_MC:
- data.icon = ICON_SEQUENCE;
- break;
- case ID_PC:
- data.icon = ICON_CURVE_BEZCURVE;
- break;
- case ID_SIM:
- /* TODO: Use correct icon. */
- data.icon = ICON_PHYSICS;
- break;
- default:
- break;
- }
- }
+ data.icon = tree_element_get_icon_from_id(tselem->id);
}
return data;