56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
|
|
"""
|
||
|
|
Packet Decoder Widget - 3-panel packet inspection interface
|
||
|
|
"""
|
||
|
|
|
||
|
|
from textual.widgets import Static, DataTable, Tree
|
||
|
|
from textual.containers import Horizontal, Vertical
|
||
|
|
from typing import TYPE_CHECKING
|
||
|
|
|
||
|
|
if TYPE_CHECKING:
|
||
|
|
from ....analysis.core import EthernetAnalyzer
|
||
|
|
|
||
|
|
|
||
|
|
class PacketDecoderWidget(Horizontal):
|
||
|
|
"""
|
||
|
|
3-Panel Packet Decoder Interface
|
||
|
|
|
||
|
|
Layout:
|
||
|
|
- Left: Flow summary tree
|
||
|
|
- Center: Packet list table
|
||
|
|
- Right: Field details tree
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self, analyzer: 'EthernetAnalyzer', **kwargs):
|
||
|
|
super().__init__(**kwargs)
|
||
|
|
self.analyzer = analyzer
|
||
|
|
|
||
|
|
def compose(self):
|
||
|
|
"""Create the 3-panel layout"""
|
||
|
|
|
||
|
|
# Left panel: Flow summary
|
||
|
|
with Vertical(id="flow-summary-panel"):
|
||
|
|
yield Static("Flow Summary", id="flow-summary-title")
|
||
|
|
flow_tree = Tree("Flows", id="flow-tree")
|
||
|
|
yield flow_tree
|
||
|
|
|
||
|
|
# Center panel: Packet list
|
||
|
|
with Vertical(id="packet-list-panel"):
|
||
|
|
yield Static("Packet Details", id="packet-list-title")
|
||
|
|
packet_table = DataTable(id="packet-table")
|
||
|
|
packet_table.add_columns("Time", "Src", "Dst", "Protocol", "Info")
|
||
|
|
yield packet_table
|
||
|
|
|
||
|
|
# Right panel: Field details
|
||
|
|
with Vertical(id="field-details-panel"):
|
||
|
|
yield Static("Field Analysis", id="field-details-title")
|
||
|
|
field_tree = Tree("Fields", id="field-tree")
|
||
|
|
yield field_tree
|
||
|
|
|
||
|
|
def on_mount(self) -> None:
|
||
|
|
"""Initialize the widget"""
|
||
|
|
self.refresh_data()
|
||
|
|
|
||
|
|
def refresh_data(self) -> None:
|
||
|
|
"""Refresh packet decoder data"""
|
||
|
|
# TODO: Implement packet data refresh
|
||
|
|
pass
|