20#include "RNA_prototypes.hh"
28#include <fmt/format.h>
61 if (active_drag_node->
node->wrap().is_layer()) {
66 if (drop_tree_node_.is_child_of(group)) {
85 return fmt::format(
TIP_(
"Move {} {} into {}"), node_type, drag_name, drop_name);
87 return fmt::format(
TIP_(
"Move {} {} above {}"), node_type, drag_name, drop_name);
89 return fmt::format(
TIP_(
"Move {} {} below {}"), node_type, drag_name, drop_name);
112 if (&drop_tree_node_ == &drag_node) {
119 "Inserting should not be possible for layers, only for groups, because "
120 "only groups use DropBehavior::Reorder_and_Insert");
122 grease_pencil.move_node_into(drag_node, drop_group);
127 grease_pencil.move_node_after(drag_node, drop_tree_node_);
132 grease_pencil.move_node_before(drag_node, drop_tree_node_);
151 GreasePencilv3LayerGroup,
172 grease_pencil_(grease_pencil),
173 dragged_node_(node.
wrap())
179 if (dragged_node_.wrap().
is_layer()) {
188 drag_data->
node = &dragged_node_;
195 grease_pencil_.set_active_node(&dragged_node_);
202 : grease_pencil_(grease_pencil), layer_(layer)
204 this->
label_ = layer.name();
209 build_layer_name(row);
214 build_layer_buttons(*sub);
226 if (this->grease_pencil_.has_active_layer()) {
236 &grease_pencil_.
id, &RNA_GreasePencilv3Layers,
nullptr);
241 if (grease_pencil_.has_active_group()) {
245 GreasePencilv3LayerGroup,
274 return layer_.name();
279 return std::make_unique<LayerViewItemDragController>(
292 void build_layer_name(
uiLayout &row)
295 &row, layer_.name().c_str(), ICON_OUTLINER_DATA_GP_LAYER,
false,
false);
296 if (!layer_.is_editable()) {
301 void build_layer_buttons(
uiLayout &row)
327 : grease_pencil_(grease_pencil), group_(group)
329 this->
label_ = group_.name();
334 build_layer_group_name(row);
339 build_layer_group_buttons(*sub);
344 if (this->grease_pencil_.has_active_group()) {
345 return &group_ == this->grease_pencil_.get_active_group();
362 &grease_pencil_.
id, &RNA_GreasePencilv3LayerGroup,
nullptr);
364 &grease_pencil_.
id, &RNA_GreasePencilLayerGroup, &group_);
368 if (grease_pencil_.has_active_layer()) {
372 GreasePencilv3Layers,
390 &grease_pencil_.
id, &RNA_GreasePencilLayerGroup, &group_);
402 return group_.name();
407 return std::make_unique<LayerViewItemDragController>(
413 return std::make_unique<LayerNodeDropTarget>(
421 void build_layer_group_name(
uiLayout &row)
423 short icon = ICON_GREASEPENCIL_LAYER_GROUP;
425 icon = ICON_LAYERGROUP_COLOR_01 + group_.
color_tag;
428 uiBut *but =
uiItemL_ex(&row, group_.name().c_str(), icon,
false,
false);
429 if (!group_.is_editable()) {
434 void build_layer_group_buttons(
uiLayout &row)
438 &grease_pencil_.
id, &RNA_GreasePencilLayerGroup, &group_);
472 if (node.is_layer()) {
473 parent.add_tree_item<LayerViewItem>(this->grease_pencil_, node.as_layer());
475 else if (node.is_group()) {
476 LayerGroupViewItem &group_item = parent.add_tree_item<LayerGroupViewItem>(this->grease_pencil_,
478 group_item.uncollapse_by_default();
480 build_tree_node_recursive(group_item, node_->wrap());
491 this->build_tree_node_recursive(*
this, node->wrap());
503 if (grease_pencil ==
nullptr) {
511 "Grease Pencil Layer Tree View",
512 std::make_unique<blender::ui::greasepencil::LayerTreeView>(*grease_pencil));
wmMsgBus * CTX_wm_message_bus(const bContext *C)
Low-level operations for grease pencil.
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
void DEG_id_tag_update(ID *id, unsigned int flags)
@ GP_LAYER_TREE_NODE_HIDE_MASKS
void ED_undo_push(bContext *C, const char *str)
blender::ui::AbstractGridView * UI_block_add_view(uiBlock &block, blender::StringRef idname, std::unique_ptr< blender::ui::AbstractGridView > grid_view)
void UI_but_disable(uiBut *but, const char *disabled_hint)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void UI_menutype_draw(bContext *C, MenuType *mt, uiLayout *layout)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiTemplateGreasePencilLayerTree(uiLayout *layout, bContext *C)
uiBut * uiItemL_ex(uiLayout *layout, const char *name, int icon, bool highlight, bool redalert)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ WM_DRAG_GREASE_PENCIL_LAYER
@ WM_DRAG_GREASE_PENCIL_GROUP
constexpr const char * c_str() const
const TreeNode & as_node() const
const TreeNode & as_node() const
const LayerGroup & parent_group() const
const LayerGroup & as_group() const
const LayerGroup * parent_group() const
Abstract base class for defining a customizable tree-view item.
AbstractTreeView & get_tree_view() const
void set_default_rows(int default_rows)
void set_context_menu_title(const std::string &title)
static void build_tree_view(AbstractTreeView &tree_view, uiLayout &layout, std::optional< StringRef > search_string={}, bool add_box=true)
StringRef get_rename_string() const override
bool supports_renaming() const override
std::unique_ptr< AbstractViewItemDragController > create_drag_controller() const override
void on_activate(bContext &C) override
void build_row(uiLayout &row) override
std::optional< bool > should_be_active() const override
void build_context_menu(bContext &C, uiLayout &layout) const override
bool rename(const bContext &C, StringRefNull new_name) override
LayerGroupViewItem(GreasePencil &grease_pencil, LayerGroup &group)
std::unique_ptr< TreeViewItemDropTarget > create_drop_target() override
std::string drop_tooltip(const DragInfo &drag_info) const override
bool can_drop(const wmDrag &drag, const char **) const override
LayerNodeDropTarget(AbstractTreeViewItem &item, TreeNode &drop_tree_node, DropBehavior behavior)
bool on_drop(bContext *C, const DragInfo &drag_info) const override
LayerTreeView(GreasePencil &grease_pencil)
void build_tree() override
void on_drag_start() override
eWM_DragDataType get_drag_type() const override
LayerViewItemDragController(LayerTreeView &tree_view, GreasePencil &grease_pencil, GreasePencilLayerTreeNode &node)
void * create_drag_data() const override
void on_activate(bContext &C) override
bool supports_renaming() const override
LayerViewItem(GreasePencil &grease_pencil, Layer &layer)
bool rename(const bContext &C, StringRefNull new_name) override
void build_row(uiLayout &row) override
std::optional< bool > should_be_active() const override
StringRef get_rename_string() const override
bool supports_collapsing() const override
std::unique_ptr< AbstractViewItemDragController > create_drag_controller() const override
std::unique_ptr< TreeViewItemDropTarget > create_drop_target() override
GreasePencil * from_context(bContext &C)
TreeViewItemContainer TreeViewOrItem
float wrap(float value, float max, float min)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value, ReportList *reports)
void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
PointerRNA RNA_pointer_create(ID *id, StructRNA *type, void *data)
void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
GreasePencilLayerTreeNode base
GreasePencilLayerTreeNode base
const DropLocation drop_location
GreasePencil * grease_pencil
GreasePencilLayerTreeNode * node
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
#define WM_msg_publish_rna_prop(mbus, id_, data_, type_, prop_)