Refactor: Pass context to UI view item activate function

The `on_activate()` function is expected to do undo pushes, call
operators, send notifiers and things like that as needed. Context is
necessary for such things, so seems reasonable to provide it as
argument.

Also needed for #110378.
This commit is contained in:
Julian Eisel
2023-07-26 16:47:17 +02:00
parent 2e9bc6373c
commit 741c684bf6
9 changed files with 25 additions and 28 deletions

View File

@@ -168,7 +168,7 @@ class AbstractViewItem {
* an item calls it, a change in the value returned by #should_be_active() to reflect an external
* state change does not.
*/
virtual void on_activate();
virtual void on_activate(bContext &C);
/**
* If the result is not empty, it controls whether the item should be active or not, usually
* depending on the data that the view represents. Note that since this is meant to reflect
@@ -238,7 +238,7 @@ class AbstractViewItem {
* Requires the view to have completed reconstruction, see #is_reconstructed(). Otherwise the
* actual item state is unknown, possibly calling state-change update functions incorrectly.
*/
void activate();
void activate(bContext &C);
void deactivate();
/**
* Requires the view to have completed reconstruction, see #is_reconstructed(). Otherwise we

View File

@@ -189,7 +189,7 @@ class GridViewBuilder {
class PreviewGridItem : public AbstractGridViewItem {
public:
using IsActiveFn = std::function<bool()>;
using ActivateFn = std::function<void(PreviewGridItem &new_active)>;
using ActivateFn = std::function<void(bContext &C, PreviewGridItem &new_active)>;
protected:
/** See #set_on_activate_fn() */
@@ -218,7 +218,7 @@ class PreviewGridItem : public AbstractGridViewItem {
private:
std::optional<bool> should_be_active() const override;
void on_activate() override;
void on_activate(bContext &C) override;
};
/** \} */

View File

@@ -277,7 +277,7 @@ class AbstractTreeViewItem : public AbstractViewItem, public TreeViewItemContain
class BasicTreeViewItem : public AbstractTreeViewItem {
public:
using IsActiveFn = std::function<bool()>;
using ActivateFn = std::function<void(BasicTreeViewItem &new_active)>;
using ActivateFn = std::function<void(bContext &C, BasicTreeViewItem &new_active)>;
BIFIconID icon;
explicit BasicTreeViewItem(StringRef label, BIFIconID icon = ICON_NONE);
@@ -304,7 +304,7 @@ class BasicTreeViewItem : public AbstractTreeViewItem {
static void tree_row_click_fn(struct bContext *C, void *arg1, void *arg2);
std::optional<bool> should_be_active() const override;
void on_activate() override;
void on_activate(bContext &C) override;
};
/** \} */

View File

@@ -180,7 +180,7 @@ class LayerViewItem : public AbstractTreeViewItem {
return {};
}
void on_activate() override
void on_activate(bContext & /*C*/) override
{
this->grease_pencil_.set_active_layer(&layer_);
}

View File

@@ -36,7 +36,7 @@ void AbstractViewItem::update_from_old(const AbstractViewItem &old)
/** \name Active Item State
* \{ */
void AbstractViewItem::on_activate()
void AbstractViewItem::on_activate(bContext & /*C*/)
{
/* Do nothing by default. */
}
@@ -65,10 +65,10 @@ bool AbstractViewItem::set_state_active()
return true;
}
void AbstractViewItem::activate()
void AbstractViewItem::activate(bContext &C)
{
if (set_state_active()) {
on_activate();
on_activate(C);
}
}

View File

@@ -127,13 +127,13 @@ bool AbstractGridViewItem::matches(const AbstractViewItem &other) const
return identifier_ == other_grid_item.identifier_;
}
void AbstractGridViewItem::grid_tile_click_fn(bContext * /*C*/, void *but_arg1, void * /*arg2*/)
void AbstractGridViewItem::grid_tile_click_fn(bContext *C, void *but_arg1, void * /*arg2*/)
{
uiButViewItem *view_item_but = (uiButViewItem *)but_arg1;
AbstractGridViewItem &grid_item = reinterpret_cast<AbstractGridViewItem &>(
*view_item_but->view_item);
grid_item.activate();
grid_item.activate(*C);
}
void AbstractGridViewItem::add_grid_tile_button(uiBlock &block)
@@ -441,10 +441,10 @@ void PreviewGridItem::set_is_active_fn(IsActiveFn fn)
is_active_fn_ = fn;
}
void PreviewGridItem::on_activate()
void PreviewGridItem::on_activate(bContext &C)
{
if (activate_fn_) {
activate_fn_(*this);
activate_fn_(C, *this);
}
}

View File

@@ -282,12 +282,12 @@ std::optional<DropLocation> TreeViewItemDropTarget::choose_drop_location(
/* ---------------------------------------------------------------------- */
void AbstractTreeViewItem::tree_row_click_fn(bContext * /*C*/, void *but_arg1, void * /*arg2*/)
void AbstractTreeViewItem::tree_row_click_fn(bContext *C, void *but_arg1, void * /*arg2*/)
{
uiButViewItem *item_but = (uiButViewItem *)but_arg1;
AbstractTreeViewItem &tree_item = reinterpret_cast<AbstractTreeViewItem &>(*item_but->view_item);
tree_item.activate();
tree_item.activate(*C);
/* Not only activate the item, also show its children. Maybe this should be optional, or
* controlled by the specific tree-view. */
tree_item.set_collapsed(false);
@@ -346,7 +346,7 @@ void AbstractTreeViewItem::collapse_chevron_click_fn(bContext *C,
/* When collapsing an item with an active child, make this collapsed item active instead so the
* active item stays visible. */
if (hovered_item->has_active_child()) {
hovered_item->activate();
hovered_item->activate(*C);
}
}
@@ -711,10 +711,10 @@ void BasicTreeViewItem::add_label(uiLayout &layout, StringRefNull label_override
uiItemL(&layout, IFACE_(label.c_str()), icon);
}
void BasicTreeViewItem::on_activate()
void BasicTreeViewItem::on_activate(bContext &C)
{
if (activate_fn_) {
activate_fn_(*this);
activate_fn_(C, *this);
}
}

View File

@@ -82,7 +82,7 @@ class AssetCatalogTreeViewItem : public ui::BasicTreeViewItem {
public:
AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog_item);
void on_activate() override;
void on_activate(bContext &C) override;
void build_row(uiLayout &row) override;
void build_context_menu(bContext &C, uiLayout &column) const override;
@@ -220,7 +220,7 @@ AssetCatalogTreeViewAllItem &AssetCatalogTreeView::add_all_item()
FileAssetSelectParams *params = params_;
AssetCatalogTreeViewAllItem &item = add_tree_item<AssetCatalogTreeViewAllItem>(IFACE_("All"));
item.set_on_activate_fn([params](ui::BasicTreeViewItem & /*item*/) {
item.set_on_activate_fn([params](bContext & /*C*/, ui::BasicTreeViewItem & /*item*/) {
params->asset_catalog_visibility = FILE_SHOW_ASSETS_ALL_CATALOGS;
WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr);
});
@@ -236,7 +236,7 @@ void AssetCatalogTreeView::add_unassigned_item()
AssetCatalogTreeViewUnassignedItem &item = add_tree_item<AssetCatalogTreeViewUnassignedItem>(
IFACE_("Unassigned"), ICON_FILE_HIDDEN);
item.set_on_activate_fn([params](ui::BasicTreeViewItem & /*item*/) {
item.set_on_activate_fn([params](bContext & /*C*/, ui::BasicTreeViewItem & /*item*/) {
params->asset_catalog_visibility = FILE_SHOW_ASSETS_WITHOUT_CATALOG;
WM_main_add_notifier(NC_SPACE | ND_SPACE_ASSET_PARAMS, nullptr);
});
@@ -264,7 +264,7 @@ AssetCatalogTreeViewItem::AssetCatalogTreeViewItem(AssetCatalogTreeItem *catalog
{
}
void AssetCatalogTreeViewItem::on_activate()
void AssetCatalogTreeViewItem::on_activate(bContext & /*C*/)
{
AssetCatalogTreeView &tree_view = static_cast<AssetCatalogTreeView &>(get_tree_view());
tree_view.activate_catalog_by_id(catalog_item_.get_catalog_id());

View File

@@ -41,7 +41,7 @@ class GeometryDataSetTreeViewItem : public ui::AbstractTreeViewItem {
StringRef label,
BIFIconID icon);
void on_activate() override;
void on_activate(bContext &C) override;
void build_row(uiLayout &row) override;
@@ -56,7 +56,6 @@ class GeometryDataSetTreeViewItem : public ui::AbstractTreeViewItem {
class GeometryDataSetTreeView : public ui::AbstractTreeView {
bke::GeometrySet geometry_set_;
const bContext &C_;
SpaceSpreadsheet &sspreadsheet_;
bScreen &screen_;
@@ -65,7 +64,6 @@ class GeometryDataSetTreeView : public ui::AbstractTreeView {
public:
GeometryDataSetTreeView(bke::GeometrySet geometry_set, const bContext &C)
: geometry_set_(std::move(geometry_set)),
C_(C),
sspreadsheet_(*CTX_wm_space_spreadsheet(&C)),
screen_(*CTX_wm_screen(&C))
{
@@ -129,10 +127,9 @@ GeometryDataSetTreeViewItem::GeometryDataSetTreeViewItem(
label_ = label;
}
void GeometryDataSetTreeViewItem::on_activate()
void GeometryDataSetTreeViewItem::on_activate(bContext &C)
{
GeometryDataSetTreeView &tree_view = this->get_tree();
bContext &C = const_cast<bContext &>(tree_view.C_);
SpaceSpreadsheet &sspreadsheet = tree_view.sspreadsheet_;
tree_view.sspreadsheet_.geometry_component_type = uint8_t(component_type_);
if (domain_) {