Skip to content

Commit fc9c57b

Browse files
committed
add numbers for each include and exclude
1 parent fbb0eb0 commit fc9c57b

1 file changed

Lines changed: 35 additions & 4 deletions

File tree

gui/rule_editor.py

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
QCheckBox,
1010
QTreeWidget,
1111
QTreeWidgetItem,
12+
QHeaderView,
1213
)
1314
from models.sysmon_config import RuleFilter, SysmonConfig
1415
from PySide6.QtGui import QColor
@@ -53,9 +54,13 @@ def __init__(self, config: SysmonConfig) -> None:
5354
self.add_button = QPushButton("Add Rule")
5455
self.remove_button = QPushButton("Remove Selected Rule")
5556
self.new_rules_only_toggle = QCheckBox("Show New Rules Only")
57+
self.total_counts_label = QLabel("Include (0) Exclude (0)")
5658

5759
self.rule_tree = QTreeWidget()
60+
self.rule_tree.setColumnCount(2)
5861
self.rule_tree.setHeaderHidden(True)
62+
self.rule_tree.header().setSectionResizeMode(0, QHeaderView.ResizeMode.Stretch)
63+
self.rule_tree.header().setSectionResizeMode(1, QHeaderView.ResizeMode.ResizeToContents)
5964

6065
self.rule_row_1 = QHBoxLayout()
6166
self.rule_row_1.addWidget(self.rule_type)
@@ -77,6 +82,7 @@ def __init__(self, config: SysmonConfig) -> None:
7782
self.layout.addWidget(self.add_button)
7883
self.layout.addWidget(self.remove_button)
7984
self.layout.addWidget(self.new_rules_only_toggle)
85+
self.layout.addWidget(self.total_counts_label)
8086
self.layout.addWidget(self.rule_tree)
8187

8288
self.add_button.clicked.connect(self.add_rule)
@@ -171,6 +177,8 @@ def load_value_presets_for_field(self, field_name: str) -> None:
171177
def refresh_rules(self) -> None:
172178
self.rule_tree.clear()
173179
show_new_only = self.new_rules_only_toggle.isChecked()
180+
total_include = 0
181+
total_exclude = 0
174182

175183
for event_id, event_config in sorted(self.config.events.items()):
176184
if not event_config.rules:
@@ -184,7 +192,26 @@ def refresh_rules(self) -> None:
184192
if not visible_rule_indexes:
185193
continue
186194

187-
event_item = QTreeWidgetItem([f"{event_id} - {event_config.event_name}"])
195+
include_count = 0
196+
exclude_count = 0
197+
for rule_index in visible_rule_indexes:
198+
rule = event_config.rules[rule_index]
199+
if rule.rule_type == "include":
200+
include_count += 1
201+
elif rule.rule_type == "exclude":
202+
exclude_count += 1
203+
204+
total_include += include_count
205+
total_exclude += exclude_count
206+
207+
event_item = QTreeWidgetItem(
208+
[
209+
f"{event_id} - {event_config.event_name}",
210+
f"Include ({include_count}) Exclude ({exclude_count})",
211+
]
212+
)
213+
event_item.setTextAlignment(1, Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter)
214+
event_item.setForeground(1, QColor("#90ee90")) # light green counts
188215
self.rule_tree.addTopLevelItem(event_item)
189216

190217
grouped_parents: dict[str, QTreeWidgetItem] = {}
@@ -197,13 +224,13 @@ def refresh_rules(self) -> None:
197224
group_name = rule.group_name or "Imported Rule"
198225
group_relation = rule.group_relation or "or"
199226
grouped_parents[rule.group_id] = QTreeWidgetItem(
200-
[f"Rule: {group_name} ({group_relation})"]
227+
[f"Rule: {group_name} ({group_relation})", ""]
201228
)
202229
event_item.addChild(grouped_parents[rule.group_id])
203230
parent_item = grouped_parents[rule.group_id]
204231
else:
205232
if ungrouped_parent is None:
206-
ungrouped_parent = QTreeWidgetItem(["Ungrouped Rules"])
233+
ungrouped_parent = QTreeWidgetItem(["Ungrouped Rules", ""])
207234
event_item.addChild(ungrouped_parent)
208235
parent_item = ungrouped_parent
209236

@@ -214,7 +241,7 @@ def refresh_rules(self) -> None:
214241
f"{rule.condition} | "
215242
f"{rule.value}"
216243
)
217-
item = QTreeWidgetItem([rule_text])
244+
item = QTreeWidgetItem([rule_text, ""])
218245
item.setData(0, Qt.ItemDataRole.UserRole, (event_id, rule_index))
219246

220247
if not rule.imported:
@@ -225,6 +252,10 @@ def refresh_rules(self) -> None:
225252
event_item.setExpanded(True)
226253

227254
self.rule_tree.expandAll()
255+
self.total_counts_label.setText(
256+
f'Total Include <span style="color:#90ee90">({total_include})</span> '
257+
f'Total Exclude <span style="color:#90ee90">({total_exclude})</span>'
258+
)
228259

229260
def add_rule(self) -> None:
230261
if self.current_event_id is None:

0 commit comments

Comments
 (0)