101 lines
4.0 KiB
Python
101 lines
4.0 KiB
Python
from PyQt6.QtWidgets import (QWidget, QVBoxLayout, QListWidget, QListWidgetItem,
|
|
QLabel, QHBoxLayout, QFrame, QPushButton, QStyle)
|
|
from PyQt6.QtCore import Qt, pyqtSignal
|
|
from PyQt6.QtGui import QIcon, QColor, QFont
|
|
|
|
class InterfaceListWidget(QWidget):
|
|
interface_selected = pyqtSignal(dict)
|
|
|
|
def __init__(self, network_manager):
|
|
super().__init__()
|
|
self.nm = network_manager
|
|
self.layout = QVBoxLayout(self)
|
|
|
|
# Header
|
|
header_layout = QHBoxLayout()
|
|
title = QLabel("Network Interfaces")
|
|
title.setFont(QFont("Segoe UI", 16, QFont.Weight.Bold))
|
|
header_layout.addWidget(title)
|
|
header_layout.addStretch()
|
|
|
|
# Refresh Button
|
|
self.refresh_btn = QPushButton()
|
|
self.refresh_btn.setIcon(self.style().standardIcon(QStyle.StandardPixmap.SP_BrowserReload))
|
|
self.refresh_btn.setToolTip("Refresh Interfaces")
|
|
self.refresh_btn.setFixedSize(30, 30)
|
|
self.refresh_btn.clicked.connect(self.refresh_interfaces)
|
|
header_layout.addWidget(self.refresh_btn)
|
|
|
|
self.layout.addLayout(header_layout)
|
|
|
|
# List
|
|
self.list_widget = QListWidget()
|
|
self.list_widget.itemClicked.connect(self.on_item_clicked)
|
|
self.layout.addWidget(self.list_widget)
|
|
|
|
self.refresh_interfaces()
|
|
|
|
def refresh_interfaces(self):
|
|
self.list_widget.clear()
|
|
interfaces = self.nm.list_interfaces()
|
|
|
|
for iface in interfaces:
|
|
item = QListWidgetItem()
|
|
|
|
# Create custom widget for the item
|
|
item_widget = QWidget()
|
|
item_layout = QVBoxLayout(item_widget)
|
|
item_layout.setContentsMargins(5, 5, 5, 5)
|
|
|
|
# Top row: Name + Type + Status
|
|
top_row = QHBoxLayout()
|
|
name_label = QLabel(iface['name'])
|
|
name_label.setFont(QFont("Segoe UI", 12, QFont.Weight.Bold))
|
|
|
|
type_label = QLabel(iface['type'])
|
|
type_label.setStyleSheet("color: #aaaaaa; font-size: 10px;")
|
|
|
|
status_color = "#4caf50" if iface['is_up'] else "#f44336"
|
|
status_label = QLabel("● " + iface['status'])
|
|
status_label.setStyleSheet(f"color: {status_color}; font-weight: bold;")
|
|
|
|
# Config Method Badge (DHCP/Static)
|
|
config_method = iface.get('config', {}).get('method', 'unknown')
|
|
method_text = "DHCP" if config_method == 'auto' else "Static" if config_method == 'manual' else config_method.upper()
|
|
method_label = QLabel(f"[{method_text}]")
|
|
method_label.setStyleSheet("color: #e0e0e0; font-size: 10px; background-color: #3e3e3e; padding: 2px 4px; border-radius: 3px;")
|
|
|
|
top_row.addWidget(name_label)
|
|
top_row.addWidget(type_label)
|
|
top_row.addWidget(method_label)
|
|
top_row.addStretch()
|
|
top_row.addWidget(status_label)
|
|
|
|
# Bottom row: IP + MAC
|
|
bottom_row = QHBoxLayout()
|
|
|
|
ip_text = iface['ipv4'][0] if iface['ipv4'] else "No IP"
|
|
ip_label = QLabel(f"IP: {ip_text}")
|
|
ip_label.setStyleSheet("color: #0078d7;")
|
|
|
|
mac_label = QLabel(f"MAC: {iface['mac']}")
|
|
mac_label.setStyleSheet("color: #888888;")
|
|
|
|
bottom_row.addWidget(ip_label)
|
|
bottom_row.addStretch()
|
|
bottom_row.addWidget(mac_label)
|
|
|
|
item_layout.addLayout(top_row)
|
|
item_layout.addLayout(bottom_row)
|
|
|
|
item.setSizeHint(item_widget.sizeHint())
|
|
self.list_widget.addItem(item)
|
|
self.list_widget.setItemWidget(item, item_widget)
|
|
|
|
# Store data in item
|
|
item.setData(Qt.ItemDataRole.UserRole, iface)
|
|
|
|
def on_item_clicked(self, item):
|
|
iface_data = item.data(Qt.ItemDataRole.UserRole)
|
|
self.interface_selected.emit(iface_data)
|