23#include "RNA_prototypes.hh"
31#include <fmt/format.h>
35using namespace blender::bke::greasepencil;
64 if (active_drag_node->
node->wrap().is_layer()) {
69 if (drop_tree_node_.is_child_of(group)) {
83 const StringRef drop_name = drop_tree_node_.name();
89 fmt::runtime(
TIP_(
"Move {} {} into {}")), node_type, drag_name, drop_name);
92 fmt::runtime(
TIP_(
"Move {} {} above {}")), node_type, drag_name, drop_name);
95 fmt::runtime(
TIP_(
"Move {} {} below {}")), node_type, drag_name, drop_name);
111 if (!drop_tree_node_.parent_group()) {
118 if (&drop_tree_node_ == &drag_node) {
125 "Inserting should not be possible for layers, only for groups, because "
126 "only groups use DropBehavior::Reorder_and_Insert");
127 LayerGroup &drop_group = drop_tree_node_.as_group();
128 grease_pencil.move_node_into(drag_node, drop_group);
133 grease_pencil.move_node_after(drag_node, drop_tree_node_);
138 grease_pencil.move_node_before(drag_node, drop_tree_node_);
157 GreasePencilv3LayerGroup,
180 grease_pencil_(grease_pencil),
181 dragged_node_(node.
wrap())
187 if (dragged_node_.wrap().is_layer()) {
196 drag_data->
node = &dragged_node_;
203 grease_pencil_.set_active_node(&dragged_node_);
210 : grease_pencil_(grease_pencil), layer_(layer)
212 this->
label_ = layer.name();
217 build_layer_name(row);
222 build_layer_buttons(*sub);
234 if (this->grease_pencil_.has_active_layer()) {
244 &grease_pencil_.id, &RNA_GreasePencilv3Layers,
nullptr);
246 &grease_pencil_.id, &RNA_GreasePencilLayer, &layer_);
250 if (grease_pencil_.has_active_group()) {
254 GreasePencilv3LayerGroup,
272 &grease_pencil_.id, &RNA_GreasePencilLayer, &layer_);
284 return layer_.name();
289 grease_pencil_.remove_layer(layer_);
297 return std::make_unique<LayerViewItemDragController>(
310 void build_layer_name(
uiLayout &row)
313 &row, layer_.name().c_str(), ICON_OUTLINER_DATA_GP_LAYER,
false,
false);
318 else if (!layer_.is_editable()) {
323 void build_layer_buttons(
uiLayout &row)
327 &grease_pencil_.
id, &RNA_GreasePencilLayer, &layer_);
329 sub = &row.
row(
true);
333 sub = &row.
row(
true);
337 sub = &row.
row(
true);
341 sub = &row.
row(
true);
350 : grease_pencil_(grease_pencil), group_(group)
352 this->
label_ = group_.name();
366 group_.set_expanded(!collapsed);
377 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
386 build_layer_group_name(row);
391 build_layer_group_buttons(*sub);
396 if (this->grease_pencil_.has_active_group()) {
397 return &group_ == this->grease_pencil_.get_active_group();
414 &grease_pencil_.id, &RNA_GreasePencilv3LayerGroup,
nullptr);
416 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
420 if (grease_pencil_.has_active_layer()) {
424 GreasePencilv3Layers,
442 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
454 return group_.name();
459 grease_pencil_.remove_group(group_);
467 return std::make_unique<LayerViewItemDragController>(
473 return std::make_unique<LayerNodeDropTarget>(
481 void build_layer_group_name(
uiLayout &row)
483 short icon = ICON_GREASEPENCIL_LAYER_GROUP;
485 icon = ICON_LAYERGROUP_COLOR_01 + group_.
color_tag;
492 else if (!group_.is_editable()) {
497 void build_layer_group_buttons(uiLayout &row)
501 &grease_pencil_.id, &RNA_GreasePencilLayerGroup, &group_);
503 sub = &row.
row(
true);
504 if (group_.as_node().parent_group()) {
505 sub->
active_set(group_.as_node().parent_group()->use_masks());
509 sub = &row.
row(
true);
510 if (group_.as_node().parent_group()) {
511 sub->
active_set(group_.as_node().parent_group()->use_onion_skinning());
515 sub = &row.
row(
true);
516 if (group_.as_node().parent_group()) {
517 sub->
active_set(group_.as_node().parent_group()->is_visible());
521 sub = &row.
row(
true);
522 if (group_.as_node().parent_group()) {
523 sub->
active_set(!group_.as_node().parent_group()->is_locked());
531 using namespace blender::bke::greasepencil;
533 parent.add_tree_item<LayerViewItem>(this->grease_pencil_, node.
as_layer());
536 LayerGroupViewItem &group_item = parent.add_tree_item<LayerGroupViewItem>(this->grease_pencil_,
539 build_tree_node_recursive(group_item, node_->wrap());
550 this->build_tree_node_recursive(*
this, node->wrap());
562 if (grease_pencil ==
nullptr) {
570 "Grease Pencil Layer Tree View",
571 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)
#define ID_IS_LINKED(_id)
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 UI_menutype_draw(bContext *C, MenuType *mt, uiLayout *layout)
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, bool add_box=true)
friend class AbstractTreeViewItem
friend class AbstractTreeView
TreeViewItemDropTarget(AbstractTreeViewItem &view_item, DropBehavior behavior=DropBehavior::Insert)
StringRef get_rename_string() const override
void delete_item(bContext *C) 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
std::optional< eWM_DragDataType > get_drag_type() const override
LayerViewItemDragController(LayerTreeView &tree_view, GreasePencil &grease_pencil, GreasePencilLayerTreeNode &node)
void * create_drag_data() const override
void on_drag_start(bContext &) override
void delete_item(bContext *C) 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
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
void use_property_decorate_set(bool is_sep)
void active_set(bool active)
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_)