diff --git a/src/core/widgets/glazewm/binding_mode.py b/src/core/widgets/glazewm/binding_mode.py index 03761856..5e4b613b 100644 --- a/src/core/widgets/glazewm/binding_mode.py +++ b/src/core/widgets/glazewm/binding_mode.py @@ -73,34 +73,29 @@ def _reload_css(self, label: QLabel): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self._label_alt_content if self._show_alt_label else self._label_content + + active_label_content = active_label_content.format( + binding_mode=( + self._active_binding_mode.display_name or self._active_binding_mode.name or self._label_if_no_active + ), + icon=self._icons.get(self._active_binding_mode.name or "none", self._default_icon), + ) + label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 - label_options = { - "{binding_mode}": self._active_binding_mode.display_name - or self._active_binding_mode.name - or self._label_if_no_active, - "{icon}": self._icons.get(self._active_binding_mode.name or "none", self._default_icon), - } for part in label_parts: part = part.strip() if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: - icon = re.sub(r"|", "", part).strip() - if icon in label_options: - active_widgets[widget_index].setProperty( - "class", f"icon {self._active_binding_mode.name or 'none'}" - ) - active_widgets[widget_index].setText(formatted_text) - else: - active_widgets[widget_index].setText(icon) + part = re.sub(r"|", "", part).strip() + active_widgets[widget_index].setProperty( + "class", f"icon {self._active_binding_mode.name or 'none'}" + ) + active_widgets[widget_index].setText(part) else: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) if active_widgets[widget_index].property("class") == "label-offline": active_widgets[widget_index].setProperty("class", "label") if not self._active_binding_mode.name: diff --git a/src/core/widgets/yasb/battery.py b/src/core/widgets/yasb/battery.py index 53644044..d366d6bd 100644 --- a/src/core/widgets/yasb/battery.py +++ b/src/core/widgets/yasb/battery.py @@ -134,6 +134,8 @@ def _update_label(self): self.timer.stop() return + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() if widget_index < len(active_widgets): @@ -161,28 +163,30 @@ def _update_label(self): health_str = f"{state.health_percent:.1f}" if state.health_percent is not None else "N/A" chemistry_str = state.chemistry if state.chemistry else "N/A" + active_label_content = active_label_content.format( + percent=str(self._battery_state.percent), + time_remaining=time_remaining, + is_charging=is_charging_str, + icon=charging_icon, + power=rate_str, + voltage=voltage_str, + capacity=capacity_str, + full_capacity=full_capacity_str, + designed_capacity=designed_capacity_str, + temperature=temperature_str, + cycle_count=cycle_count_str, + health=health_str, + chemistry=chemistry_str, + ) + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() - if part and widget_index < len(active_widgets): - battery_status = ( - part.replace("{percent}", str(self._battery_state.percent)) - .replace("{time_remaining}", time_remaining) - .replace("{is_charging}", is_charging_str) - .replace("{icon}", charging_icon) - .replace("{power}", rate_str) - .replace("{voltage}", voltage_str) - .replace("{capacity}", capacity_str) - .replace("{full_capacity}", full_capacity_str) - .replace("{designed_capacity}", designed_capacity_str) - .replace("{temperature}", temperature_str) - .replace("{cycle_count}", cycle_count_str) - .replace("{health}", health_str) - .replace("{chemistry}", chemistry_str) - ) - if "" in battery_status: + if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): + if "" in part: # icon-only QLabel widget_label = active_widgets[widget_index] - icon = re.sub(r"|", "", battery_status).strip() + icon = re.sub(r"|", "", part).strip() widget_label.setText(icon) # apply status‐class existing_classes = widget_label.property("class") @@ -207,8 +211,7 @@ def _update_label(self): refresh_widget_style(widget_label) else: alt_class = "alt" if self._show_alt_label else "" - formatted_text = battery_status.format(battery_status) - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) active_widgets[widget_index].setProperty("class", f"label {alt_class} status-{threshold}") refresh_widget_style(active_widgets[widget_index]) widget_index += 1 diff --git a/src/core/widgets/yasb/bluetooth.py b/src/core/widgets/yasb/bluetooth.py index 026d1737..1248f6d2 100644 --- a/src/core/widgets/yasb/bluetooth.py +++ b/src/core/widgets/yasb/bluetooth.py @@ -268,8 +268,6 @@ def _toggle_label(self): def _update_label(self, icon, connected_devices=None): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 if connected_devices: @@ -291,26 +289,25 @@ def _update_label(self, icon, connected_devices=None): device_names = self.config.label_no_device tooltip_text = self.config.label_no_device - label_options = { - "{icon}": icon, - "{device_name}": device_names, - "{device_count}": len(connected_devices) if connected_devices else 0, - } + active_label_content = active_label_content.format( + icon=icon, + device_name=device_names, + device_count=len(connected_devices) if connected_devices else 0, + ) + + label_parts = re.split("(.*?)", active_label_content) for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) else: - if self.config.max_length and len(formatted_text) > self.config.max_length: - formatted_text = formatted_text[: self.config.max_length] + self.config.max_length_ellipsis + if self.config.max_length and len(part) > self.config.max_length: + part = part[: self.config.max_length] + self.config.max_length_ellipsis if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) widget_index += 1 if self.config.tooltip: diff --git a/src/core/widgets/yasb/brightness.py b/src/core/widgets/yasb/brightness.py index e3bcbcdc..a0c6f336 100644 --- a/src/core/widgets/yasb/brightness.py +++ b/src/core/widgets/yasb/brightness.py @@ -148,9 +148,6 @@ def _update_label(self): """Update the widget label with current brightness.""" active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] - widget_index = 0 percent = self.current_brightness if percent is None: @@ -165,7 +162,9 @@ def _update_label(self): if self.config.tooltip: set_tooltip(self, f"Brightness {percent}%") - label_options = {"{icon}": icon, "{percent}": percent} + active_label_content = active_label_content.format(icon=icon, percent=percent) + label_parts = re.split("(.*?)", active_label_content) + widget_index = 0 # Update progress bar if self.config.progress_bar.enabled and self.progress_widget: @@ -178,10 +177,7 @@ def _update_label(self): for part in label_parts: part = part.strip() if part and widget_index < len(active_widgets): - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) widget_index += 1 def _get_brightness_icon(self, brightness: int) -> str: diff --git a/src/core/widgets/yasb/clock.py b/src/core/widgets/yasb/clock.py index 5d8e9104..07eab0e3 100644 --- a/src/core/widgets/yasb/clock.py +++ b/src/core/widgets/yasb/clock.py @@ -485,10 +485,27 @@ def _update_label(self): # Choose which label set to update (primary or alternate) active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self._label_alt_content if self._show_alt_label else self._label_content - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 now = datetime.now(ZoneInfo(self._active_tz)) if self._active_tz else datetime.now().astimezone() + + # Finding the datetime format string in the label using keyerror exception. + # This code assumes that there's only 1 time format placeholder in the label. + try: + active_label_content.format(icon="", alarm="", timedata=now) + except KeyError as ke: + # Remove the quotes around the exception message to get the datetime format. + datetime_format = str(ke)[1:-1] + + datetime_format_idx = active_label_content.find(datetime_format) + closing_braces_idx = active_label_content.find("}", datetime_format_idx + len(datetime_format)) + datetime_format = active_label_content[datetime_format_idx:closing_braces_idx] + + active_label_content = ( + active_label_content[: datetime_format_idx - 1] + + now.strftime(datetime_format) + + active_label_content[closing_braces_idx + 1 :] + ) + current_hour = f"{now.hour:02d}" current_minute = f"{now.minute:02d}" hour_changed = self._current_hour != current_hour @@ -498,6 +515,9 @@ def _update_label(self): if minute_changed: self._current_minute = current_minute + has_alarm = self._shared_state._snoozed_alarms or self._has_enabled_alarms() + alarm_state_changed = has_alarm != self._previous_alarm_state + # Temporarily switch locale so strftime outputs are localized org_locale_time, org_locale_ctype = self._set_locale_context() @@ -513,75 +533,77 @@ def _update_label(self): self._timer_label.hide() self._timer_visible = False + clock_icon = self._get_icon_for_hour(now.hour) + hour_class = f"clock_{current_hour}" + alarm_icon = alarm_class = "" + + if self._shared_state._snoozed_alarms: + alarm_class = "icon alarm snooze" + alarm_icon = self.config.alarm_icons.snooze + + elif self._has_enabled_alarms(): + alarm_icon = self.config.alarm_icons.enabled + alarm_class = "icon alarm" + + # The icon place holders are replaced with a span tag of the icon string, with all of its appropriate classes + # assigned to it. + label_content_values = { + "icon": f'{clock_icon}', + "alarm": f'{alarm_icon}', + "timedata": now, + } + + active_label_content = active_label_content.format_map(label_content_values) + + # If any of the icon placeholders are already in a span tag, then flatten the 2 layers of nested span tags, and + # merge their classes into one span tag, before sending them for parsing. + active_label_content = re.sub( + r'[\w -]*)\1)?>[\w -]*)\3>(?P.*?)', + r'\g', + active_label_content, + ) + + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: - part = part.strip() - if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): + if not part: + continue + + if widget_index < len(active_widgets): + active_widget = active_widgets[widget_index] + else: + active_widget = label = QLabel(part) + label.setProperty("class", "label alt" if self._show_alt_label else "label") + label.setAlignment(Qt.AlignmentFlag.AlignCenter) + label.setCursor(Qt.CursorShape.PointingHandCursor) + content_shadow = self.config.label_shadow.model_dump() + if content_shadow: + add_shadow(label, content_shadow) + self._widget_container_layout.addWidget(label) + active_widgets.append(label) + + if isinstance(active_widget, QLabel): if "" in part: + match = re.search(r'[\w -]*)\1>[^>]*', part) + classes = match.group("class_name").strip() or "" + icon_placeholder = re.sub(r"|", "", part).strip() - if icon_placeholder == "{icon}": - if hour_changed: - icon = self._get_icon_for_hour(now.hour) - active_widgets[widget_index].setText(icon) - hour_class = f"clock_{current_hour}" - active_widgets[widget_index].setProperty("class", f"icon {hour_class}") - refresh_widget_style(active_widgets[widget_index]) - elif icon_placeholder == "{alarm}": - if self._shared_state._snoozed_alarms: - active_widgets[widget_index].setText(self.config.alarm_icons.snooze) - active_widgets[widget_index].setProperty("class", "icon alarm snooze") - active_widgets[widget_index].setVisible(True) - refresh_widget_style(active_widgets[widget_index]) - elif self._has_enabled_alarms(): - active_widgets[widget_index].setText(self.config.alarm_icons.enabled) - active_widgets[widget_index].setProperty("class", "icon alarm") - active_widgets[widget_index].setVisible(True) - refresh_widget_style(active_widgets[widget_index]) - else: - active_widgets[widget_index].setText("") - active_widgets[widget_index].setVisible(False) - - else: - active_widgets[widget_index].setText(icon_placeholder) + active_widget.setText(icon_placeholder) + active_widget.setProperty("class", classes) + refresh_widget_style(active_widget) + else: - has_alarm = "{alarm}" in part and (self._shared_state._snoozed_alarms or self._has_enabled_alarms()) - - if "{icon}" in part: - icon = self._get_icon_for_hour(now.hour) - part = part.replace("{icon}", icon) - - if "{alarm}" in part: - if self._shared_state._snoozed_alarms: - part = part.replace("{alarm}", self.config.alarm_icons.snooze) - elif self._has_enabled_alarms(): - part = part.replace("{alarm}", self.config.alarm_icons.enabled) - else: - part = part.replace("{alarm}", "") - try: - datetime_format_search = re.search(r"\{(.*)}", part) - datetime_format_str = datetime_format_search.group() - datetime_format = datetime_format_search.group(1) - format_label_content = part.replace(datetime_format_str, now.strftime(datetime_format)) - except Exception: - format_label_content = part - - active_widgets[widget_index].setText(format_label_content) - - alarm_state_changed = has_alarm != self._previous_alarm_state - if has_alarm: - if self._shared_state._snoozed_alarms: - active_widgets[widget_index].setProperty("class", "label alarm snooze") - else: - active_widgets[widget_index].setProperty("class", "label alarm") - refresh_widget_style(active_widgets[widget_index]) - else: - hour_class = f"clock_{current_hour}" - active_widgets[widget_index].setProperty("class", f"label {hour_class}") - if hour_changed or alarm_state_changed: - refresh_widget_style(active_widgets[widget_index]) - - self._previous_alarm_state = has_alarm + active_widget.setText(part) + if hour_changed or alarm_state_changed: + refresh_widget_style(active_widget) + active_widget.setVisible(True) widget_index += 1 + while widget_index < len(active_widgets): + active_widgets[widget_index].setVisible(False) + widget_index += 1 + + self._previous_alarm_state = has_alarm self._restore_locale_context(org_locale_time, org_locale_ctype) def _update_tooltip(self): diff --git a/src/core/widgets/yasb/cpu.py b/src/core/widgets/yasb/cpu.py index 7a8291ef..be65dc38 100644 --- a/src/core/widgets/yasb/cpu.py +++ b/src/core/widgets/yasb/cpu.py @@ -164,8 +164,8 @@ def _update_label(self, data: CpuData): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(info=cpu_info) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 if self.config.progress_bar.enabled and self.progress_widget: @@ -176,6 +176,8 @@ def _update_label(self, data: CpuData): ) self.progress_widget.set_value(data.percent) + cpu_threshold_class = self._get_cpu_threshold(data.percent) + for part in label_parts: part = part.strip() if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): @@ -184,12 +186,8 @@ def _update_label(self, data: CpuData): active_widgets[widget_index].setText(icon) else: label_class = "label alt" if self._show_alt_label else "label" - formatted_text = part.format(info=cpu_info) - active_widgets[widget_index].setText(formatted_text) - active_widgets[widget_index].setProperty("class", label_class) - active_widgets[widget_index].setProperty( - "class", f"{label_class} status-{self._get_cpu_threshold(data.percent)}" - ) + active_widgets[widget_index].setText(part) + active_widgets[widget_index].setProperty("class", f"{label_class} status-{cpu_threshold_class}") refresh_widget_style(active_widgets[widget_index]) widget_index += 1 diff --git a/src/core/widgets/yasb/custom.py b/src/core/widgets/yasb/custom.py index ecc312f4..d0b24182 100644 --- a/src/core/widgets/yasb/custom.py +++ b/src/core/widgets/yasb/custom.py @@ -149,27 +149,53 @@ def _truncate_label(self, label): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(data=self._exec_data) label_parts = re.split("(.*?)", active_label_content) widget_index = 0 + + if self.config.exec_options.hide_empty: + if self._exec_data: + self.setVisible(True) + # active_widgets[widget_index].show() + else: + self.setVisible(False) + return + # active_widgets[widget_index].hide() + try: for part in label_parts: part = part.strip() - if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): + if not part: + continue + + if widget_index < len(active_widgets): + active_widget = active_widgets[widget_index] + else: + active_widget = label = QLabel(part) + label.setProperty("class", "label alt" if self._show_alt_label else "label") + label.setText(self.config.label_placeholder) + label.setAlignment(Qt.AlignmentFlag.AlignCenter) + self._set_cursor(label) + add_shadow(label, self.config.label_shadow.model_dump()) + self._widget_container_layout.addWidget(label) + active_widgets.append(label) + + if isinstance(active_widget, QLabel): if "" in part: icon = re.sub(r"|", "", part).strip() - active_widgets[widget_index].setText(icon) + active_widget.setText(icon) else: - active_widgets[widget_index].setText(self._truncate_label(part.format(data=self._exec_data))) - if self.config.exec_options.hide_empty: - if self._exec_data: - self.setVisible(True) - # active_widgets[widget_index].show() - else: - self.setVisible(False) - # active_widgets[widget_index].hide() + active_widget.setText(self._truncate_label(part)) + + if not active_widget.isVisible(): + active_widget.setVisible(True) widget_index += 1 except Exception: - active_widgets[widget_index].setText(self._truncate_label(part)) + active_widget.setText(self._truncate_label(part)) + + while widget_index < len(active_widgets): + active_widgets[widget_index].setVisible(False) + widget_index += 1 # Update tooltip if enabled self._update_tooltip() diff --git a/src/core/widgets/yasb/disk.py b/src/core/widgets/yasb/disk.py index 864c7424..fbad1d61 100644 --- a/src/core/widgets/yasb/disk.py +++ b/src/core/widgets/yasb/disk.py @@ -68,8 +68,6 @@ def _toggle_group(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split(r"(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 disk_space = self._get_space() @@ -84,6 +82,14 @@ def _update_label(self): self.progress_widget.set_value(percent_value) + active_label_content = active_label_content.format( + space=disk_space, volume_label=self.config.volume_label.upper() + ) + label_parts = re.split("(.*?)", active_label_content) + + disk_threshold_class = self._get_disk_threshold(percent_value) + label_class = f"{'label alt' if self._show_alt_label else 'label'} status-{disk_threshold_class}" + for part in label_parts: part = part.strip() if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): @@ -93,16 +99,8 @@ def _update_label(self): active_widgets[widget_index].setText(icon) else: # Update label with formatted content - label_class = "label alt" if self._show_alt_label else "label" - formatted_text = ( - part.format(space=disk_space, volume_label=self.config.volume_label.upper()) - if disk_space - else part - ) - active_widgets[widget_index].setProperty( - "class", f"{label_class} status-{self._get_disk_threshold(percent_value)}" - ) - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setProperty("class", label_class) + active_widgets[widget_index].setText(part) refresh_widget_style(active_widgets[widget_index]) widget_index += 1 diff --git a/src/core/widgets/yasb/github.py b/src/core/widgets/yasb/github.py index 20565b44..63bcf9c1 100644 --- a/src/core/widgets/yasb/github.py +++ b/src/core/widgets/yasb/github.py @@ -201,11 +201,12 @@ def _on_data_update(self, _notifications: list[Any]) -> None: def _update_label(self): github_data = GitHubDataManager.get_data() - notification_count = len([notification for notification in github_data if notification["unread"]]) + notification_count = sum(notification["unread"] for notification in github_data) active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(data=notification_count) # Split label content and filter out empty parts - label_parts = [part.strip() for part in re.split(r"(.*?)", active_label_content) if part] + label_parts = re.split(r"(.*?)", active_label_content) # Setting the notification dot if enabled and the label exists if self.config.notification_dot.enabled: @@ -214,8 +215,14 @@ def _update_label(self): if self._show_alt_label and self._notification_label_alt is not None: self._notification_label_alt.show_dot(notification_count > 0) - for widget_index, part in enumerate(label_parts): + widget_index = 0 + + for part in label_parts: if widget_index >= len(active_widgets): + break + + part = part.strip() + if not part: continue current_widget = active_widgets[widget_index] @@ -236,8 +243,9 @@ def _update_label(self): current_widget.setProperty("class", " ".join(current_classes)) else: - formatted_text = part.format(data=notification_count) - current_widget.setText(formatted_text) + current_widget.setText(part) + + widget_index += 1 refresh_widget_style(current_widget) def mark_as_read(self, notification_id: str, container_label: QFrame) -> None: diff --git a/src/core/widgets/yasb/glucose_monitor.py b/src/core/widgets/yasb/glucose_monitor.py index 95100a88..d245c2d8 100644 --- a/src/core/widgets/yasb/glucose_monitor.py +++ b/src/core/widgets/yasb/glucose_monitor.py @@ -131,16 +131,12 @@ def _open_cgm(self) -> None: shell_open(self.config.host) def _update_label(self) -> None: + has_error_message = bool(self._error_message) + for widget in self._widgets: - widget.setVisible(not self._error_message) + widget.setVisible(not has_error_message) for widget in self._widgets_alt: - widget.setVisible(bool(self._error_message)) - - active_widgets = self._error_message and self._widgets_alt or self._widgets - active_label_content = self._error_message and self.config.error_label or self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = list(filter(None, label_parts)) - widget_index = 0 + widget.setVisible(has_error_message) format_data = ( self._error_message @@ -150,24 +146,33 @@ def _update_label(self) -> None: or self._status_data ) + active_widgets = self._error_message and self._widgets_alt or self._widgets + active_label_content = self._error_message and self.config.error_label or self.config.label + active_label_content = active_label_content.format_map(format_data) + label_parts = re.split("(.*?)", active_label_content) + widget_index = 0 + for part in label_parts: + if widget_index >= len(active_widgets): + break + part = part.strip() - if not part or widget_index >= len(active_widgets) or not isinstance(active_widgets[widget_index], QLabel): + if not part: continue - if "" in part: - icon = re.sub(r"|", "", part).strip() - active_widgets[widget_index].setText(icon.format_map(format_data)) - - current_class = active_widgets[widget_index].property("class") or "" - if "sgv" in current_class.split(): - new_class = self._is_sgv_in_range and "sgv in-range" or "sgv out-range" - active_widgets[widget_index].setProperty("class", new_class) - refresh_widget_style(active_widgets[widget_index]) - else: - formatted_text = part.format_map(format_data) - active_widgets[widget_index].setText(formatted_text) - widget_index += 1 + if isinstance(active_widgets[widget_index], QLabel): + if "" in part: + icon = re.sub(r"|", "", part).strip() + active_widgets[widget_index].setText(icon) + + current_class = active_widgets[widget_index].property("class") or "" + if "sgv" in current_class.split(): + new_class = self._is_sgv_in_range and "sgv in-range" or "sgv out-range" + active_widgets[widget_index].setProperty("class", new_class) + refresh_widget_style(active_widgets[widget_index]) + else: + active_widgets[widget_index].setText(part) + widget_index += 1 if self.config.tooltip: set_tooltip( diff --git a/src/core/widgets/yasb/gpu.py b/src/core/widgets/yasb/gpu.py index 10b0c11e..0748117b 100644 --- a/src/core/widgets/yasb/gpu.py +++ b/src/core/widgets/yasb/gpu.py @@ -113,8 +113,8 @@ def _update_label(self, gpu_data: GpuData): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(info=gpu_info) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 if self.config.progress_bar.enabled and self.progress_widget: @@ -133,8 +133,7 @@ def _update_label(self, gpu_data: GpuData): active_widgets[widget_index].setText(icon) else: label_class = "label alt" if self._show_alt_label else "label" - formatted_text = part.format(info=gpu_info) - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) active_widgets[widget_index].setProperty("class", label_class) active_widgets[widget_index].setProperty( "class", f"{label_class} status-{self._get_gpu_threshold(gpu_data.utilization)}" diff --git a/src/core/widgets/yasb/language.py b/src/core/widgets/yasb/language.py index a792f69e..98c2f441 100644 --- a/src/core/widgets/yasb/language.py +++ b/src/core/widgets/yasb/language.py @@ -11,10 +11,7 @@ from core.utils.utilities import PopupWidget, refresh_widget_style from core.utils.widgets.animation_manager import AnimationManager -from core.utils.win32.bindings import ( - kernel32, - user32, -) +from core.utils.win32.bindings import kernel32, user32 from core.utils.win32.constants import ( LOCALE_NAME_MAX_LENGTH, LOCALE_SCOUNTRY, @@ -85,14 +82,14 @@ def _toggle_menu(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 prev_caps_lock = self._caps_lock_active try: - lang = self._get_current_keyboard_language() + active_label_content = active_label_content.format(lang=self._get_current_keyboard_language()) except: - lang = None + pass + + label_parts = re.split("(.*?)", active_label_content) if self._caps_lock_active != prev_caps_lock: if self._caps_lock_active: @@ -110,8 +107,7 @@ def _update_label(self): active_widgets[widget_index].setText(icon) else: # Update label with formatted content - formatted_text = part.format(lang=lang) if lang else part - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) widget_index += 1 def _on_settings_click(self, ev: QMouseEvent | None): diff --git a/src/core/widgets/yasb/libre_monitor.py b/src/core/widgets/yasb/libre_monitor.py index 094b9599..37b889fc 100644 --- a/src/core/widgets/yasb/libre_monitor.py +++ b/src/core/widgets/yasb/libre_monitor.py @@ -229,8 +229,8 @@ def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(info=info) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 for part in label_parts: part = part.strip() @@ -239,10 +239,16 @@ def _update_label(self): icon = re.sub(r"|", "", part).strip() active_widgets[widget_index].setText(icon) else: - formatted_text = part.format(info=info) if info else part - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) + + if not active_widgets[widget_index].isVisible(): + active_widgets[widget_index].setVisible(True) + widget_index += 1 + for i in range(widget_index, len(active_widgets)): + active_widgets[i].setVisible(False) + # Update popup menu if it's visible if self._is_menu_visible(): self._update_menu_content() diff --git a/src/core/widgets/yasb/memory.py b/src/core/widgets/yasb/memory.py index d670ad57..4657cd35 100644 --- a/src/core/widgets/yasb/memory.py +++ b/src/core/widgets/yasb/memory.py @@ -153,24 +153,23 @@ def _update_label(self, virtual_mem, swap_mem): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 _round = lambda value: round(value) if self.config.hide_decimal else value _naturalsize = lambda value: naturalsize(value, True, True, "%.0f" if self.config.hide_decimal else "%.1f") - label_options = { - "{virtual_mem_free}": _naturalsize(virtual_mem.free), - "{virtual_mem_percent}": _round(virtual_mem.percent), - "{virtual_mem_total}": _naturalsize(virtual_mem.total), - "{virtual_mem_avail}": _naturalsize(virtual_mem.available), - "{virtual_mem_used}": _naturalsize(virtual_mem.used), - "{virtual_mem_outof}": f"{_naturalsize(virtual_mem.used)} / {_naturalsize(virtual_mem.total)}", - "{swap_mem_free}": _naturalsize(swap_mem.free), - "{swap_mem_percent}": _round(swap_mem.percent), - "{swap_mem_total}": _naturalsize(swap_mem.total), - "{histogram}": "".join([self._get_histogram_bar(virtual_mem.percent, 0, 100)]), - } + + active_label_content = active_label_content.format( + virtual_mem_free=_naturalsize(virtual_mem.free), + virtual_mem_percent=_round(virtual_mem.percent), + virtual_mem_total=_naturalsize(virtual_mem.total), + virtual_mem_avail=_naturalsize(virtual_mem.available), + virtual_mem_used=_naturalsize(virtual_mem.used), + virtual_mem_outof=f"{_naturalsize(virtual_mem.used)} / {_naturalsize(virtual_mem.total)}", + swap_mem_free=_naturalsize(swap_mem.free), + swap_mem_percent=_round(swap_mem.percent), + swap_mem_total=_naturalsize(swap_mem.total), + histogram="".join([self._get_histogram_bar(virtual_mem.percent, 0, 100)]), + ) if self.config.progress_bar.enabled and self.progress_widget: if self._widget_container_layout.indexOf(self.progress_widget) == -1: @@ -180,10 +179,12 @@ def _update_label(self, virtual_mem, swap_mem): ) self.progress_widget.set_value(virtual_mem.percent) + virtual_memory_threshold_class = self._get_virtual_memory_threshold(virtual_mem.percent) + + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() - for fmt_str, value in label_options.items(): - part = part.replace(fmt_str, str(value)) if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): if "" in part: @@ -194,7 +195,7 @@ def _update_label(self, virtual_mem, swap_mem): # Set memory threshold as property label_class = "label alt" if self._show_alt_label else "label" active_widgets[widget_index].setProperty( - "class", f"{label_class} status-{self._get_virtual_memory_threshold(virtual_mem.percent)}" + "class", f"{label_class} status-{virtual_memory_threshold_class}" ) refresh_widget_style(active_widgets[widget_index]) widget_index += 1 diff --git a/src/core/widgets/yasb/microphone.py b/src/core/widgets/yasb/microphone.py index 24b6011a..ab85edef 100644 --- a/src/core/widgets/yasb/microphone.py +++ b/src/core/widgets/yasb/microphone.py @@ -79,8 +79,6 @@ def _toggle_label(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 # Handle no device case @@ -98,8 +96,6 @@ def _update_label(self): logging.error("Failed to get microphone info: %s", e) return - label_options = {"{icon}": min_icon, "{level}": min_level} - if self.config.progress_bar.enabled and self.progress_widget: if self._widget_container_layout.indexOf(self.progress_widget) == -1: self._widget_container_layout.insertWidget( @@ -109,24 +105,20 @@ def _update_label(self): numeric_value = int(re.search(r"\d+", min_level).group()) if re.search(r"\d+", min_level) else 0 self.progress_widget.set_value(numeric_value) + active_label_content = active_label_content.format(icon=min_icon, level=min_level) + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) - self._set_muted_class( - active_widgets[widget_index], mute_status == 1 if mute_status is not None else False - ) + active_widgets[widget_index].setText(part) + self._set_muted_class(active_widgets[widget_index], mute_status == 1) else: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) - self._set_muted_class( - active_widgets[widget_index], mute_status == 1 if mute_status is not None else False - ) + active_widgets[widget_index].setText(part) + self._set_muted_class(active_widgets[widget_index], mute_status == 1) widget_index += 1 def _update_slider_value(self): diff --git a/src/core/widgets/yasb/notes.py b/src/core/widgets/yasb/notes.py index 17389174..25ea96c9 100644 --- a/src/core/widgets/yasb/notes.py +++ b/src/core/widgets/yasb/notes.py @@ -260,13 +260,17 @@ def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self._label_alt_content if self._show_alt_label else self._label_content + notes_count = len(self.notes) + active_label_content = active_label_content.format(count=notes_count) label_parts = re.split("(.*?)", active_label_content) label_parts = [part for part in label_parts if part] + widget_index = 0 - notes_count = len(self.notes) - - for widget_index, part in enumerate(label_parts): + for part in label_parts: if widget_index >= len(active_widgets): + break + + if not part: continue current_widget = active_widgets[widget_index] @@ -277,8 +281,7 @@ def _update_label(self): icon = re.sub(r"|", "", part).strip() current_widget.setText(icon) else: - formatted_text = part.format(count=notes_count) - current_widget.setText(formatted_text) + current_widget.setText(part) widget_index += 1 def _build_menu_button( diff --git a/src/core/widgets/yasb/notifications.py b/src/core/widgets/yasb/notifications.py index 34927c75..136101aa 100644 --- a/src/core/widgets/yasb/notifications.py +++ b/src/core/widgets/yasb/notifications.py @@ -92,17 +92,14 @@ def _update_label(self): else: icon = self.config.icons.default + active_label_content = active_label_content.format(count=self._notification_count, icon=icon) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 # Provide replacements for {count} and {icon} - label_options = [("{count}", self._notification_count), ("{icon}", icon)] for part in label_parts: part = part.strip() - for option, value in label_options: - part = part.replace(option, str(value)) if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): if "" in part: diff --git a/src/core/widgets/yasb/open_meteo.py b/src/core/widgets/yasb/open_meteo.py index b19045a0..01e6ec40 100644 --- a/src/core/widgets/yasb/open_meteo.py +++ b/src/core/widgets/yasb/open_meteo.py @@ -410,7 +410,7 @@ def handler(ev: QMouseEvent | None): frame_today.setProperty("class", "open-meteo-card-today") layout_today = QVBoxLayout(frame_today) - today_label0 = QLabel(f"{self._weather_data['{location}']} {self._weather_data['{temp}']}") + today_label0 = QLabel(f"{self._weather_data['location']} {self._weather_data['temp']}") today_label0.setProperty("class", "label location") today_label0.setAlignment(Qt.AlignmentFlag.AlignCenter) today_label0.setCursor(Qt.CursorShape.PointingHandCursor) @@ -427,12 +427,12 @@ def handler(ev: QMouseEvent | None): sunrise_icon_label = QLabel(self.config.icons.sunnyDay) sunrise_icon_label.setProperty("class", "label sunrisesunset-icon") - sunrise_text_label = QLabel(f"{self._weather_data.get('{sunrise}', 'N/A')}") + sunrise_text_label = QLabel(f"{self._weather_data.get('sunrise', 'N/A')}") sunrise_text_label.setProperty("class", "label sunrisesunset") sunset_icon_label = QLabel(self.config.icons.clearNight) sunset_icon_label.setProperty("class", "label sunrisesunset-icon") - sunset_text_label = QLabel(f"{self._weather_data.get('{sunset}', 'N/A')}") + sunset_text_label = QLabel(f"{self._weather_data.get('sunset', 'N/A')}") sunset_text_label.setProperty("class", "label sunrisesunset") today_sunrise_sunset_container_layout.addWidget(sunrise_icon_label) @@ -441,8 +441,8 @@ def handler(ev: QMouseEvent | None): today_sunrise_sunset_container_layout.addWidget(sunset_icon_label) today_sunrise_sunset_container_layout.addWidget(sunset_text_label) - rain_c = self._weather_data.get("{rain_chance}", 0) - snow_c = self._weather_data.get("{snow_chance}", 0) + rain_c = self._weather_data.get("rain_chance", 0) + snow_c = self._weather_data.get("snow_chance", 0) precip_parts = [] if rain_c != "N/A" and isinstance(rain_c, (int, float)) and rain_c > 0: precip_parts.append(f"Rain chance {rain_c}%") @@ -455,13 +455,13 @@ def handler(ev: QMouseEvent | None): precip_str = " \u2022 ".join(precip_parts) + " \u2022 " today_label1 = QLabel( - f"Feels like {self._weather_data['{feelslike}']} \u2022 " - f"{self._weather_data['{condition_text}']} \u2022 " - f"Humidity {self._weather_data['{humidity}']} \u2022 " - f"Pressure {self._weather_data['{pressure}']}\n" - f"Cloud {self._weather_data['{cloud}']}% \u2022 " + f"Feels like {self._weather_data['feelslike']} \u2022 " + f"{self._weather_data['condition_text']} \u2022 " + f"Humidity {self._weather_data['humidity']} \u2022 " + f"Pressure {self._weather_data['pressure']}\n" + f"Cloud {self._weather_data['cloud']}% \u2022 " f"{precip_str}" - f"UV Index {self._weather_data['{uv}']}" + f"UV Index {self._weather_data['uv']}" ) today_label1.setProperty("class", "label") today_label1.setAlignment(Qt.AlignmentFlag.AlignCenter) @@ -519,9 +519,9 @@ def switch_hourly_data(day_idx: int): elif i == 1: day_text = "Tomorrow" else: - day_text = self._weather_data.get(f"{{day{i}_full_name}}", "") - min_temp = self._weather_data[f"{{day{i}_min_temp}}"] - max_temp = self._weather_data[f"{{day{i}_max_temp}}"] + day_text = self._weather_data.get(f"day{i}_full_name", "") + min_temp = self._weather_data[f"day{i}_min_temp"] + max_temp = self._weather_data[f"day{i}_max_temp"] # Main vertical layout layout_day = QVBoxLayout() @@ -532,7 +532,7 @@ def switch_hourly_data(day_idx: int): # 1. Weather icon row_day_icon_label = QLabel() - day_code = self._weather_data.get(f"{{day{i}_weather_code}}", 0) + day_code = self._weather_data.get(f"day{i}_weather_code", 0) _, icon_key, _ = get_weather_icon(int(day_code), True) dpr = row_day_icon_label.devicePixelRatioF() pixmap = get_weather_icon_pixmap(icon_key, self.config.weather_card.icon_size, dpr) @@ -681,30 +681,30 @@ def _update_label(self, update_class: bool = True): active_widgets = self._show_alt_label and self._widgets_alt or self._widgets active_label_content = self._show_alt_label and self._label_alt_content or self._label_content + active_label_content = active_label_content.format_map(self._weather_data) label_parts = re.split(r"(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] if self.config.tooltip: tooltip = ( - f"{self._weather_data['{location}']}

Temperature
" - f"Min {self._weather_data['{min_temp}']} / Max {self._weather_data['{max_temp}']}" + f"{self._weather_data['location']}

Temperature
" + f"Min {self._weather_data['min_temp']} / Max {self._weather_data['max_temp']}" ) set_tooltip(self, tooltip) widget_index = 0 try: for part in label_parts: + if widget_index >= len(active_widgets): + break part = part.strip() - for option, value in self._weather_data.items(): - part = part.replace(option, str(value)) - if not part or widget_index >= len(active_widgets): + if not part: continue if "" in part: icon_name = re.sub(r"|", "", part).strip() active_widgets[widget_index].setText(self.config.icons.model_dump().get(icon_name, icon_name)) if update_class: current_class = active_widgets[widget_index].property("class") or "" - append_class_icon = self._weather_data.get("{icon_class}", "") + append_class_icon = self._weather_data.get("icon_class", "") new_class = f"{current_class} {append_class_icon}" active_widgets[widget_index].setProperty("class", new_class) self._reload_css(active_widgets[widget_index]) @@ -841,30 +841,30 @@ def fmt_wind(val: float) -> str: self._weather_data = { # Current conditions - "{temp}": fmt_temp(current.get("temperature_2m", 0)), - "{feelslike}": fmt_temp(current.get("apparent_temperature", 0)), - "{humidity}": f"{current.get('relative_humidity_2m', 0)}%", - "{cloud}": current.get("cloud_cover", 0), - "{pressure}": f"{current.get('pressure_msl', 0)} hPa", - "{precipitation}": f"{current.get('precipitation', 0)} mm", - "{wind}": fmt_wind(current.get("wind_speed_10m", 0)), - "{wind_dir}": f"{current.get('wind_direction_10m', 0)}°", - "{is_day}": "Day" if is_day else "Night", - "{condition_text}": condition_text, - "{icon}": icon_class, - "{icon_class}": icon_class, + "temp": fmt_temp(current.get("temperature_2m", 0)), + "feelslike": fmt_temp(current.get("apparent_temperature", 0)), + "humidity": f"{current.get('relative_humidity_2m', 0)}%", + "cloud": current.get("cloud_cover", 0), + "pressure": f"{current.get('pressure_msl', 0)} hPa", + "precipitation": f"{current.get('precipitation', 0)} mm", + "wind": fmt_wind(current.get("wind_speed_10m", 0)), + "wind_dir": f"{current.get('wind_direction_10m', 0)}°", + "is_day": "Day" if is_day else "Night", + "condition_text": condition_text, + "icon": icon_class, + "icon_class": icon_class, # Location - "{location}": location_name, + "location": location_name, # Sunrise / Sunset - "{sunrise}": self._format_time(daily.get("sunrise", [""])[0]) if daily.get("sunrise") else "N/A", - "{sunset}": self._format_time(daily.get("sunset", [""])[0]) if daily.get("sunset") else "N/A", + "sunrise": self._format_time(daily.get("sunrise", [""])[0]) if daily.get("sunrise") else "N/A", + "sunset": self._format_time(daily.get("sunset", [""])[0]) if daily.get("sunset") else "N/A", # Today forecast - "{min_temp}": fmt_temp(daily_min[0]) if daily_min else "N/A", - "{max_temp}": fmt_temp(daily_max[0]) if daily_max else "N/A", - "{precipitation_probability}": f"{daily_precip_max[0]}%" if daily_precip_max else "N/A", - "{rain_chance}": max_rain_chance, - "{snow_chance}": max_snow_chance, - "{uv}": f"{daily_uv[0]}" if daily_uv else "N/A", + "min_temp": fmt_temp(daily_min[0]) if daily_min else "N/A", + "max_temp": fmt_temp(daily_max[0]) if daily_max else "N/A", + "precipitation_probability": f"{daily_precip_max[0]}%" if daily_precip_max else "N/A", + "rain_chance": max_rain_chance, + "snow_chance": max_snow_chance, + "uv": f"{daily_uv[0]}" if daily_uv else "N/A", } # Per-day forecast data @@ -880,13 +880,13 @@ def fmt_wind(val: float) -> str: day_short = "N/A" day_full = "N/A" day_number = "" - self._weather_data[f"{{day{i}_name}}"] = day_name - self._weather_data[f"{{day{i}_short_name}}"] = day_short - self._weather_data[f"{{day{i}_full_name}}"] = day_full - self._weather_data[f"{{day{i}_number}}"] = day_number - self._weather_data[f"{{day{i}_min_temp}}"] = fmt_temp(daily_min[i]) if i < len(daily_min) else "N/A" - self._weather_data[f"{{day{i}_max_temp}}"] = fmt_temp(daily_max[i]) if i < len(daily_max) else "N/A" - self._weather_data[f"{{day{i}_weather_code}}"] = daily_codes[i] if i < len(daily_codes) else 0 + self._weather_data[f"day{i}_name"] = day_name + self._weather_data[f"day{i}_short_name"] = day_short + self._weather_data[f"day{i}_full_name"] = day_full + self._weather_data[f"day{i}_number"] = day_number + self._weather_data[f"day{i}_min_temp"] = fmt_temp(daily_min[i]) if i < len(daily_min) else "N/A" + self._weather_data[f"day{i}_max_temp"] = fmt_temp(daily_max[i]) if i < len(daily_max) else "N/A" + self._weather_data[f"day{i}_weather_code"] = daily_codes[i] if i < len(daily_codes) else 0 self._has_valid_weather_data = True @@ -898,26 +898,26 @@ def fmt_wind(val: float) -> str: self._has_valid_weather_data = False if self._weather_data is None: self._weather_data = { - "{temp}": "N/A", - "{min_temp}": "N/A", - "{max_temp}": "N/A", - "{precipitation_probability}": "N/A", - "{location}": "N/A", - "{humidity}": "N/A", - "{is_day}": "N/A", - "{icon}": "default", - "{icon_class}": "default", - "{condition_text}": "N/A", - "{wind}": "N/A", - "{wind_dir}": "N/A", - "{pressure}": "N/A", - "{precipitation}": "N/A", - "{uv}": "N/A", - "{cloud}": "N/A", - "{feelslike}": "N/A", + "temp": "N/A", + "min_temp": "N/A", + "max_temp": "N/A", + "precipitation_probability": "N/A", + "location": "N/A", + "humidity": "N/A", + "is_day": "N/A", + "icon": "default", + "icon_class": "default", + "condition_text": "N/A", + "wind": "N/A", + "wind_dir": "N/A", + "pressure": "N/A", + "precipitation": "N/A", + "uv": "N/A", + "cloud": "N/A", + "feelslike": "N/A", } for i in range(7): - self._weather_data[f"{{day{i}_name}}"] = "N/A" - self._weather_data[f"{{day{i}_min_temp}}"] = "N/A" - self._weather_data[f"{{day{i}_max_temp}}"] = "N/A" - self._weather_data[f"{{day{i}_weather_code}}"] = 0 + self._weather_data[f"day{i}_name"] = "N/A" + self._weather_data[f"day{i}_min_temp"] = "N/A" + self._weather_data[f"day{i}_max_temp"] = "N/A" + self._weather_data[f"day{i}_weather_code"] = 0 diff --git a/src/core/widgets/yasb/pomodoro.py b/src/core/widgets/yasb/pomodoro.py index 2e4bd078..b81af6ed 100644 --- a/src/core/widgets/yasb/pomodoro.py +++ b/src/core/widgets/yasb/pomodoro.py @@ -142,8 +142,6 @@ def _toggle_label(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 remaining_str = self._format_time(self._remaining_time) @@ -155,14 +153,14 @@ def _update_label(self): # Add current work session progress total_work_elapsed += (self.config.work_duration * 60) - self._remaining_time - label_options = { - "{remaining}": remaining_str, - "{elapsed}": self._format_time(total_work_elapsed), - "{status}": status, - "{session}": str(self._session_count + 1), - "{total_sessions}": str(self.config.session_target) if self.config.session_target > 0 else "∞", - "{icon}": self._get_current_icon(), - } + active_label_content = active_label_content.format( + remaining=remaining_str, + elapsed=self._format_time(total_work_elapsed), + status=status, + session=str(self._session_count + 1), + total_sessions=str(self.config.session_target) if self.config.session_target > 0 else "∞", + icon=self._get_current_icon(), + ) if self.config.progress_bar.enabled and self.progress_widget: if self._widget_container_layout.indexOf(self.progress_widget) == -1: @@ -182,22 +180,21 @@ def _update_label(self): percent = (elapsed / max_value) * 100 if max_value > 0 else 0 self.progress_widget.set_value(percent) + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) base_class = active_widgets[widget_index].property("class").split()[0] active_widgets[widget_index].setProperty("class", f"{base_class} {class_name}") refresh_widget_style(active_widgets[widget_index]) else: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): alt_class = "alt" if self._show_alt_label else "" - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) base_class = "label" active_widgets[widget_index].setProperty("class", f"{base_class} {alt_class} {class_name}") refresh_widget_style(active_widgets[widget_index]) diff --git a/src/core/widgets/yasb/power_plan.py b/src/core/widgets/yasb/power_plan.py index 3cabfb47..f6c72837 100644 --- a/src/core/widgets/yasb/power_plan.py +++ b/src/core/widgets/yasb/power_plan.py @@ -100,20 +100,15 @@ def _update_label(self): """Update the label with the current power plan name.""" active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format(active_plan=self._active_plan_name) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 - label_options = {"{active_plan}": self._active_plan_name} - for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) # Get the base class (without any power plan classes) alt_class = "alt" if self._show_alt_label else "" base_class = "icon" if ".*?)", active_label_content) label_parts = [part for part in label_parts if part] widget_index = 0 class_name = "bin-filled" if self._bin_info["num_items"] > 0 else "bin-empty" - label_options = { - "{items_count}": self._bin_info["num_items"], - "{items_size}": naturalsize(self._bin_info["size_bytes"], binary=True, format="%.2f"), - "{icon}": self._get_current_icon(), - } - for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: + part = re.sub(r"|", "", part) if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) base_class = active_widgets[widget_index].property("class").split()[0] active_widgets[widget_index].setProperty("class", f"{base_class} {class_name}") refresh_widget_style(active_widgets[widget_index]) else: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): alt_class = "alt" if self._show_alt_label else "" - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) base_class = "label" active_widgets[widget_index].setProperty("class", f"{base_class} {alt_class} {class_name}") refresh_widget_style(active_widgets[widget_index]) diff --git a/src/core/widgets/yasb/server_monitor.py b/src/core/widgets/yasb/server_monitor.py index 170cee8d..3b445084 100644 --- a/src/core/widgets/yasb/server_monitor.py +++ b/src/core/widgets/yasb/server_monitor.py @@ -154,8 +154,6 @@ def _toggle_menu(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 try: @@ -178,6 +176,11 @@ def _update_label(self): # Force style update self._widget_container.setStyleSheet(self._widget_container.styleSheet()) + active_label_content = active_label_content.format( + online=online_count, offline=offline_count, total=total_count + ) + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): @@ -186,8 +189,7 @@ def _update_label(self): icon = re.sub(r"|", "", part).strip() active_widgets[widget_index].setText(icon) else: - formatted_text = part.format(online=online_count, offline=offline_count, total=total_count) - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) widget_index += 1 if self.config.tooltip: set_tooltip( diff --git a/src/core/widgets/yasb/todo.py b/src/core/widgets/yasb/todo.py index 57e25bf8..7d77d886 100644 --- a/src/core/widgets/yasb/todo.py +++ b/src/core/widgets/yasb/todo.py @@ -245,15 +245,19 @@ def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] - active_tasks = self._get_filtered_tasks(completed=False) completed_tasks = self._get_filtered_tasks(completed=True) total_tasks = len(self._tasks) active_count = len(active_tasks) completed_count = len(completed_tasks) + active_label_content = active_label_content.format( + count=active_count, total=total_tasks, completed=completed_count + ) + + label_parts = re.split("(.*?)", active_label_content) + label_parts = [part for part in label_parts if part] + for widget_index, part in enumerate(label_parts): if widget_index >= len(active_widgets) or not isinstance(active_widgets[widget_index], QLabel): continue @@ -264,12 +268,7 @@ def _update_label(self): icon = re.sub(r"|", "", part).strip() current_widget.setText(icon) else: - formatted_text = ( - part.replace("{count}", str(active_count)) - .replace("{total}", str(total_tasks)) - .replace("{completed}", str(completed_count)) - ) - current_widget.setText(formatted_text) + current_widget.setText(part) widget_index += 1 # Tooltip: show number of tasks per category, skip 0s diff --git a/src/core/widgets/yasb/traffic.py b/src/core/widgets/yasb/traffic.py index 02410bec..e31d62df 100644 --- a/src/core/widgets/yasb/traffic.py +++ b/src/core/widgets/yasb/traffic.py @@ -212,26 +212,12 @@ def _update_label_with_data(self, shared_data): """Update label with provided data""" active_widgets = self._widgets_alt if self._show_alt_label else self._widgets # type: ignore active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - + active_label_content = active_label_content.format_map(shared_data) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 - label_options = [ - ("{upload_speed}", shared_data["upload_speed"]), - ("{download_speed}", shared_data["download_speed"]), - ("{today_uploaded}", shared_data["today_uploaded"]), - ("{today_downloaded}", shared_data["today_downloaded"]), - ("{session_uploaded}", shared_data["session_uploaded"]), - ("{session_downloaded}", shared_data["session_downloaded"]), - ("{alltime_uploaded}", shared_data["alltime_uploaded"]), - ("{alltime_downloaded}", shared_data["alltime_downloaded"]), - ] - for part in label_parts: part = part.strip() - for option, value in label_options: - part = part.replace(option, str(value)) if part and widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): if "" in part: diff --git a/src/core/widgets/yasb/volume.py b/src/core/widgets/yasb/volume.py index 1d2cbc8c..b69da08a 100644 --- a/src/core/widgets/yasb/volume.py +++ b/src/core/widgets/yasb/volume.py @@ -530,8 +530,6 @@ def _toggle_label(self): def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label - label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 if self.volume is None: @@ -551,8 +549,6 @@ def _update_label(self): logging.error("Failed to get volume info: %s", e) mute_status, icon_volume, level_volume = None, "", "No Device" - label_options = {"{icon}": icon_volume, "{level}": level_volume} - if self.config.progress_bar.enabled and self.progress_widget and self.volume is not None: if self._widget_container_layout.indexOf(self.progress_widget) == -1: self._widget_container_layout.insertWidget( @@ -562,19 +558,19 @@ def _update_label(self): numeric_value = int(re.search(r"\d+", level_volume).group()) if re.search(r"\d+", level_volume) else 0 self.progress_widget.set_value(numeric_value) + active_label_content = active_label_content.format(icon=icon_volume, level=level_volume) + label_parts = re.split("(.*?)", active_label_content) + for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if "" in part: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) self._set_device_state_classes(active_widgets[widget_index], mute_status == 1) else: if widget_index < len(active_widgets) and isinstance(active_widgets[widget_index], QLabel): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) self._set_device_state_classes(active_widgets[widget_index], mute_status == 1) widget_index += 1 diff --git a/src/core/widgets/yasb/weather.py b/src/core/widgets/yasb/weather.py index c305bb1c..d8355216 100644 --- a/src/core/widgets/yasb/weather.py +++ b/src/core/widgets/yasb/weather.py @@ -196,20 +196,20 @@ def handler(ev: QMouseEvent | None): frame_today.setProperty("class", "weather-card-today") layout_today = QVBoxLayout(frame_today) - today_label0 = QLabel(f"{self._weather_data['{location}']} {self._weather_data['{temp}']}") + today_label0 = QLabel(f"{self._weather_data['location']} {self._weather_data['temp']}") today_label0.setProperty("class", "label location") today_label0.setAlignment(Qt.AlignmentFlag.AlignCenter) today_label1 = QLabel( - f"Feels like {self._weather_data['{feelslike}']} - {self._weather_data['{condition_text}']} - Humidity {self._weather_data['{humidity}']}\nPressure {self._weather_data['{pressure}']} - Visibility {self._weather_data['{vis}']} - Cloud {self._weather_data['{cloud}']}%\nRain chance {self._weather_data['{daily_chance_of_rain}']} - Snow chance {self._weather_data['{daily_chance_of_snow}']}" + f"Feels like {self._weather_data['feelslike']} - {self._weather_data['condition_text']} - Humidity {self._weather_data['humidity']}\nPressure {self._weather_data['pressure']} - Visibility {self._weather_data['vis']} - Cloud {self._weather_data['cloud']}%\nRain chance {self._weather_data['daily_chance_of_rain']} - Snow chance {self._weather_data['daily_chance_of_snow']}" ) today_label1.setProperty("class", "label") today_label1.setAlignment(Qt.AlignmentFlag.AlignCenter) today_label2 = QLabel( - f"{self._weather_data['{alert_title}']}" - f"{'
Alert expires ' + self._weather_data['{alert_end_date}'] if self._weather_data['{alert_end_date}'] else ''}" - f"
{self._weather_data['{alert_desc}']}" + f"{self._weather_data['alert_title']}" + f"{'
Alert expires ' + self._weather_data['alert_end_date'] if self._weather_data['alert_end_date'] else ''}" + f"
{self._weather_data['alert_desc']}" ) today_label2.setProperty("class", "label alert") today_label2.setAlignment(Qt.AlignmentFlag.AlignCenter) @@ -217,7 +217,7 @@ def handler(ev: QMouseEvent | None): layout_today.addWidget(today_label0) layout_today.addWidget(today_label1) - if self.config.show_alerts and self._weather_data["{alert_title}"] and self._weather_data["{alert_desc}"]: + if self.config.show_alerts and self._weather_data["alert_title"] and self._weather_data["alert_desc"]: layout_today.addWidget(today_label2) @pyqtSlot(int) @@ -270,18 +270,18 @@ def switch_hourly_data(day_idx: int): frame_day.setProperty("class", "weather-card-day") if i == 0: name = "Today" - min_temp = self._weather_data["{min_temp}"] - max_temp = self._weather_data["{max_temp}"] + min_temp = self._weather_data["min_temp"] + max_temp = self._weather_data["max_temp"] else: - name = self._weather_data[f"{{day{i}_name}}"] - min_temp = self._weather_data[f"{{day{i}_min_temp}}"] - max_temp = self._weather_data[f"{{day{i}_max_temp}}"] + name = self._weather_data[f"day{i}_name"] + min_temp = self._weather_data[f"day{i}_min_temp"] + max_temp = self._weather_data[f"day{i}_max_temp"] row_day_label = QLabel(f"{name}\nMin: {min_temp}\nMax: {max_temp}", frame_day) row_day_label.setProperty("class", "label") # Create the icon label and pixmap row_day_icon_label = QLabel(frame_day) - icon_url = self._weather_data[f"{{day{i}_icon}}"] + icon_url = self._weather_data[f"day{i}_icon"] icon_data_day = self._icon_fetcher.get_icon(icon_url) if bool(icon_data_day): self._set_pixmap(row_day_icon_label, icon_data_day) @@ -408,18 +408,18 @@ def _update_label(self, update_class: bool = True): active_widgets = self._show_alt_label and self._widgets_alt or self._widgets active_label_content = self._show_alt_label and self._label_alt_content or self._label_content + active_label_content = active_label_content.format_map(self._weather_data) label_parts = re.split(r"(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] if self.config.tooltip: tooltip = ( - f"{self._weather_data['{location}']}

Temperature
" - f"Min {self._weather_data['{min_temp}']} / Max {self._weather_data['{max_temp}']}" + f"{self._weather_data['location']}

Temperature
" + f"Min {self._weather_data['min_temp']} / Max {self._weather_data['max_temp']}" ) try: - rain = self._weather_data["{hourly_chance_of_rain}"] - snow = self._weather_data["{hourly_chance_of_snow}"] + rain = self._weather_data["hourly_chance_of_rain"] + snow = self._weather_data["hourly_chance_of_snow"] if rain != "N/A" and snow != "N/A" and (float(rain.rstrip("%")) > 0 or float(snow.rstrip("%")) > 0): precip: list[str] = [] @@ -438,8 +438,6 @@ def _update_label(self, update_class: bool = True): try: for part in label_parts: part = part.strip() - for option, value in self._weather_data.items(): - part = part.replace(option, str(value)) if not part or widget_index >= len(active_widgets): continue if "" in part: @@ -449,7 +447,7 @@ def _update_label(self, update_class: bool = True): if update_class: # Retrieve current class and append new class based on weather conditions current_class = active_widgets[widget_index].property("class") or "" - append_class_icon = self._weather_data.get("{icon_class}", "") + append_class_icon = self._weather_data.get("icon_class", "") # Create the new class string new_class = f"{current_class} {append_class_icon}" active_widgets[widget_index].setProperty("class", new_class) @@ -539,54 +537,54 @@ def process_weather_data(self, weather_data: dict[str, Any]): self._weather_data = { # Current conditions - "{temp}": self._format_temp(current.temp_f, current.temp_c), - "{feelslike}": self._format_temp(current.feelslike_f, current.feelslike_c), - "{humidity}": f"{current.humidity}%", - "{cloud}": current.cloud, + "temp": self._format_temp(current.temp_f, current.temp_c), + "feelslike": self._format_temp(current.feelslike_f, current.feelslike_c), + "humidity": f"{current.humidity}%", + "cloud": current.cloud, # Forecast today - "{min_temp}": self._format_temp(forecast.mintemp_f, forecast.mintemp_c), - "{max_temp}": self._format_temp(forecast.maxtemp_f, forecast.maxtemp_c), + "min_temp": self._format_temp(forecast.mintemp_f, forecast.mintemp_c), + "max_temp": self._format_temp(forecast.maxtemp_f, forecast.maxtemp_c), # Rain/Snow chances (daily) - "{daily_chance_of_rain}": f"{forecast.daily_chance_of_rain}%", - "{daily_chance_of_snow}": f"{forecast.daily_chance_of_snow}%", + "daily_chance_of_rain": f"{forecast.daily_chance_of_rain}%", + "daily_chance_of_snow": f"{forecast.daily_chance_of_snow}%", # Rain/Snow chances (hourly) - "{hourly_chance_of_rain}": f"{hourly_rain}%", - "{hourly_chance_of_snow}": f"{hourly_snow}%", + "hourly_chance_of_rain": f"{hourly_rain}%", + "hourly_chance_of_snow": f"{hourly_snow}%", # Location and conditions - "{location}": location.name, - "{location_region}": location.region, - "{location_country}": location.country, - "{time_zone}": location.tz_id, - "{localtime}": location.localtime, - "{conditions}": conditions_data, - "{condition_text}": weather_text, - "{is_day}": "Day" if current.is_day else "Night", + "location": location.name, + "location_region": location.region, + "location_country": location.country, + "time_zone": location.tz_id, + "localtime": location.localtime, + "conditions": conditions_data, + "condition_text": weather_text, + "is_day": "Day" if current.is_day else "Night", # Icons - "{icon}": weather_icon_string, - "{icon_class}": weather_icon_string, - "{day0_icon}": f"http:{forecast.condition.icon}", + "icon": weather_icon_string, + "icon_class": weather_icon_string, + "day0_icon": f"http:{forecast.condition.icon}", # Wind data - "{wind}": self._format_measurement(current.wind_mph, "mph", current.wind_kph, "km/h"), - "{wind_dir}": current.wind_dir, - "{wind_degree}": current.wind_degree, + "wind": self._format_measurement(current.wind_mph, "mph", current.wind_kph, "km/h"), + "wind_dir": current.wind_dir, + "wind_degree": current.wind_degree, # Other measurements - "{pressure}": self._format_measurement(current.pressure_in, "in", current.pressure_mb, "mb"), - "{precip}": self._format_measurement(current.precip_in, "in", current.precip_mm, "mm"), - "{vis}": self._format_measurement(current.vis_miles, "mi", current.vis_km, "km"), - "{uv}": current.uv, + "pressure": self._format_measurement(current.pressure_in, "in", current.pressure_mb, "mb"), + "precip": self._format_measurement(current.precip_in, "in", current.precip_mm, "mm"), + "vis": self._format_measurement(current.vis_miles, "mi", current.vis_km, "km"), + "uv": current.uv, # Future forecasts - "{day1_name}": self._format_date_string(fc_day1.date), - "{day1_min_temp}": self._format_temp(fc_day1.day.mintemp_f, fc_day1.day.mintemp_c), - "{day1_max_temp}": self._format_temp(fc_day1.day.maxtemp_f, fc_day1.day.maxtemp_c), - "{day1_icon}": f"http:{fc_day1.day.condition.icon}", - "{day2_name}": self._format_date_string(fc_day2.date), - "{day2_min_temp}": self._format_temp(fc_day2.day.mintemp_f, fc_day2.day.mintemp_c), - "{day2_max_temp}": self._format_temp(fc_day2.day.maxtemp_f, fc_day2.day.maxtemp_c), - "{day2_icon}": f"http:{fc_day2.day.condition.icon}", + "day1_name": self._format_date_string(fc_day1.date), + "day1_min_temp": self._format_temp(fc_day1.day.mintemp_f, fc_day1.day.mintemp_c), + "day1_max_temp": self._format_temp(fc_day1.day.maxtemp_f, fc_day1.day.maxtemp_c), + "day1_icon": f"http:{fc_day1.day.condition.icon}", + "day2_name": self._format_date_string(fc_day2.date), + "day2_min_temp": self._format_temp(fc_day2.day.mintemp_f, fc_day2.day.mintemp_c), + "day2_max_temp": self._format_temp(fc_day2.day.maxtemp_f, fc_day2.day.maxtemp_c), + "day2_icon": f"http:{fc_day2.day.condition.icon}", # Alerts - "{alert_title}": first_alert.headline if first_alert and first_alert.headline else None, - "{alert_desc}": first_alert.desc if first_alert and first_alert.desc else None, - "{alert_end_date}": self._format_alert_datetime(first_alert.expires) + "alert_title": first_alert.headline if first_alert and first_alert.headline else None, + "alert_desc": first_alert.desc if first_alert and first_alert.desc else None, + "alert_end_date": self._format_alert_datetime(first_alert.expires) if first_alert and first_alert.expires else None, } @@ -601,45 +599,45 @@ def process_weather_data(self, weather_data: dict[str, Any]): self._has_valid_weather_data = False if self._weather_data is None: self._weather_data = { - "{temp}": "N/A", - "{min_temp}": "N/A", - "{max_temp}": "N/A", - "{daily_chance_of_rain}": "N/A", - "{daily_chance_of_snow}": "N/A", - "{hourly_chance_of_rain}": "N/A", - "{hourly_chance_of_snow}": "N/A", - "{location}": "N/A", - "{location_region}": "N/A", - "{location_country}": "N/A", - "{time_zone}": "N/A", - "{localtime}": "N/A", - "{humidity}": "N/A", - "{is_day}": "N/A", - "{day0_icon}": "N/A", - "{icon}": "N/A", - "{icon_class}": "N/A", - "{conditions}": "N/A", - "{condition_text}": "N/A", - "{wind}": "N/A", - "{wind_dir}": "N/A", - "{wind_degree}": "N/A", - "{pressure}": "N/A", - "{precip}": "N/A", - "{uv}": "N/A", - "{vis}": "N/A", - "{cloud}": "N/A", - "{feelslike}": "N/A", - "{day1_name}": "N/A", - "{day1_min_temp}": "N/A", - "{day1_max_temp}": "N/A", - "{day1_icon}": "N/A", - "{day2_name}": "N/A", - "{day2_min_temp}": "N/A", - "{day2_max_temp}": "N/A", - "{day2_icon}": "N/A", - "{alert_title}": None, - "{alert_desc}": None, - "{alert_end_date}": None, + "temp": "N/A", + "min_temp": "N/A", + "max_temp": "N/A", + "daily_chance_of_rain": "N/A", + "daily_chance_of_snow": "N/A", + "hourly_chance_of_rain": "N/A", + "hourly_chance_of_snow": "N/A", + "location": "N/A", + "location_region": "N/A", + "location_country": "N/A", + "time_zone": "N/A", + "localtime": "N/A", + "humidity": "N/A", + "is_day": "N/A", + "day0_icon": "N/A", + "icon": "N/A", + "icon_class": "N/A", + "conditions": "N/A", + "condition_text": "N/A", + "wind": "N/A", + "wind_dir": "N/A", + "wind_degree": "N/A", + "pressure": "N/A", + "precip": "N/A", + "uv": "N/A", + "vis": "N/A", + "cloud": "N/A", + "feelslike": "N/A", + "day1_name": "N/A", + "day1_min_temp": "N/A", + "day1_max_temp": "N/A", + "day1_icon": "N/A", + "day2_name": "N/A", + "day2_min_temp": "N/A", + "day2_max_temp": "N/A", + "day2_icon": "N/A", + "alert_title": None, + "alert_desc": None, + "alert_end_date": None, } diff --git a/src/core/widgets/yasb/wifi.py b/src/core/widgets/yasb/wifi.py index 4b2c0aa8..761cea68 100644 --- a/src/core/widgets/yasb/wifi.py +++ b/src/core/widgets/yasb/wifi.py @@ -158,23 +158,17 @@ def _update_label(self): active_widgets = self._widgets_alt if self._show_alt_label else self._widgets active_label_content = self.config.label_alt if self._show_alt_label else self.config.label + active_label_content = active_label_content.format( + wifi_icon=wifi_icon, wifi_name=wifi_name, wifi_strength=wifi_strength, ip_addr=ip_addr + ) label_parts = re.split("(.*?)", active_label_content) - label_parts = [part for part in label_parts if part] widget_index = 0 - label_options = { - "{wifi_icon}": wifi_icon, - "{wifi_name}": wifi_name, - "{wifi_strength}": wifi_strength, - "{ip_addr}": ip_addr, - } + for part in label_parts: part = part.strip() if part: - formatted_text = part - for option, value in label_options.items(): - formatted_text = formatted_text.replace(option, str(value)) if widget_index < len(active_widgets): - active_widgets[widget_index].setText(formatted_text) + active_widgets[widget_index].setText(part) widget_index += 1 def _get_wifi_icon(self, strength: int) -> str: