22#include "RNA_prototypes.hh"
30#include <fmt/format.h>
34using namespace blender::bke::greasepencil;
63 if (active_drag_node->
node->wrap().is_layer()) {
68 if (drop_tree_node_.is_child_of(group)) {
82 const StringRef drop_name = drop_tree_node_.name();
88 fmt::runtime(
TIP_(
"Move {} {} into {}")), node_type, drag_name, drop_name);
91 fmt::runtime(
TIP_(
"Move {} {} above {}")), node_type, drag_name, drop_name);
94 fmt::runtime(
TIP_(
"Move {} {} below {}")), node_type, drag_name, drop_name);
110 if (!drop_tree_node_.parent_group()) {
117 if (&drop_tree_node_ == &drag_node) {
124 "Inserting should not be possible for layers, only for groups, because "
125 "only groups use DropBehavior::Reorder_and_Insert");
126 LayerGroup &drop_group = drop_tree_node_.as_group();
127 grease_pencil.move_node_into(drag_node, drop_group);
132 grease_pencil.move_node_after(drag_node, drop_tree_node_);
137 grease_pencil.move_node_before(drag_node, drop_tree_node_);
156 GreasePencilv3LayerGroup,
179 grease_pencil_(grease_pencil),
180 dragged_node_(node.
wrap())
186 if (dragged_node_.wrap().is_layer()) {
195 drag_data->
node = &dragged_node_;
202 grease_pencil_.set_active_node(&dragged_node_);
209 : grease_pencil_(grease_pencil), layer_(layer)
211 this->
label_ = layer.name();
216 build_layer_name(row);
221 build_layer_buttons(*sub);
233 if (this->grease_pencil_.has_active_layer()) {
243 &grease_pencil_.id, &RNA_GreasePencilv3Layers,
nullptr);
245 &grease_pencil_.id, &RNA_GreasePencilLayer, &layer_);
249 if (grease_pencil_.has_active_group()) {
253 GreasePencilv3LayerGroup,
271 &grease_pencil_.id, &RNA_GreasePencilLayer, &layer_);
283 return layer_.name();
288 return std::make_unique<LayerViewItemDragController>(
301 void build_layer_name(
uiLayout &row)
304 &row, layer_.name().c_str(), ICON_OUTLINER_DATA_GP_LAYER,
false,
false);
309 else if (!layer_.is_editable()) {
314 void build_layer_buttons(
uiLayout &row)
318 &grease_pencil_.
id, &RNA_GreasePencilLayer, &layer_);
320 sub = &row.
row(
true);
324 sub = &row.
row(
true);
328 sub = &row.
row(
true);
332 sub = &row.
row(
true);
341 : grease_pencil_(grease_pencil), group_(group)
343 this->
label_ = group_.name();
357 group_.set_expanded(!collapsed);
368 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
377 build_layer_group_name(row);
382 build_layer_group_buttons(*sub);
387 if (this->grease_pencil_.has_active_group()) {
388 return &group_ == this->grease_pencil_.get_active_group();
405 &grease_pencil_.id, &RNA_GreasePencilv3LayerGroup,
nullptr);
407 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
411 if (grease_pencil_.has_active_layer()) {
415 GreasePencilv3Layers,
433 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
445 return group_.name();
450 return std::make_unique<LayerViewItemDragController>(
456 return std::make_unique<LayerNodeDropTarget>(
464 void build_layer_group_name(
uiLayout &row)
466 short icon = ICON_GREASEPENCIL_LAYER_GROUP;
468 icon = ICON_LAYERGROUP_COLOR_01 + group_.
color_tag;
475 else if (!group_.is_editable()) {
480 void build_layer_group_buttons(uiLayout &row)
484 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
486 sub = &row.
row(
true);
487 if (group_.as_node().parent_group()) {
492 sub = &row.
row(
true);
493 if (group_.as_node().parent_group()) {
498 sub = &row.
row(
true);
499 if (group_.as_node().parent_group()) {
504 sub = &row.
row(
true);
505 if (group_.as_node().parent_group()) {
514 using namespace blender::bke::greasepencil;
516 parent.add_tree_item<LayerViewItem>(this->grease_pencil_, node.
as_layer());
519 LayerGroupViewItem &group_item = parent.add_tree_item<LayerGroupViewItem>(this->grease_pencil_,
522 build_tree_node_recursive(group_item, node_->wrap());
533 this->build_tree_node_recursive(*
this, node->wrap());
545 if (grease_pencil ==
nullptr) {
553 "Grease Pencil Layer Tree View",
554 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)
struct GreasePencilLayerTreeNode GreasePencilLayerTreeNode
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 uiTemplateGreasePencilLayerTree(uiLayout *layout, bContext *C)
void UI_but_flag_enable(uiBut *but, int flag)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiBlock * uiLayoutGetBlock(uiLayout *layout)
void UI_menutype_draw(bContext *C, MenuType *mt, uiLayout *layout)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
uiBut * uiItemL_ex(uiLayout *layout, blender::StringRef name, int icon, bool highlight, bool redalert)
@ WM_DRAG_GREASE_PENCIL_LAYER
@ WM_DRAG_GREASE_PENCIL_GROUP
const LayerGroup & as_group() const
const Layer & as_layer() const
constexpr const char * c_str() const
const LayerGroup & parent_group() const
Abstract base class for defining a customizable tree-view item.
bool is_collapsed() const
AbstractTreeView & get_tree_view() const
virtual bool set_collapsed(bool collapsed)
void set_default_rows(int default_rows)
AbstractViewItemDragController(AbstractView &view)
void set_context_menu_title(const std::string &title)
static void build_tree_view(const bContext &C, AbstractTreeView &tree_view, uiLayout &layout, std::optional< StringRef > search_string={}, bool add_box=true)
friend class AbstractTreeViewItem
friend class AbstractTreeView
TreeViewItemDropTarget(AbstractTreeViewItem &view_item, DropBehavior behavior=DropBehavior::Insert)
StringRef get_rename_string() const override
bool supports_renaming() const override
std::unique_ptr< AbstractViewItemDragController > create_drag_controller() const override
void on_collapse_change(bContext &C, const bool is_collapsed) override
std::optional< bool > should_be_collapsed() const override
void on_activate(bContext &C) override
bool set_collapsed(const bool collapsed) 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
#define ID_IS_LINKED(_id)
void * MEM_callocN(size_t len, const char *str)
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)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
GreasePencilLayerTreeGroup * root_group_ptr
const DropLocation drop_location
uiLayout & row(bool align)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)
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_)