Commit: d973362bd8eefcde4c4e2c529aca4b4bc5c1c7c5
Author: Mateusz Grzeliński
Date:   Sun Aug 16 17:09:51 2020 +0200
Branches: soc-2020-info-editor
https://developer.blender.org/rBd973362bd8eefcde4c4e2c529aca4b4bc5c1c7c5

Info editor: add context menu operators for adding filters

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

M       release/scripts/startup/bl_ui/space_info.py
M       source/blender/editors/space_info/info_clog.c
M       source/blender/editors/space_info/info_intern.h
M       source/blender/editors/space_info/info_ops.c
M       source/blender/editors/space_info/space_info.c

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

diff --git a/release/scripts/startup/bl_ui/space_info.py 
b/release/scripts/startup/bl_ui/space_info.py
index a433d558adc..b24ef9b65c9 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -164,6 +164,12 @@ class INFO_MT_context_menu(Menu):
             layout.operator("info.clog_copy", text="Copy Path").method = 
'COPY_PATH'
             layout.operator("info.clog_copy", text="Copy Basename").method = 
'COPY_BASENAME'
             layout.operator("info.clog_delete", text="Delete (mockup)")
+            layout.separator()
+            layout.operator("info.clog_filter", text="Mute Selected 
Files").method = 'FILTER_FILE'
+            layout.operator("info.clog_filter", text="Mute Selected 
Lines").method = 'FILTER_LINE'
+            layout.operator("info.clog_filter", text="Mute Selected 
Functions").method = 'FILTER_FUNCTION'
+            layout.operator("info.clog_filter", text="Mute Selected 
Loggers").method = 'FILTER_LOG_TYPE'
+
 
 
 class INFO_PT_log_formatting(Panel):
diff --git a/source/blender/editors/space_info/info_clog.c 
b/source/blender/editors/space_info/info_clog.c
index ac275238f90..28769285c5a 100644
--- a/source/blender/editors/space_info/info_clog.c
+++ b/source/blender/editors/space_info/info_clog.c
@@ -30,6 +30,7 @@
 #include "BLI_utildefines.h"
 
 #include "BKE_context.h"
+#include "BKE_report.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -456,18 +457,18 @@ void INFO_OT_clog_delete(wmOperatorType *ot)
   /* properties */
 }
 
-typedef enum ClogCopy {
+typedef enum eClogCopy {
   CLOG_COPY_VISBLE = 0,
   CLOG_COPY_MESSAGE,
   CLOG_COPY_FILE_LINE,
   CLOG_COPY_FILE_LINE_SHORT,
-} ClogCopy;
+} eClogCopy;
 
 static int clog_copy_exec(bContext *C, wmOperator *op)
 {
   SpaceInfo *sinfo = CTX_wm_space_info(C);
   CLG_LogRecordList *records = CLG_log_records_get();
-  ClogCopy copy_type = RNA_enum_get(op->ptr, "method");
+  eClogCopy copy_type = RNA_enum_get(op->ptr, "method");
   CLG_LogRecord *record;
 
   DynStr *buf_dyn = BLI_dynstr_new();
@@ -539,3 +540,157 @@ void INFO_OT_clog_copy(wmOperatorType *ot)
   prop = RNA_def_enum(ot->srna, "method", clog_copy_items, CLOG_COPY_VISBLE, 
"Method", "");
   RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
+
+typedef enum eClogFilterMode {
+  CLOG_FILTER_FUNCTION = 0,
+  CLOG_FILTER_FILE,
+  CLOG_FILTER_LINE,
+  CLOG_FILTER_LOG_TYPE,
+} eClogFilterMode;
+
+static struct SpaceInfoFilter *is_filter_duplicate(const ListBase *list,
+                                                   const SpaceInfoFilter 
*filter)
+{
+  LISTBASE_FOREACH (SpaceInfoFilter *, filter_iter, list) {
+    if (info_match_string_filter(filter_iter->search_string,
+                                 filter->search_string,
+                                 filter_iter->flag & 
INFO_FILTER_USE_MATCH_CASE,
+                                 filter_iter->flag & INFO_FILTER_USE_GLOB,
+                                 false)) {
+      return filter_iter;
+    }
+  }
+  return NULL;
+}
+
+static int clog_filter_exec(bContext *C, wmOperator *op)
+{
+  SpaceInfo *sinfo = CTX_wm_space_info(C);
+  CLG_LogRecordList *records = CLG_log_records_get();
+  eClogFilterMode filter_type = RNA_enum_get(op->ptr, "method");
+
+  CLG_LogRecord *record;
+
+  for (record = records->first; record; record = record->next) {
+    if (is_clog_record_visible(record, sinfo) && (record->flag & CLG_SELECT)) {
+      SpaceInfoFilter *filter = MEM_callocN(sizeof(*filter), __func__);
+      filter->flag = INFO_FILTER_USE_MATCH_CASE | 
INFO_FILTER_USE_MATCH_REVERSE;
+      switch (filter_type) {
+        case CLOG_FILTER_FILE: {
+          const char *basename = BLI_path_basename(record->file_line);
+          int file_name_len = strlen(basename);
+          /* remove line number */
+          BLI_assert(strstr(basename, ":") != NULL);
+          while (basename[file_name_len - 1] != ':') {
+            file_name_len -= 1;
+          }
+          BLI_strncpy(filter->search_string, basename, file_name_len);
+          const SpaceInfoFilter *filter_dup = 
is_filter_duplicate(&sinfo->filter_log_file_line,
+                                                                  filter);
+          if (filter_dup == NULL) {
+            BLI_addtail(&sinfo->filter_log_file_line, filter);
+          }
+          else {
+            BKE_reportf(op->reports,
+                        RPT_INFO,
+                        "File filter: %s is duplicate of filter: %s",
+                        filter->search_string,
+                        filter_dup->search_string);
+            MEM_freeN(filter);
+          }
+          sinfo->use_log_filter |= INFO_FILTER_CLOG_FILE_LINE;
+          break;
+        }
+        case CLOG_FILTER_LINE: {
+          STRNCPY(filter->search_string, BLI_path_basename(record->file_line));
+          const SpaceInfoFilter *filter_dup = 
is_filter_duplicate(&sinfo->filter_log_file_line,
+                                                                  filter);
+          if (filter_dup == NULL) {
+            BLI_addtail(&sinfo->filter_log_file_line, filter);
+          }
+          else {
+            BKE_reportf(op->reports,
+                        RPT_INFO,
+                        "Line filter: %s is duplicate of filter: %s",
+                        filter->search_string,
+                        filter_dup->search_string);
+            MEM_freeN(filter);
+          }
+          sinfo->use_log_filter |= INFO_FILTER_CLOG_FILE_LINE;
+          break;
+        }
+        case CLOG_FILTER_FUNCTION: {
+          STRNCPY(filter->search_string, record->function);
+          const SpaceInfoFilter *filter_dup = 
is_filter_duplicate(&sinfo->filter_log_function,
+                                                                  filter);
+          if (filter_dup == NULL) {
+            BLI_addtail(&sinfo->filter_log_function, filter);
+          }
+          else {
+            BKE_reportf(op->reports,
+                        RPT_INFO,
+                        "Function filter: %s is duplicate of filter: %s",
+                        filter->search_string,
+                        filter_dup->search_string);
+            MEM_freeN(filter);
+          }
+          sinfo->use_log_filter |= INFO_FILTER_CLOG_FUNCTION;
+          break;
+        }
+        case CLOG_FILTER_LOG_TYPE: {
+          STRNCPY(filter->search_string, record->type->identifier);
+          const SpaceInfoFilter *filter_dup = 
is_filter_duplicate(&sinfo->filter_log_type, filter);
+          if (filter_dup == NULL) {
+            BLI_addtail(&sinfo->filter_log_type, filter);
+          }
+          else {
+            BKE_reportf(op->reports,
+                        RPT_INFO,
+                        "Function filter: %s is duplicate of filter: %s",
+                        filter->search_string,
+                        filter_dup->search_string);
+            MEM_freeN(filter);
+          }
+          sinfo->use_log_filter |= INFO_FILTER_CLOG_TYPE;
+          break;
+        }
+        default:
+          BLI_assert(0);
+      }
+    }
+  }
+
+  info_area_tag_redraw(C);
+
+  return OPERATOR_FINISHED;
+}
+
+void INFO_OT_clog_filter(wmOperatorType *ot)
+{
+  /* identifiers */
+  ot->name = "Add Log Filter";
+  ot->description =
+      "Add and enable log filter based on selected logs. Will not add filter 
if log is already "
+      "muted by another filter.";
+  ot->idname = "INFO_OT_clog_filter";
+
+  /* api callbacks */
+  ot->poll = ED_operator_info_clog_active;
+  ot->exec = clog_filter_exec;
+
+  /* flags */
+  /*ot->flag = OPTYPE_REGISTER;*/
+
+  /* properties */
+  static const EnumPropertyItem clog_filter_items[] = {
+      {CLOG_FILTER_FUNCTION, "FILTER_FUNCTION", 0, "", ""},
+      {CLOG_FILTER_FILE, "FILTER_FILE", 0, "", ""},
+      {CLOG_FILTER_LINE, "FILTER_LINE", 0, "", ""},
+      {CLOG_FILTER_LOG_TYPE, "FILTER_LOG_TYPE", 0, "", ""},
+      {0, NULL, 0, NULL, NULL},
+  };
+
+  PropertyRNA *prop;
+  prop = RNA_def_enum(ot->srna, "method", clog_filter_items, CLOG_FILTER_FILE, 
"Method", "");
+  RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+}
diff --git a/source/blender/editors/space_info/info_intern.h 
b/source/blender/editors/space_info/info_intern.h
index bd33ea3dee2..11622ddc21a 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -88,6 +88,7 @@ void INFO_OT_clog_select_box(struct wmOperatorType *ot);
 
 void INFO_OT_clog_delete(struct wmOperatorType *ot);
 void INFO_OT_clog_copy(struct wmOperatorType *ot);
+void INFO_OT_clog_filter(struct wmOperatorType *ot);
 
 /* info_draw_report.c */
 enum eTextViewContext_LineDrawFlag report_line_draw_data(struct 
TextViewContext *tvc,
diff --git a/source/blender/editors/space_info/info_ops.c 
b/source/blender/editors/space_info/info_ops.c
index 615b4696ccb..3cae6a77bc8 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -659,7 +659,7 @@ void INFO_OT_log_file_line_filter_add(wmOperatorType *ot)
   ot->flag = OPTYPE_INTERNAL;
 
   /* properties */
-  RNA_def_string(ot->srna, "filter", NULL, 255, "Filter", "a");
+  RNA_def_string(ot->srna, "filter", NULL, 255, "Filter", "");
 }
 
 static int log_file_line_filter_remove_exec(bContext *C, wmOperator *op)
diff --git a/source/blender/editors/space_info/space_info.c 
b/source/blender/editors/space_info/space_info.c
index b9e65458fc6..834bf23b75b 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -224,6 +224,7 @@ static void info_operatortypes(void)
 
   WM_operatortype_append(INFO_OT_clog_delete);
   WM_operatortype_append(INFO_OT_clog_copy);
+  WM_operatortype_append(INFO_OT_clog_filter);
 }
 
 static void info_keymap(struct wmKeyConfig *keyconf)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to