[Bf-blender-cvs] [d37fa40a12a] temp-asset-browser-catalogs-ui: Support active item in the tree view

Julian Eisel noreply at git.blender.org
Wed Sep 15 19:05:32 CEST 2021


Commit: d37fa40a12a5ef265652490dbf8465052b8ed082
Author: Julian Eisel
Date:   Wed Sep 15 19:02:45 2021 +0200
Branches: temp-asset-browser-catalogs-ui
https://developer.blender.org/rBd37fa40a12a5ef265652490dbf8465052b8ed082

Support active item in the tree view

Tree view items can now be activated, there is only ever one active
item.

Exact behavior for collapsing vs. activating on click may need some
experimentation. For now I've implemented something that makes sense for
asset catalogs (I think :) ).

===================================================================

M	source/blender/editors/include/UI_interface.h
M	source/blender/editors/include/UI_tree_view.hh
M	source/blender/editors/interface/interface.c
M	source/blender/editors/interface/tree_view.cc

===================================================================

diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 2b8667aaca1..ba188a49074 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -2749,6 +2749,8 @@ void UI_interface_tag_script_reload(void);
 /* Support click-drag motion which presses the button and closes a popover (like a menu). */
 #define USE_UI_POPOVER_ONCE
 
+bool UI_tree_view_item_is_active(uiTreeViewItemHandle *item_);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/editors/include/UI_tree_view.hh b/source/blender/editors/include/UI_tree_view.hh
index 4b1b0057736..703d8d1ab49 100644
--- a/source/blender/editors/include/UI_tree_view.hh
+++ b/source/blender/editors/include/UI_tree_view.hh
@@ -169,6 +169,7 @@ class uiAbstractTreeViewItem : public uiTreeViewItemContainer {
   friend class uiAbstractTreeView;
 
   bool is_open_ = false;
+  bool is_active_ = false;
 
  protected:
   /** This label is used for identifying an item (together with its parents labels). */
@@ -184,7 +185,10 @@ class uiAbstractTreeViewItem : public uiTreeViewItemContainer {
    * this and make update their state accordingly. */
   virtual void update_from_old(uiAbstractTreeViewItem &old);
 
+  const uiAbstractTreeView &get_tree_view() const;
   int count_parents() const;
+  void set_active(bool value = true);
+  bool is_active() const;
   void toggle_collapsed();
   bool is_collapsed() const;
   void set_collapsed(bool collapsed);
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index e3c7b606ee4..beee622673c 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -2214,6 +2214,15 @@ int ui_but_is_pushed_ex(uiBut *but, double *value)
           }
         }
         break;
+      case UI_BTYPE_TREEROW: {
+        uiButTreeRow *tree_row_but = (uiButTreeRow *)but;
+
+        is_push = -1;
+        if (tree_row_but->tree_item) {
+          is_push = UI_tree_view_item_is_active(tree_row_but->tree_item);
+        }
+        break;
+      }
       default:
         is_push = -1;
         break;
diff --git a/source/blender/editors/interface/tree_view.cc b/source/blender/editors/interface/tree_view.cc
index b0c4a35df08..e25c3293be8 100644
--- a/source/blender/editors/interface/tree_view.cc
+++ b/source/blender/editors/interface/tree_view.cc
@@ -137,6 +137,12 @@ uiAbstractTreeViewItem *uiAbstractTreeView::find_matching_child(
 void uiAbstractTreeViewItem::update_from_old(uiAbstractTreeViewItem &old)
 {
   is_open_ = old.is_open_;
+  is_active_ = old.is_active_;
+}
+
+const uiAbstractTreeView &uiAbstractTreeViewItem::get_tree_view() const
+{
+  return static_cast<uiAbstractTreeView &>(*root_);
 }
 
 int uiAbstractTreeViewItem::count_parents() const
@@ -148,6 +154,20 @@ int uiAbstractTreeViewItem::count_parents() const
   return i;
 }
 
+void uiAbstractTreeViewItem::set_active(bool value)
+{
+  if (value) {
+    /* Deactivate other items in the tree. */
+    get_tree_view().foreach_item([](auto &item) { item.set_active(false); });
+  }
+  is_active_ = value;
+}
+
+bool uiAbstractTreeViewItem::is_active() const
+{
+  return is_active_;
+}
+
 bool uiAbstractTreeViewItem::is_collapsed() const
 {
   return is_collapsible() && !is_open_;
@@ -214,13 +234,18 @@ uiBasicTreeViewItem::uiBasicTreeViewItem(StringRef label, BIFIconID icon_) : ico
   label_ = label;
 }
 
-static void but_collapsed_toggle_fn(struct bContext *UNUSED(C), void *but_arg1, void *UNUSED(arg2))
+static void tree_row_click_fn(struct bContext *UNUSED(C), void *but_arg1, void *UNUSED(arg2))
 {
   uiButTreeRow *tree_row_but = (uiButTreeRow *)but_arg1;
   uiAbstractTreeViewItem &tree_item = reinterpret_cast<uiAbstractTreeViewItem &>(
       *tree_row_but->tree_item);
 
-  tree_item.toggle_collapsed();
+  /* Let a click on an opened item activate it, a second click will close it then.
+   * TODO Should this be for asset catalogs only? */
+  if (tree_item.is_collapsed() || tree_item.is_active()) {
+    tree_item.toggle_collapsed();
+  }
+  tree_item.set_active();
 }
 
 void uiBasicTreeViewItem::build_row(uiLayout &row)
@@ -244,7 +269,7 @@ void uiBasicTreeViewItem::build_row(uiLayout &row)
                                                    nullptr);
 
   tree_row_but_->tree_item = reinterpret_cast<uiTreeViewItemHandle *>(this);
-  UI_but_func_set(&tree_row_but_->but, but_collapsed_toggle_fn, tree_row_but_, nullptr);
+  UI_but_func_set(&tree_row_but_->but, tree_row_click_fn, tree_row_but_, nullptr);
   UI_but_treerow_indentation_set(&tree_row_but_->but, count_parents());
 }
 
@@ -267,3 +292,11 @@ uiBut *uiBasicTreeViewItem::button()
 }
 
 }  // namespace blender::ui
+
+using namespace blender::ui;
+
+bool UI_tree_view_item_is_active(uiTreeViewItemHandle *item_)
+{
+  uiAbstractTreeViewItem &item = reinterpret_cast<uiAbstractTreeViewItem &>(*item_);
+  return item.is_active();
+}



More information about the Bf-blender-cvs mailing list