Brush Assets: Support adding shortcut to asset shelf items #117861

Merged
Hans Goudey merged 15 commits from HooglyBoogly/blender:brush-assets-shortcut into brush-assets-project 2024-02-07 19:02:47 +01:00
5 changed files with 71 additions and 74 deletions
Showing only changes of commit 0da63eca67 - Show all commits

View File

@ -197,44 +197,14 @@ void AssetViewItem::disable_asset_drag()
void AssetViewItem::build_grid_tile(uiLayout &layout) const
{
const ui::GridViewStyle &style = this->get_view().get_style();
uiBlock *block = uiLayoutGetBlock(&layout);
const AssetView &asset_view = dynamic_cast<const AssetView &>(get_view());
const AssetView &asset_view = reinterpret_cast<const AssetView &>(this->get_view());
const AssetShelfType &shelf_type = *asset_view.shelf_.type;
wmOperatorType *ot = WM_operatortype_find(shelf_type.activate_operator.c_str(), false);
PointerRNA op_props;
WM_operator_properties_create_ptr(&op_props, ot);
asset::operator_asset_reference_props_set(*handle_get_representation(&asset_), op_props);
uiBut *but = uiDefIconTextButO(block,
UI_BTYPE_BUT,
shelf_type.activate_operator.c_str(),
WM_OP_EXEC_DEFAULT,
this->preview_icon_id,
hide_label_ ? "" : label.c_str(),
0,
0,
style.tile_width,
style.tile_height,
"");
PointerRNA *ptr = UI_but_operator_ptr_ensure(but);
operator_asset_reference_props_set(*handle_get_representation(&asset_), *ptr);
if (this->is_active()) {
printf("IS ACTIVE!\n");
UI_but_flag_enable(but, UI_SELECT_DRAW);
}
/* Draw icons that are not previews or images as normal icons with a fixed icon size.
* Otherwise they will be upscaled to the button size. Should probably be done by the widget
* code. */
const int is_preview_flag = (BKE_icon_is_preview(preview_icon_id) ||
BKE_icon_is_image(preview_icon_id)) ?
int(UI_BUT_ICON_PREVIEW) :
0;
ui_def_but_icon(but,
preview_icon_id,
/* NOLINTNEXTLINE: bugprone-suspicious-enum-usage */
UI_HAS_ICON | is_preview_flag);
UI_but_func_tooltip_label_set(but, [this](const uiBut * /*but*/) { return label; });
but->emboss = UI_EMBOSS_NONE;
ui::PreviewGridItem::build_grid_tile_button(layout, ot, op_props);
}
void AssetViewItem::build_context_menu(bContext &C, uiLayout &column) const

View File

@ -19,6 +19,7 @@
#include "UI_resources.hh"
struct bContext;
struct PointerRNA;
struct uiBlock;
struct uiButViewItem;
struct uiLayout;
@ -197,12 +198,15 @@ class PreviewGridItem : public AbstractGridViewItem {
bool hide_label_ = false;
public:
std::string label{};
std::string label;
int preview_icon_id = ICON_NONE;
PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id);
void build_grid_tile(uiLayout &layout) const override;
void build_grid_tile_button(uiLayout &layout,
const wmOperatorType *ot,
const PointerRNA &op_props) const;
/**
HooglyBoogly marked this conversation as resolved
Review

Would add default arguments for convenience, but also to simply communicate that these are optional.

Would add default arguments for convenience, but also to simply communicate that these are optional.
* Set a custom callback to execute when activating this view item. This way users don't have to

View File

@ -2335,6 +2335,7 @@ static void ui_apply_but(
switch (but_type) {
case UI_BTYPE_BUT:
case UI_BTYPE_DECORATOR:
case UI_BTYPE_PREVIEW_TILE:
ui_apply_but_BUT(C, but, data);
break;
case UI_BTYPE_TEXT:

View File

@ -372,35 +372,33 @@ static bool ui_tooltip_data_append_from_keymap(bContext *C, uiTooltipData *data,
LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
wmOperatorType *ot = WM_operatortype_find(kmi->idname, true);
if (ot != nullptr) {
/* Tip. */
{
UI_tooltip_text_field_add(data,
ot->description ? ot->description : ot->name,
{},
UI_TIP_STYLE_NORMAL,
UI_TIP_LC_MAIN,
true);
}
/* Shortcut. */
{
bool found = false;
if (WM_keymap_item_to_string(kmi, false, buf, sizeof(buf))) {
found = true;
}
UI_tooltip_text_field_add(data,
fmt::format(TIP_("Shortcut: {}"), found ? buf : "None"),
{},
UI_TIP_STYLE_NORMAL,
UI_TIP_LC_NORMAL);
}
if (!ot) {
continue;
}
/* Tip. */
UI_tooltip_text_field_add(data,
ot->description ? ot->description : ot->name,
{},
UI_TIP_STYLE_NORMAL,
UI_TIP_LC_MAIN,
true);
/* Python. */
if (U.flag & USER_TOOLTIPS_PYTHON) {
std::string str = ui_tooltip_text_python_from_op(C, ot, kmi->ptr);
UI_tooltip_text_field_add(
data, fmt::format(TIP_("Python: {}"), str), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_PYTHON);
}
/* Shortcut. */
bool found = false;
if (WM_keymap_item_to_string(kmi, false, buf, sizeof(buf))) {
found = true;
}
UI_tooltip_text_field_add(data,
fmt::format(TIP_("Shortcut: {}"), found ? buf : "None"),
{},
UI_TIP_STYLE_NORMAL,
UI_TIP_LC_NORMAL);
/* Python. */
if (U.flag & USER_TOOLTIPS_PYTHON) {
std::string str = ui_tooltip_text_python_from_op(C, ot, kmi->ptr);
UI_tooltip_text_field_add(
data, fmt::format(TIP_("Python: {}"), str), {}, UI_TIP_STYLE_NORMAL, UI_TIP_LC_PYTHON);
}
}

View File

@ -17,6 +17,8 @@
#include "WM_types.hh"
#include "RNA_access.hh"
#include "UI_interface.hh"
#include "interface_intern.hh"
@ -409,25 +411,42 @@ PreviewGridItem::PreviewGridItem(StringRef identifier, StringRef label, int prev
{
}
void PreviewGridItem::build_grid_tile(uiLayout &layout) const
void PreviewGridItem::build_grid_tile_button(uiLayout &layout,
const wmOperatorType *ot,
const PointerRNA &op_props) const
{
const GridViewStyle &style = this->get_view().get_style();
const GridViewStyle &style = get_view().get_style();
uiBlock *block = uiLayoutGetBlock(&layout);
uiBut *but = uiDefBut(block,
uiBut *but;
if (ot) {
but = uiDefButO_ptr(block,
UI_BTYPE_PREVIEW_TILE,
0,
const_cast<wmOperatorType *>(ot),
WM_OP_INVOKE_REGION_WIN,
hide_label_ ? "" : label.c_str(),
0,
0,
style.tile_width,
style.tile_height,
nullptr,
0,
0,
0,
0,
"");
}
else {
but = uiDefBut(block,
UI_BTYPE_PREVIEW_TILE,
0,
hide_label_ ? "" : label.c_str(),
0,
0,
style.tile_width,
style.tile_height,
nullptr,
0,
0,
0,
0,
"");
}
/* Draw icons that are not previews or images as normal icons with a fixed icon size. Otherwise
* they will be upscaled to the button size. Should probably be done by the widget code. */
const int is_preview_flag = (BKE_icon_is_preview(preview_icon_id) ||
@ -442,6 +461,11 @@ void PreviewGridItem::build_grid_tile(uiLayout &layout) const
but->emboss = UI_EMBOSS_NONE;
}
void PreviewGridItem::build_grid_tile(uiLayout &layout) const
{
this->build_grid_tile_button(layout, nullptr, {});
}
void PreviewGridItem::set_on_activate_fn(ActivateFn fn)
{
activate_fn_ = fn;