[Bf-blender-cvs] [c0bbf1553f6] master: Cleanup: move search templates into their own files

Campbell Barton noreply at git.blender.org
Wed May 6 08:01:44 CEST 2020


Commit: c0bbf1553f680dbcc67022d1e8b1d16dc2f3a5eb
Author: Campbell Barton
Date:   Wed May 6 15:51:23 2020 +1000
Branches: master
https://developer.blender.org/rBc0bbf1553f680dbcc67022d1e8b1d16dc2f3a5eb

Cleanup: move search templates into their own files

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

M	source/blender/editors/interface/CMakeLists.txt
M	source/blender/editors/interface/interface_intern.h
A	source/blender/editors/interface/interface_template_search_menu.c
A	source/blender/editors/interface/interface_template_search_operator.c
M	source/blender/editors/interface/interface_templates.c
M	source/blender/editors/interface/interface_utils.c

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

diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index d33023c69a1..8e93fc2e379 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -69,6 +69,8 @@ set(SRC
   interface_regions.c
   interface_style.c
   interface_templates.c
+  interface_template_search_menu.c
+  interface_template_search_operator.c
   interface_utils.c
   interface_widgets.c
   resources.c
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index c2417c86086..c97af78e967 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -1011,6 +1011,7 @@ void UI_OT_eyedropper_driver(struct wmOperatorType *ot);
 void UI_OT_eyedropper_gpencil_color(struct wmOperatorType *ot);
 
 /* interface_util.c */
+bool ui_str_has_word_prefix(const char *haystack, const char *needle, size_t needle_len);
 
 /**
  * For use with #ui_rna_collection_search_cb.
diff --git a/source/blender/editors/interface/interface_template_search_menu.c b/source/blender/editors/interface/interface_template_search_menu.c
new file mode 100644
index 00000000000..3d07da083e8
--- /dev/null
+++ b/source/blender/editors/interface/interface_template_search_menu.c
@@ -0,0 +1,761 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+/** \file
+ * \ingroup edinterface
+ */
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_gpencil_modifier_types.h"
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_shader_fx_types.h"
+#include "DNA_texture_types.h"
+
+#include "BLI_alloca.h"
+#include "BLI_dynstr.h"
+#include "BLI_ghash.h"
+#include "BLI_linklist.h"
+#include "BLI_listbase.h"
+#include "BLI_memarena.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "BLT_translation.h"
+
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_screen.h"
+
+#include "ED_screen.h"
+
+#include "RNA_access.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "interface_intern.h"
+
+/* For key-map item access. */
+#include "wm_event_system.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Menu Search Template Implementation
+ * \{ */
+
+/* Unicode arrow. */
+#define MENU_SEP "\xe2\x96\xb6"
+
+struct MenuSearch_Parent {
+  struct MenuSearch_Parent *parent;
+  MenuType *parent_mt;
+  /* Set while writing menu items only. */
+  struct MenuSearch_Parent *temp_child;
+  const char *drawstr;
+};
+
+struct MenuSearch_Item {
+  struct MenuSearch_Item *next, *prev;
+  const char *drawstr;
+  const char *drawwstr_full;
+  /** Support a single level sub-menu nesting (for operator buttons that expand). */
+  const char *drawstr_submenu;
+  int icon;
+  int state;
+
+  struct MenuSearch_Parent *menu_parent;
+  MenuType *mt;
+
+  enum {
+    MENU_SEARCH_TYPE_OP = 1,
+    MENU_SEARCH_TYPE_RNA = 2,
+  } type;
+
+  union {
+    /* Operator menu item. */
+    struct {
+      wmOperatorType *type;
+      PointerRNA *opptr;
+      short opcontext;
+      bContextStore *context;
+    } op;
+
+    /* Property (only for check-boxe/boolean). */
+    struct {
+      PointerRNA ptr;
+      PropertyRNA *prop;
+      int index;
+      /** Only for enum buttons. */
+      int enum_value;
+    } rna;
+  };
+};
+
+struct MenuSearch_Data {
+  /** MenuSearch_Item */
+  ListBase items;
+  /** Use for all small allocations. */
+  MemArena *memarena;
+};
+
+static int menu_item_sort_by_drawstr_full(const void *menu_item_a_v, const void *menu_item_b_v)
+{
+  const struct MenuSearch_Item *menu_item_a = menu_item_a_v;
+  const struct MenuSearch_Item *menu_item_b = menu_item_b_v;
+  return strcmp(menu_item_a->drawwstr_full, menu_item_b->drawwstr_full);
+}
+
+static const char *strdup_memarena(MemArena *memarena, const char *str)
+{
+  const uint str_size = strlen(str) + 1;
+  char *str_dst = BLI_memarena_alloc(memarena, str_size);
+  memcpy(str_dst, str, str_size);
+  return str_dst;
+}
+
+static const char *strdup_memarena_from_dynstr(MemArena *memarena, DynStr *dyn_str)
+{
+  const uint str_size = BLI_dynstr_get_len(dyn_str) + 1;
+  char *str_dst = BLI_memarena_alloc(memarena, str_size);
+  BLI_dynstr_get_cstring_ex(dyn_str, str_dst);
+  return str_dst;
+}
+
+static bool menu_items_from_ui_create_item_from_button(struct MenuSearch_Data *data,
+                                                       MemArena *memarena,
+                                                       struct MenuType *mt,
+                                                       const char *drawstr_submenu,
+                                                       uiBut *but)
+{
+  struct MenuSearch_Item *item = NULL;
+  if (but->optype != NULL) {
+    item = BLI_memarena_calloc(memarena, sizeof(*item));
+    item->type = MENU_SEARCH_TYPE_OP;
+
+    item->op.type = but->optype;
+    item->op.opcontext = but->opcontext;
+    item->op.context = but->context;
+    item->op.opptr = but->opptr;
+    but->opptr = NULL;
+  }
+  else if (but->rnaprop != NULL) {
+    const int prop_type = RNA_property_type(but->rnaprop);
+    if (!ELEM(prop_type, PROP_BOOLEAN, PROP_ENUM)) {
+      /* Note that these buttons are not prevented,
+       * but aren't typically used in menus. */
+      printf("Button '%s' in menu '%s' is a menu item with unsupported RNA type %d\n",
+             but->drawstr,
+             mt->idname,
+             prop_type);
+    }
+    else {
+      item = BLI_memarena_calloc(memarena, sizeof(*item));
+      item->type = MENU_SEARCH_TYPE_RNA;
+
+      item->rna.ptr = but->rnapoin;
+      item->rna.prop = but->rnaprop;
+      item->rna.index = but->rnaindex;
+
+      if (prop_type == PROP_ENUM) {
+        item->rna.enum_value = (int)but->hardmax;
+      }
+    }
+  }
+
+  if (item != NULL) {
+    /* Handle shared settings. */
+    item->drawstr = strdup_memarena(memarena, but->drawstr);
+    item->icon = ui_but_icon(but);
+    item->state = (but->flag & (UI_BUT_DISABLED | UI_BUT_INACTIVE | UI_BUT_REDALERT));
+    item->mt = mt;
+    item->drawstr_submenu = drawstr_submenu ? strdup_memarena(memarena, drawstr_submenu) : NULL;
+    BLI_addtail(&data->items, item);
+    return true;
+  }
+
+  return false;
+}
+
+/**
+ * Populate \a menu_stack with menus from inspecting active key-maps for this context.
+ */
+static void menu_types_add_from_keymap_items(bContext *C,
+                                             wmWindow *win,
+                                             ScrArea *area,
+                                             ARegion *region,
+                                             LinkNode **menuid_stack_p,
+                                             GHash *menu_to_kmi,
+                                             GSet *menu_tagged)
+{
+  wmWindowManager *wm = CTX_wm_manager(C);
+  ListBase *handlers[] = {
+      region ? &region->handlers : NULL,
+      area ? &area->handlers : NULL,
+      &win->handlers,
+  };
+
+  for (int handler_index = 0; handler_index < ARRAY_SIZE(handlers); handler_index++) {
+    if (handlers[handler_index] == NULL) {
+      continue;
+    }
+    LISTBASE_FOREACH (wmEventHandler *, handler_base, handlers[handler_index]) {
+      /* During this loop, ui handlers for nested menus can tag multiple handlers free. */
+      if (handler_base->flag & WM_HANDLER_DO_FREE) {
+        continue;
+      }
+      if (handler_base->type != WM_HANDLER_TYPE_KEYMAP) {
+        continue;
+      }
+
+      else if (handler_base->poll == NULL || handler_base->poll(region, win->eventstate)) {
+        wmEventHandler_Keymap *handler = (wmEventHandler_Keymap *)handler_base;
+        wmKeyMap *keymap = WM_event_get_keymap_from_handler(wm, handler);
+        if (keymap && WM_keymap_poll(C, keymap)) {
+          LISTBASE_FOREACH (wmKeyMapItem *, kmi, &keymap->items) {
+            if (kmi->flag & KMI_INACTIVE) {
+              continue;
+            }
+            if (STR_ELEM(kmi->idname, "WM_OT_call_menu", "WM_OT_call_menu_pie")) {
+              char menu_idname[MAX_NAME];
+              RNA_string_get(kmi->ptr, "name", menu_idname);
+              MenuType *mt = WM_menutype_find(menu_idname, false);
+
+              if (mt && BLI_gset_add(menu_tagged, mt)) {
+                /* Unlikely, but possible this will be included twice. */
+                BLI_linklist_prepend(menuid_stack_p, mt);
+
+                void **kmi_p;
+                if (!BLI_ghash_ensure_p(menu_to_kmi, mt, &kmi_p)) {
+                  *kmi_p = kmi;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+static void menu_items_from_all_operators(bContext *C, struct MenuSearch_Data *data)
+{
+  /* Add to temporary list so we can sort them separately. */
+  ListBase operator_items = {NULL, NULL};
+
+  MemArena *memarena = data->memarena;
+  GHashIterator iter;
+  for (WM_operatortype_iter(&iter); !BLI_ghashIterator_done(&iter);
+       BLI_ghashIterator_step(&iter)) {
+    wmOperatorType *ot = BLI_ghashIterator_getValue(&iter);
+
+    if ((ot->flag & OPTYPE_INTERNAL) && (G.debug & G_DEBUG_WM) == 0) {
+      continue;
+    }
+
+    if (WM_operator_poll((bContext *)C, ot)) {
+      const char *ot_ui_name = CTX_IFACE_(ot->translation_context, ot->name);
+
+      struct MenuSearch_Item *item = NULL;
+      item = BLI_memarena_calloc(memarena, sizeof(*item));
+      item->type = 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list