99 QCheckBox ,
1010 QTreeWidget ,
1111 QTreeWidgetItem ,
12+ QHeaderView ,
1213)
1314from models .sysmon_config import RuleFilter , SysmonConfig
1415from 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