39 items_.append(std::move(item));
48void AbstractGridView::foreach_view_item(
FunctionRef<
void(AbstractViewItem &)> iter_fn)
const
52 for (
const auto &item_ptr :
items_) {
59 for (
const auto &item_ptr :
items_) {
66 for (
const auto &item_ptr :
items_) {
67 if (item_ptr->is_filtered_visible()) {
80 return match ? *match :
nullptr;
83void AbstractGridView::update_children_from_old(
const AbstractView &old_view)
89 if (!matching_old_item) {
93 new_item.update_from_old(*matching_old_item);
139void AbstractGridViewItem::grid_tile_click_fn(
bContext *C,
void *but_arg1,
void * )
148void AbstractGridViewItem::add_grid_tile_button(
uiBlock &block)
176 throw std::runtime_error(
177 "Invalid state, item must be added through AbstractGridView::add_item()");
217 const int cols_per_row_ = 0;
220 std::optional<IndexRange> visible_items_range_;
235 void add_spacer_button(
uiBlock &block,
int row_count)
const;
241 const int cols_per_row,
243 : grid_view_(grid_view), style_(grid_view.get_style()), cols_per_row_(cols_per_row)
246 visible_items_range_ = this->get_visible_range(v2d, force_visible_item);
255 std::optional<int> index;
259 if (&item == &iter_item) {
268IndexRange BuildOnlyVisibleButtonsHelper::get_visible_range(
269 const View2D &v2d,
const AbstractGridViewItem *force_visible_item)
const
273 int first_idx_in_view = 0;
276 if (!
IS_EQF(scroll_ofs_y, 0)) {
277 const int scrolled_away_rows =
int(scroll_ofs_y) / style_.
tile_height;
279 first_idx_in_view = scrolled_away_rows * cols_per_row_;
283 const int count_rows_in_view = std::max(view_height / style_.
tile_height, 1);
284 const int max_items_in_view = (count_rows_in_view + 1) * cols_per_row_;
287 IndexRange visible_items(first_idx_in_view, max_items_in_view);
290 if (force_visible_item && force_visible_item->is_filtered_visible()) {
292 if (!visible_items.contains(*item_idx)) {
294 return IndexRange((item_idx == 0) ? 0 : *item_idx % cols_per_row_, max_items_in_view);
299 return visible_items;
304 return !visible_items_range_ || visible_items_range_->contains(item_idx);
309 if (!visible_items_range_ || visible_items_range_->is_empty()) {
312 const int first_idx_in_view = visible_items_range_->first();
313 if (first_idx_in_view < 1) {
316 const int tot_tiles_before_visible = first_idx_in_view;
317 const int scrolled_away_rows = tot_tiles_before_visible / cols_per_row_;
318 this->add_spacer_button(block, scrolled_away_rows);
323 if (!visible_items_range_ || visible_items_range_->is_empty()) {
327 const int last_visible_idx = visible_items_range_->last();
329 if (last_item_idx > last_visible_idx) {
330 const int remaining_rows = (cols_per_row_ > 0) ?
ceilf((last_item_idx - last_visible_idx) /
331 float(cols_per_row_)) :
333 BuildOnlyVisibleButtonsHelper::add_spacer_button(block, remaining_rows);
337void BuildOnlyVisibleButtonsHelper::add_spacer_button(
uiBlock &block,
const int row_count)
const
341 for (
int remaining_rows = row_count; remaining_rows > 0;) {
342 const short row_count_this_iter = std::min(
343 std::numeric_limits<short>::max() / style_.
tile_height, remaining_rows);
357 remaining_rows -= row_count_this_iter;
385void GridViewLayoutBuilder::build_grid_tile(
const bContext &C,
392 item.add_grid_tile_button(block_);
400 uiLayout *parent_layout = this->current_layout();
411 const int cols_per_row = std::max(guessed_layout_width / style.
tile_width, 1);
417 v2d, grid_view, cols_per_row, search_highlight_item);
431 if ((item_idx % cols_per_row) == 0) {
435 this->build_grid_tile(C, *row, item);
444uiLayout *GridViewLayoutBuilder::current_layout()
const
457 std::optional<StringRef> search_string)
464 grid_view.
filter(search_string);
481 BIFIconID override_preview_icon_id)
const
536void PreviewGridItem::on_activate(
bContext &C)
543std::optional<bool> PreviewGridItem::should_be_active()
const
bool BKE_icon_is_preview(int icon_id)
bool BKE_icon_is_image(int icon_id)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
void UI_but_func_set(uiBut *but, std::function< void(bContext &)> func)
void uiLayoutSetFixedSize(uiLayout *layout, bool fixed_size)
uiBut * uiDefBut(uiBlock *block, int type, int retval, blender::StringRef str, int x, int y, short width, short height, void *poin, float min, float max, const char *tip)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
int UI_preview_tile_size_y(const int size_px=96)
float uiLayoutGetUnitsX(uiLayout *layout)
int uiLayoutGetWidth(uiLayout *layout)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
int UI_preview_tile_size_x(const int size_px=96)
void UI_but_func_tooltip_label_set(uiBut *but, std::function< std::string(const uiBut *but)> func)
uiLayout * uiLayoutOverlap(uiLayout *layout)
void UI_block_layout_set_current(uiBlock *block, uiLayout *layout)
virtual void build_grid_tile(const bContext &C, uiLayout &layout) const =0
std::optional< std::string > debug_name() const override
AbstractGridView & get_view() const
virtual std::unique_ptr< GridViewItemDropTarget > create_drop_target()
AbstractGridViewItem(StringRef identifier)
std::unique_ptr< DropTargetInterface > create_item_drop_target() final
bool matches(const AbstractViewItem &other) const override
Map< StringRef, AbstractGridViewItem * > item_map_
ItemT & add_item(Args &&...args)
void set_tile_size(int tile_width, int tile_height)
int get_item_count() const
void foreach_filtered_item(ItemIterFn iter_fn) const
int get_item_count_filtered() const
void foreach_item(ItemIterFn iter_fn) const
std::optional< int > item_count_filtered_
const GridViewStyle & get_style() const
friend class AbstractGridViewItem
virtual void build_items()=0
Vector< std::unique_ptr< AbstractGridViewItem > > items_
void activate(bContext &C)
bool is_filtered_visible() const
uiButViewItem * view_item_but_
uiButViewItem * view_item_button() const
const AbstractViewItem * search_highlight_item() const
void update_from_old(uiBlock &new_block)
virtual void change_state_delayed()
void register_item(AbstractViewItem &item)
void filter(std::optional< StringRef > filter_str)
GridViewBuilder(uiBlock &block)
void build_grid_view(const bContext &C, AbstractGridView &grid_view, const View2D &v2d, uiLayout &layout, std::optional< StringRef > search_string={})
GridViewItemDropTarget(AbstractGridView &view)
GridViewLayoutBuilder(uiLayout &layout)
void build_from_view(const bContext &C, const AbstractGridView &grid_view, const View2D &v2d) const
PreviewGridItem(StringRef identifier, StringRef label, int preview_icon_id)
void set_is_active_fn(IsActiveFn fn)
void build_grid_tile_button(uiLayout &layout, BIFIconID override_preview_icon_id=ICON_NONE) const
std::function< void(bContext &C, PreviewGridItem &new_active)> ActivateFn
void set_on_activate_fn(ActivateFn fn)
std::function< bool()> IsActiveFn
void build_grid_tile(const bContext &C, uiLayout &layout) const override
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void ui_def_but_icon(uiBut *but, const int icon, const int flag)
static std::optional< int > find_filtered_item_index(const AbstractGridViewItem &item)
GridViewStyle(int width, int height)
blender::ui::AbstractViewItem * view_item