fix(ui): backup supply indicator, font size, and system diagnostic highlight
- Fixed backup supply ON/OFF indicator display - Increased font size for better readability - Highlighted system diagnostic codes for improved visibilitymain
parent
ddb6c12ecd
commit
0012e5502c
|
|
@ -781,6 +781,10 @@ class MainWindow(QMainWindow):
|
||||||
int(8 * self.scale_factor), int(8 * self.scale_factor)
|
int(8 * self.scale_factor), int(8 * self.scale_factor)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# You correctly created the frame here
|
||||||
|
self.top_bar_frame = QFrame()
|
||||||
|
self.top_bar_frame.setObjectName("topBarFrame")
|
||||||
|
|
||||||
top_bar_layout = QHBoxLayout()
|
top_bar_layout = QHBoxLayout()
|
||||||
top_bar_layout.addWidget(QLabel("LAST RECV TS:"))
|
top_bar_layout.addWidget(QLabel("LAST RECV TS:"))
|
||||||
self.last_recv_ts_field = QLineEdit("No Data")
|
self.last_recv_ts_field = QLineEdit("No Data")
|
||||||
|
|
@ -788,24 +792,23 @@ class MainWindow(QMainWindow):
|
||||||
top_bar_layout.addWidget(self.last_recv_ts_field)
|
top_bar_layout.addWidget(self.last_recv_ts_field)
|
||||||
top_bar_layout.addSpacerItem(QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum))
|
top_bar_layout.addSpacerItem(QSpacerItem(20, 20, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum))
|
||||||
|
|
||||||
top_bar_layout.addWidget(QLabel("Backup Supply:"))
|
# top_bar_layout.addWidget(QLabel("Backup Supply:"))
|
||||||
self.backup_supply_indicator = QLabel("N/A")
|
self.backup_supply_indicator = QLabel("N/A")
|
||||||
self.backup_supply_indicator.setFixedSize(80, 25)
|
self.backup_supply_indicator.setFixedSize(80, 25)
|
||||||
self.backup_supply_indicator.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
self.backup_supply_indicator.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||||
self.backup_supply_indicator.setStyleSheet(
|
self.backup_supply_indicator.setStyleSheet(
|
||||||
"background-color: gray; color: white; border-radius: 5px; font-weight: bold;"
|
"""
|
||||||
|
QLabel {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 2px solid gray;
|
||||||
|
color: #E0E0E0;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
"""
|
||||||
)
|
)
|
||||||
top_bar_layout.addWidget(self.backup_supply_indicator)
|
top_bar_layout.addWidget(self.backup_supply_indicator)
|
||||||
|
|
||||||
# backup_label = QLabel("Backup Supply:")
|
|
||||||
# backup_label.setFont(QFont("Arial", 10, QFont.Weight.Bold))
|
|
||||||
# top_bar_layout.addWidget(backup_label)
|
|
||||||
|
|
||||||
# self.backup_supply_indicator = QLabel("🔴 OFF")
|
|
||||||
# self.backup_supply_indicator.setStyleSheet("color: white; font-weight: bold;")
|
|
||||||
# self.backup_supply_indicator.setFont(QFont("Segoe UI Emoji", 8, QFont.Weight.Bold))
|
|
||||||
# top_bar_layout.addWidget(self.backup_supply_indicator)
|
|
||||||
|
|
||||||
refresh_btn = QPushButton("⟳ Refresh")
|
refresh_btn = QPushButton("⟳ Refresh")
|
||||||
refresh_btn.setObjectName("RefreshButton")
|
refresh_btn.setObjectName("RefreshButton")
|
||||||
refresh_btn.clicked.connect(self.reset_dashboard_ui)
|
refresh_btn.clicked.connect(self.reset_dashboard_ui)
|
||||||
|
|
@ -877,7 +880,6 @@ class MainWindow(QMainWindow):
|
||||||
swap_layout.addLayout(swap_display_layout)
|
swap_layout.addLayout(swap_display_layout)
|
||||||
|
|
||||||
swap_grid = QGridLayout()
|
swap_grid = QGridLayout()
|
||||||
# swap_grid.setVerticalSpacing(max(0, int(4 * self.scale_factor)))
|
|
||||||
swap_grid.setSpacing(int(2 * self.scale_factor))
|
swap_grid.setSpacing(int(2 * self.scale_factor))
|
||||||
swap_grid.setContentsMargins(0, 0, 0, 0)
|
swap_grid.setContentsMargins(0, 0, 0, 0)
|
||||||
swap_grid.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
|
swap_grid.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize)
|
||||||
|
|
@ -896,14 +898,11 @@ class MainWindow(QMainWindow):
|
||||||
swap_grid.addWidget(btn, row, col, Qt.AlignmentFlag.AlignCenter)
|
swap_grid.addWidget(btn, row, col, Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
grid_container_layout = QHBoxLayout()
|
grid_container_layout = QHBoxLayout()
|
||||||
grid_container_layout.addStretch(1) # Add a stretchable "spring" on the left
|
grid_container_layout.addStretch(1)
|
||||||
grid_container_layout.addLayout(swap_grid) # Add the compact grid in the middle
|
grid_container_layout.addLayout(swap_grid)
|
||||||
grid_container_layout.addStretch(1) # Add a stretchable "spring" on the right
|
grid_container_layout.addStretch(1)
|
||||||
|
|
||||||
# Add the container (with the springs) to the main vertical layout
|
|
||||||
swap_layout.addLayout(grid_container_layout)
|
swap_layout.addLayout(grid_container_layout)
|
||||||
|
|
||||||
# swap_layout.addLayout(swap_grid, 0)
|
|
||||||
swap_layout.addStretch(1)
|
swap_layout.addStretch(1)
|
||||||
|
|
||||||
button_row_layout = QHBoxLayout()
|
button_row_layout = QHBoxLayout()
|
||||||
|
|
@ -951,13 +950,16 @@ class MainWindow(QMainWindow):
|
||||||
audio_layout.addWidget(send_audio_btn)
|
audio_layout.addWidget(send_audio_btn)
|
||||||
|
|
||||||
diag_panel_layout.addWidget(alarms_group, 2)
|
diag_panel_layout.addWidget(alarms_group, 2)
|
||||||
diag_panel_layout.addWidget(swap_group, 3) # Make sure you have swap_group defined
|
diag_panel_layout.addWidget(swap_group, 3)
|
||||||
diag_panel_layout.addWidget(audio_group, 1) # Make sure you have audio_group defined
|
diag_panel_layout.addWidget(audio_group, 1)
|
||||||
diag_panel_layout.addWidget(log_group, 4)
|
diag_panel_layout.addWidget(log_group, 4)
|
||||||
|
|
||||||
main_content_layout.addWidget(grid_widget, 1)
|
main_content_layout.addWidget(grid_widget, 1)
|
||||||
main_content_layout.addWidget(diag_panel, 0)
|
main_content_layout.addWidget(diag_panel, 0)
|
||||||
page_layout.addLayout(top_bar_layout)
|
|
||||||
|
self.top_bar_frame.setLayout(top_bar_layout)
|
||||||
|
|
||||||
|
page_layout.addWidget(self.top_bar_frame)
|
||||||
page_layout.addLayout(main_content_layout)
|
page_layout.addLayout(main_content_layout)
|
||||||
|
|
||||||
def log_to_instance_view(self, message: str):
|
def log_to_instance_view(self, message: str):
|
||||||
|
|
@ -1387,36 +1389,6 @@ class MainWindow(QMainWindow):
|
||||||
self.tabs.setCurrentWidget(self.main_tab)
|
self.tabs.setCurrentWidget(self.main_tab)
|
||||||
|
|
||||||
def update_main_dashboard(self, data):
|
def update_main_dashboard(self, data):
|
||||||
# try:
|
|
||||||
# ts = datetime.datetime.fromtimestamp(data.get('ts', datetime.datetime.now().timestamp())).strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
# self.last_recv_ts_field.setText(ts)
|
|
||||||
# slot_payloads = data.get("slotLevelPayload", [])
|
|
||||||
# for i, slot_data in enumerate(slot_payloads):
|
|
||||||
# if i < len(self.chamber_widgets):
|
|
||||||
# self.chamber_widgets[i].update_data(slot_data)
|
|
||||||
# if (i+1) in self.swap_buttons:
|
|
||||||
# is_present = slot_data.get("batteryPresent") == 1
|
|
||||||
# self.swap_buttons[i+1].setStyleSheet("background-color: #2ecc71;" if is_present else "")
|
|
||||||
# sdc_value = data.get("stationDiagnosticCode", 0)
|
|
||||||
# self.sdc_field.setText(str(sdc_value))
|
|
||||||
|
|
||||||
# backup_status = data.get("backupSupplyStatus", 0) # Default to 0 if not present
|
|
||||||
|
|
||||||
# if backup_status == 1:
|
|
||||||
# self.backup_supply_indicator.setText("BackupON")
|
|
||||||
# self.backup_supply_indicator.setStyleSheet(
|
|
||||||
# "background-color: #28a745; color: white; border-radius: 5px; font-weight: bold;" # Green
|
|
||||||
# )
|
|
||||||
# self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #28a745; }")
|
|
||||||
# else:
|
|
||||||
# self.backup_supply_indicator.setText("Backup OFF")
|
|
||||||
# self.backup_supply_indicator.setStyleSheet(
|
|
||||||
# "background-color: #dc3545; color: white; border-radius: 5px; font-weight: bold;" # Red
|
|
||||||
# )
|
|
||||||
# self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #dc3545; }")
|
|
||||||
# self.update_diagnostic_alarms(sdc_value)
|
|
||||||
# except Exception as e:
|
|
||||||
# print(f"Error updating dashboard: {e}")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
ts = datetime.datetime.fromtimestamp(data.get('ts', datetime.datetime.now().timestamp())).strftime('%Y-%m-%d %H:%M:%S')
|
ts = datetime.datetime.fromtimestamp(data.get('ts', datetime.datetime.now().timestamp())).strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
@ -1432,6 +1404,36 @@ class MainWindow(QMainWindow):
|
||||||
self.sdc_field.setText(str(sdc_value))
|
self.sdc_field.setText(str(sdc_value))
|
||||||
self.update_diagnostic_alarms(sdc_value)
|
self.update_diagnostic_alarms(sdc_value)
|
||||||
|
|
||||||
|
backup_status = data.get("backupSupplyStatus", 0) # Default to 0 if not present
|
||||||
|
if backup_status == 1:
|
||||||
|
self.backup_supply_indicator.setText("Backup ON")
|
||||||
|
self.backup_supply_indicator.setStyleSheet(
|
||||||
|
"""
|
||||||
|
QLabel {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 2px solid #28a745; /* Green */
|
||||||
|
color: #28a745;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
# self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #28a745; }")
|
||||||
|
else:
|
||||||
|
self.backup_supply_indicator.setText("Backup OFF")
|
||||||
|
self.backup_supply_indicator.setStyleSheet(
|
||||||
|
"""
|
||||||
|
QLabel {
|
||||||
|
background-color: transparent;
|
||||||
|
border: 2px solid #dc3545; /* Red */
|
||||||
|
color: #dc3545;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
# self.top_bar_frame.setStyleSheet("#topBarFrame { border: 1px solid #dc3545; }")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error updating dashboard: {e}")
|
print(f"Error updating dashboard: {e}")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,25 +17,54 @@ class ChamberWidget(QGroupBox):
|
||||||
self.setObjectName("ChamberWidget")
|
self.setObjectName("ChamberWidget")
|
||||||
self.setFont(QFont("Arial", max(8, int(9 * scale)), QFont.Weight.Bold))
|
self.setFont(QFont("Arial", max(8, int(9 * scale)), QFont.Weight.Bold))
|
||||||
|
|
||||||
|
# --- ADD THIS STYLESHEET TO CONTROL FONT SIZES ---
|
||||||
|
self.setStyleSheet(f"""
|
||||||
|
QFormLayout QLabel {{
|
||||||
|
font-size: {max(10, int(12 * scale))}px;
|
||||||
|
color: #AAAAAA;
|
||||||
|
}}
|
||||||
|
QLineEdit#BatIdField {{
|
||||||
|
font-size: {max(14, int(16 * scale))}px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #FFFFFF;
|
||||||
|
}}
|
||||||
|
QLineEdit#DataField {{
|
||||||
|
font-size: {max(13, int(14 * scale))}px;
|
||||||
|
color: #E0E0E0;
|
||||||
|
}}
|
||||||
|
""")
|
||||||
|
# --- END OF STYLESHEET ---
|
||||||
|
|
||||||
main_layout = QVBoxLayout(self)
|
main_layout = QVBoxLayout(self)
|
||||||
main_layout.setSpacing(max(2, int(4 * scale)))
|
main_layout.setSpacing(max(2, int(4 * scale)))
|
||||||
|
|
||||||
# This section creates the 'id_field' that was missing
|
|
||||||
id_layout = QHBoxLayout()
|
id_layout = QHBoxLayout()
|
||||||
id_layout.addWidget(QLabel("BAT ID: "))
|
id_layout.addWidget(QLabel("BAT ID: "))
|
||||||
self.id_field = self._create_data_field(scale) # This line ensures self.id_field exists
|
self.id_field = self._create_data_field(scale)
|
||||||
|
self.id_field.setObjectName("BatIdField") # Set object name for styling
|
||||||
id_layout.addWidget(self.id_field)
|
id_layout.addWidget(self.id_field)
|
||||||
main_layout.addLayout(id_layout)
|
main_layout.addLayout(id_layout)
|
||||||
|
|
||||||
columns_layout = QHBoxLayout()
|
columns_layout = QHBoxLayout()
|
||||||
battery_form_layout = QFormLayout()
|
battery_form_layout = QFormLayout()
|
||||||
battery_form_layout.setVerticalSpacing(max(2, int(4 * scale)))
|
battery_form_layout.setVerticalSpacing(max(2, int(4 * scale)))
|
||||||
|
|
||||||
self.battery_status_label = self._create_status_label("ABSENT", scale)
|
self.battery_status_label = self._create_status_label("ABSENT", scale)
|
||||||
self.battery_status_label.setProperty("status", "absent")
|
self.battery_status_label.setProperty("status", "absent")
|
||||||
|
|
||||||
|
# --- SET OBJECT NAMES FOR EACH DATA FIELD ---
|
||||||
self.soc_field = self._create_data_field(scale)
|
self.soc_field = self._create_data_field(scale)
|
||||||
|
self.soc_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.voltage_field = self._create_data_field(scale)
|
self.voltage_field = self._create_data_field(scale)
|
||||||
|
self.voltage_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.temp_field = self._create_data_field(scale)
|
self.temp_field = self._create_data_field(scale)
|
||||||
|
self.temp_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.battery_fault_field = self._create_data_field(scale)
|
self.battery_fault_field = self._create_data_field(scale)
|
||||||
|
self.battery_fault_field.setObjectName("DataField")
|
||||||
|
# --- END OF OBJECT NAMES ---
|
||||||
|
|
||||||
battery_form_layout.addRow("Status:", self.battery_status_label)
|
battery_form_layout.addRow("Status:", self.battery_status_label)
|
||||||
battery_form_layout.addRow("SOC:", self.soc_field)
|
battery_form_layout.addRow("SOC:", self.soc_field)
|
||||||
|
|
@ -49,12 +78,23 @@ class ChamberWidget(QGroupBox):
|
||||||
|
|
||||||
charger_form_layout = QFormLayout()
|
charger_form_layout = QFormLayout()
|
||||||
charger_form_layout.setVerticalSpacing(max(2, int(4 * scale)))
|
charger_form_layout.setVerticalSpacing(max(2, int(4 * scale)))
|
||||||
|
|
||||||
self.charger_status_label = self._create_status_label("OFF", scale)
|
self.charger_status_label = self._create_status_label("OFF", scale)
|
||||||
self.charger_status_label.setProperty("status", "absent")
|
self.charger_status_label.setProperty("status", "absent")
|
||||||
|
|
||||||
|
# --- SET OBJECT NAMES FOR EACH DATA FIELD ---
|
||||||
self.slot_temp_field = self._create_data_field(scale)
|
self.slot_temp_field = self._create_data_field(scale)
|
||||||
|
self.slot_temp_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.chg_temp_field = self._create_data_field(scale)
|
self.chg_temp_field = self._create_data_field(scale)
|
||||||
|
self.chg_temp_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.door_status_field = self._create_data_field(scale)
|
self.door_status_field = self._create_data_field(scale)
|
||||||
|
self.door_status_field.setObjectName("DataField")
|
||||||
|
|
||||||
self.charger_fault_field = self._create_data_field(scale)
|
self.charger_fault_field = self._create_data_field(scale)
|
||||||
|
self.charger_fault_field.setObjectName("DataField")
|
||||||
|
# --- END OF OBJECT NAMES ---
|
||||||
|
|
||||||
charger_form_layout.addRow("Chg Status:", self.charger_status_label)
|
charger_form_layout.addRow("Chg Status:", self.charger_status_label)
|
||||||
charger_form_layout.addRow("Chg Temp:", self.chg_temp_field)
|
charger_form_layout.addRow("Chg Temp:", self.chg_temp_field)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue