diff --git a/ui/main_window.py b/ui/main_window.py index 15f411f..5215d84 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -780,6 +780,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.addWidget(QLabel("LAST RECV TS:")) @@ -788,24 +792,23 @@ class MainWindow(QMainWindow): 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.addWidget(QLabel("Backup Supply:")) + # top_bar_layout.addWidget(QLabel("Backup Supply:")) self.backup_supply_indicator = QLabel("N/A") self.backup_supply_indicator.setFixedSize(80, 25) self.backup_supply_indicator.setAlignment(Qt.AlignmentFlag.AlignCenter) 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) - # 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.setObjectName("RefreshButton") refresh_btn.clicked.connect(self.reset_dashboard_ui) @@ -877,7 +880,6 @@ class MainWindow(QMainWindow): swap_layout.addLayout(swap_display_layout) swap_grid = QGridLayout() - # swap_grid.setVerticalSpacing(max(0, int(4 * self.scale_factor))) swap_grid.setSpacing(int(2 * self.scale_factor)) swap_grid.setContentsMargins(0, 0, 0, 0) swap_grid.setSizeConstraint(QLayout.SizeConstraint.SetFixedSize) @@ -896,14 +898,11 @@ class MainWindow(QMainWindow): swap_grid.addWidget(btn, row, col, Qt.AlignmentFlag.AlignCenter) grid_container_layout = QHBoxLayout() - grid_container_layout.addStretch(1) # Add a stretchable "spring" on the left - grid_container_layout.addLayout(swap_grid) # Add the compact grid in the middle - grid_container_layout.addStretch(1) # Add a stretchable "spring" on the right + grid_container_layout.addStretch(1) + grid_container_layout.addLayout(swap_grid) + 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(swap_grid, 0) swap_layout.addStretch(1) button_row_layout = QHBoxLayout() @@ -951,13 +950,16 @@ class MainWindow(QMainWindow): audio_layout.addWidget(send_audio_btn) 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(audio_group, 1) # Make sure you have audio_group defined + diag_panel_layout.addWidget(swap_group, 3) + diag_panel_layout.addWidget(audio_group, 1) diag_panel_layout.addWidget(log_group, 4) main_content_layout.addWidget(grid_widget, 1) 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) def log_to_instance_view(self, message: str): @@ -1387,36 +1389,6 @@ class MainWindow(QMainWindow): self.tabs.setCurrentWidget(self.main_tab) 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: 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.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: print(f"Error updating dashboard: {e}") diff --git a/ui/widgets.py b/ui/widgets.py index 0dd1236..744722d 100644 --- a/ui/widgets.py +++ b/ui/widgets.py @@ -17,25 +17,54 @@ class ChamberWidget(QGroupBox): self.setObjectName("ChamberWidget") 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.setSpacing(max(2, int(4 * scale))) - # This section creates the 'id_field' that was missing id_layout = QHBoxLayout() 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) main_layout.addLayout(id_layout) columns_layout = QHBoxLayout() battery_form_layout = QFormLayout() battery_form_layout.setVerticalSpacing(max(2, int(4 * scale))) + self.battery_status_label = self._create_status_label("ABSENT", scale) 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.setObjectName("DataField") + self.voltage_field = self._create_data_field(scale) + self.voltage_field.setObjectName("DataField") + 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.setObjectName("DataField") + # --- END OF OBJECT NAMES --- battery_form_layout.addRow("Status:", self.battery_status_label) battery_form_layout.addRow("SOC:", self.soc_field) @@ -49,12 +78,23 @@ class ChamberWidget(QGroupBox): charger_form_layout = QFormLayout() charger_form_layout.setVerticalSpacing(max(2, int(4 * scale))) + self.charger_status_label = self._create_status_label("OFF", scale) 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.setObjectName("DataField") + 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.setObjectName("DataField") + 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 Temp:", self.chg_temp_field)