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