Asset Template: Extra UI options
This allow users to show/hide:
* Library name / refresh.
* Assets names.
* Filter.
To set them in Python use:
display_options={'NO_NAMES', 'NO_FILTER', 'NO_LIBRARY'}
With contributions by Julian Eisel.
Differential Revision: https://developer.blender.org/D12476
This commit is contained in:
@@ -2209,6 +2209,11 @@ enum uiTemplateListFlags {
|
||||
UI_TEMPLATE_LIST_SORT_LOCK = (1 << 1),
|
||||
/* Don't allow resizing the list, i.e. don't add the grip button. */
|
||||
UI_TEMPLATE_LIST_NO_GRIP = (1 << 2),
|
||||
/** Do not show filtering options, not even the button to expand/collapse them. Also hides the
|
||||
* grip button. */
|
||||
UI_TEMPLATE_LIST_NO_FILTER_OPTIONS = (1 << 3),
|
||||
/** For #UILST_LAYOUT_BIG_PREVIEW_GRID, don't reserve space for the name label. */
|
||||
UI_TEMPLATE_LIST_NO_NAMES = (1 << 4),
|
||||
|
||||
UI_TEMPLATE_LIST_FLAGS_LAST
|
||||
};
|
||||
@@ -2289,6 +2294,12 @@ int uiTemplateRecentFiles(struct uiLayout *layout, int rows);
|
||||
void uiTemplateFileSelectPath(uiLayout *layout,
|
||||
struct bContext *C,
|
||||
struct FileSelectParams *params);
|
||||
|
||||
enum {
|
||||
UI_TEMPLATE_ASSET_DRAW_NO_NAMES = (1 << 0),
|
||||
UI_TEMPLATE_ASSET_DRAW_NO_FILTER = (1 << 1),
|
||||
UI_TEMPLATE_ASSET_DRAW_NO_LIBRARY = (1 << 2),
|
||||
};
|
||||
void uiTemplateAssetView(struct uiLayout *layout,
|
||||
struct bContext *C,
|
||||
const char *list_id,
|
||||
@@ -2299,6 +2310,7 @@ void uiTemplateAssetView(struct uiLayout *layout,
|
||||
struct PointerRNA *active_dataptr,
|
||||
const char *active_propname,
|
||||
const struct AssetFilterSettings *filter_settings,
|
||||
const int display_flags,
|
||||
const char *activate_opname,
|
||||
struct PointerRNA *r_activate_op_properties,
|
||||
const char *drag_opname,
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
struct AssetViewListData {
|
||||
AssetLibraryReference asset_library_ref;
|
||||
bScreen *screen;
|
||||
bool show_names;
|
||||
};
|
||||
|
||||
static void asset_view_item_but_drag_set(uiBut *but,
|
||||
@@ -95,14 +96,15 @@ static void asset_view_draw_item(uiList *ui_list,
|
||||
uiLayoutSetContextPointer(layout, "asset_handle", itemptr);
|
||||
|
||||
uiBlock *block = uiLayoutGetBlock(layout);
|
||||
const bool show_names = list_data->show_names;
|
||||
/* TODO ED_fileselect_init_layout(). Share somehow? */
|
||||
const float size_x = (96.0f / 20.0f) * UI_UNIT_X;
|
||||
const float size_y = (96.0f / 20.0f) * UI_UNIT_Y;
|
||||
const float size_y = (96.0f / 20.0f) * UI_UNIT_Y - (show_names ? 0 : UI_UNIT_Y);
|
||||
uiBut *but = uiDefIconTextBut(block,
|
||||
UI_BTYPE_PREVIEW_TILE,
|
||||
0,
|
||||
ED_asset_handle_get_preview_icon_id(asset_handle),
|
||||
ED_asset_handle_get_name(asset_handle),
|
||||
show_names ? ED_asset_handle_get_name(asset_handle) : "",
|
||||
0,
|
||||
0,
|
||||
size_x,
|
||||
@@ -202,6 +204,7 @@ void uiTemplateAssetView(uiLayout *layout,
|
||||
PointerRNA *active_dataptr,
|
||||
const char *active_propname,
|
||||
const AssetFilterSettings *filter_settings,
|
||||
const int display_flags,
|
||||
const char *activate_opname,
|
||||
PointerRNA *r_activate_op_properties,
|
||||
const char *drag_opname,
|
||||
@@ -220,9 +223,11 @@ void uiTemplateAssetView(uiLayout *layout,
|
||||
RNA_property_enum_get(asset_library_dataptr, asset_library_prop));
|
||||
|
||||
uiLayout *row = uiLayoutRow(col, true);
|
||||
uiItemFullR(row, asset_library_dataptr, asset_library_prop, RNA_NO_INDEX, 0, 0, "", 0);
|
||||
if (asset_library_ref.type != ASSET_LIBRARY_LOCAL) {
|
||||
uiItemO(row, "", ICON_FILE_REFRESH, "ASSET_OT_list_refresh");
|
||||
if ((display_flags & UI_TEMPLATE_ASSET_DRAW_NO_LIBRARY) == 0) {
|
||||
uiItemFullR(row, asset_library_dataptr, asset_library_prop, RNA_NO_INDEX, 0, 0, "", 0);
|
||||
if (asset_library_ref.type != ASSET_LIBRARY_LOCAL) {
|
||||
uiItemO(row, "", ICON_FILE_REFRESH, "ASSET_OT_list_refresh");
|
||||
}
|
||||
}
|
||||
|
||||
ED_assetlist_storage_fetch(&asset_library_ref, C);
|
||||
@@ -236,6 +241,15 @@ void uiTemplateAssetView(uiLayout *layout,
|
||||
"AssetViewListData");
|
||||
list_data->asset_library_ref = asset_library_ref;
|
||||
list_data->screen = CTX_wm_screen(C);
|
||||
list_data->show_names = (display_flags & UI_TEMPLATE_ASSET_DRAW_NO_NAMES) == 0;
|
||||
|
||||
uiTemplateListFlags template_list_flags = UI_TEMPLATE_LIST_NO_GRIP;
|
||||
if ((display_flags & UI_TEMPLATE_ASSET_DRAW_NO_NAMES) != 0) {
|
||||
template_list_flags |= UI_TEMPLATE_LIST_NO_NAMES;
|
||||
}
|
||||
if ((display_flags & UI_TEMPLATE_ASSET_DRAW_NO_FILTER) != 0) {
|
||||
template_list_flags |= UI_TEMPLATE_LIST_NO_FILTER_OPTIONS;
|
||||
}
|
||||
|
||||
/* TODO can we have some kind of model-view API to handle referencing, filtering and lazy loading
|
||||
* (of previews) of the items? */
|
||||
@@ -252,7 +266,7 @@ void uiTemplateAssetView(uiLayout *layout,
|
||||
0,
|
||||
UILST_LAYOUT_BIG_PREVIEW_GRID,
|
||||
0,
|
||||
UI_TEMPLATE_LIST_NO_GRIP,
|
||||
template_list_flags,
|
||||
list_data);
|
||||
if (!list) {
|
||||
/* List creation failed. */
|
||||
|
||||
@@ -944,10 +944,16 @@ static void ui_template_list_layout_draw(bContext *C,
|
||||
/* For scrollbar. */
|
||||
row = uiLayoutRow(glob, false);
|
||||
|
||||
const bool show_names = (flags & UI_TEMPLATE_LIST_NO_NAMES) == 0;
|
||||
|
||||
/* TODO ED_fileselect_init_layout(). Share somehow? */
|
||||
float size_x = (96.0f / 20.0f) * UI_UNIT_X;
|
||||
float size_y = (96.0f / 20.0f) * UI_UNIT_Y;
|
||||
|
||||
if (!show_names) {
|
||||
size_y -= UI_UNIT_Y;
|
||||
}
|
||||
|
||||
const int cols_per_row = MAX2((uiLayoutGetWidth(box) - V2D_SCROLL_WIDTH) / size_x, 1);
|
||||
uiLayout *grid = uiLayoutGridFlow(row, true, cols_per_row, true, true, true);
|
||||
|
||||
@@ -1033,7 +1039,8 @@ static void ui_template_list_layout_draw(bContext *C,
|
||||
break;
|
||||
}
|
||||
|
||||
if (glob) {
|
||||
const bool add_filters_but = (flags & UI_TEMPLATE_LIST_NO_FILTER_OPTIONS) == 0;
|
||||
if (glob && add_filters_but) {
|
||||
const bool add_grip_but = (flags & UI_TEMPLATE_LIST_NO_GRIP) == 0;
|
||||
|
||||
/* About #UI_BTYPE_GRIP drag-resize:
|
||||
|
||||
@@ -5443,13 +5443,20 @@ void ui_draw_preview_item_stateless(const uiFontStyle *fstyle,
|
||||
rcti trect = *rect;
|
||||
const float text_size = UI_UNIT_Y;
|
||||
float font_dims[2] = {0.0f, 0.0f};
|
||||
const bool has_text = name && name[0];
|
||||
|
||||
/* draw icon in rect above the space reserved for the label */
|
||||
rect->ymin += text_size;
|
||||
if (has_text) {
|
||||
/* draw icon in rect above the space reserved for the label */
|
||||
rect->ymin += text_size;
|
||||
}
|
||||
GPU_blend(GPU_BLEND_ALPHA);
|
||||
widget_draw_preview(iconid, 1.0f, rect);
|
||||
GPU_blend(GPU_BLEND_NONE);
|
||||
|
||||
if (!has_text) {
|
||||
return;
|
||||
}
|
||||
|
||||
BLF_width_and_height(
|
||||
fstyle->uifont_id, name, BLF_DRAW_STR_DUMMY_MAX, &font_dims[0], &font_dims[1]);
|
||||
|
||||
|
||||
@@ -622,6 +622,7 @@ static void rna_uiTemplateAssetView(uiLayout *layout,
|
||||
PointerRNA *active_dataptr,
|
||||
const char *active_propname,
|
||||
int filter_id_types,
|
||||
int display_flags,
|
||||
const char *activate_opname,
|
||||
PointerRNA *r_activate_op_properties,
|
||||
const char *drag_opname,
|
||||
@@ -630,6 +631,7 @@ static void rna_uiTemplateAssetView(uiLayout *layout,
|
||||
AssetFilterSettings filter_settings = {
|
||||
.id_types = filter_id_types ? filter_id_types : FILTER_ID_ALL,
|
||||
};
|
||||
|
||||
uiTemplateAssetView(layout,
|
||||
C,
|
||||
list_id,
|
||||
@@ -640,6 +642,7 @@ static void rna_uiTemplateAssetView(uiLayout *layout,
|
||||
active_dataptr,
|
||||
active_propname,
|
||||
&filter_settings,
|
||||
display_flags,
|
||||
activate_opname,
|
||||
r_activate_op_properties,
|
||||
drag_opname,
|
||||
@@ -878,6 +881,25 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
static const EnumPropertyItem asset_view_template_options[] = {
|
||||
{UI_TEMPLATE_ASSET_DRAW_NO_NAMES,
|
||||
"NO_NAMES",
|
||||
0,
|
||||
"",
|
||||
"Do not display the name of each asset underneath preview images"},
|
||||
{UI_TEMPLATE_ASSET_DRAW_NO_FILTER,
|
||||
"NO_FILTER",
|
||||
0,
|
||||
"",
|
||||
"Do not display buttons for filtering the available assets"},
|
||||
{UI_TEMPLATE_ASSET_DRAW_NO_LIBRARY,
|
||||
"NO_LIBRARY",
|
||||
0,
|
||||
"",
|
||||
"Do not display buttons to choose or refresh an asset library"},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
|
||||
static float node_socket_color_default[] = {0.0f, 0.0f, 0.0f, 1.0f};
|
||||
|
||||
/* simple layout specifiers */
|
||||
@@ -1839,6 +1861,12 @@ void RNA_api_ui_layout(StructRNA *srna)
|
||||
RNA_def_property_enum_items(parm, DummyRNA_NULL_items);
|
||||
RNA_def_property_enum_funcs(parm, NULL, NULL, "rna_uiTemplateAssetView_filter_id_types_itemf");
|
||||
RNA_def_property_flag(parm, PROP_ENUM_FLAG);
|
||||
RNA_def_enum_flag(func,
|
||||
"display_options",
|
||||
asset_view_template_options,
|
||||
0,
|
||||
"",
|
||||
"Displaying options for the asset view");
|
||||
RNA_def_string(func,
|
||||
"activate_operator",
|
||||
NULL,
|
||||
|
||||
Reference in New Issue
Block a user