From 498891d6556bf2c47977c70280aa9ccdca5b9c67 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 25 Jun 2025 02:14:51 +0100 Subject: [PATCH] Changed dynamic text on buttons --- gui/__main__.py | 142 ++++++++++++++++-- .../images/default_browser_button.png | Bin 6467 -> 4880 bytes .../images/default_location_button.png | Bin 2911 -> 2289 bytes 3 files changed, 127 insertions(+), 15 deletions(-) diff --git a/gui/__main__.py b/gui/__main__.py index 42e0dd4..8e0148b 100644 --- a/gui/__main__.py +++ b/gui/__main__.py @@ -2717,6 +2717,7 @@ class HidetorPage(Page): def __init__(self, page_stack, main_window, parent=None): super().__init__("HideTor", page_stack, main_window, parent) self.selected_location_icon = None + self.connection_manager = main_window.connection_manager self.update_status = main_window self.button_next.clicked.connect(self.go_selected) self.button_reverse.setVisible(True) @@ -2733,11 +2734,17 @@ class HidetorPage(Page): boton.setGeometry(*geometry) boton.setIconSize(boton.size()) boton.setCheckable(True) + locations = self.connection_manager.get_location_info(icon_name) if icon_name == 'my_14': boton.setVisible(False) boton.setIcon(QIcon(os.path.join(self.btn_path, f"button_{icon_name}.png"))) if boton.icon().isNull(): - boton.setIcon(QIcon(os.path.join(self.btn_path, "default_location_button.png"))) + fallback_path = os.path.join(self.btn_path, "default_location_button.png") + if locations and hasattr(locations, 'country_name'): + base_image = LocationPage.create_location_button_image(locations.country_name, fallback_path) + boton.setIcon(QIcon(base_image)) + else: + boton.setIcon(QIcon(fallback_path)) self.buttons.append(boton) self.buttonGroup.addButton(boton, j) boton.clicked.connect(lambda _, location=icon_name: self.show_location(location)) @@ -2999,6 +3006,7 @@ class LocationPage(Page): self.selected_location_icon = None self.update_status = main_window self.button_reverse.setVisible(True) + self.connection_manager = main_window.connection_manager self.button_reverse.clicked.connect(self.reverse) self.display.setGeometry(QtCore.QRect(5, 10, 390, 520)) self.title.setGeometry(395, 40, 380, 40); self.title.setText("Pick a location") @@ -3019,16 +3027,23 @@ class LocationPage(Page): def create_interface_elements(self, available_locations): self.buttonGroup = QButtonGroup(self) self.buttons = [] - + for j, (object_type, icon_name, geometry) in enumerate(available_locations): boton = object_type(self) boton.setGeometry(*geometry) boton.setIconSize(boton.size()) boton.setCheckable(True) + + locations = self.connection_manager.get_location_info(icon_name) boton.setIcon(QIcon(os.path.join(self.btn_path, f"button_{icon_name}.png"))) if boton.icon().isNull(): fallback_path = os.path.join(self.btn_path, "default_location_button.png") - boton.setIcon(QIcon(fallback_path)) + if locations and hasattr(locations, 'country_name'): + base_image = LocationPage.create_location_button_image(locations.country_name, fallback_path) + boton.setIcon(QIcon(base_image)) + else: + boton.setIcon(QIcon(fallback_path)) + self.buttons.append(boton) self.buttonGroup.addButton(boton, j) boton.clicked.connect(lambda _, location=icon_name: self.show_location(location)) @@ -3061,6 +3076,71 @@ class LocationPage(Page): else: self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(BrowserPage))) + @staticmethod + def create_location_button_image(location_name, fallback_image_path): + + base_image = QPixmap(fallback_image_path) + if base_image.isNull(): + return base_image + + painter = QPainter(base_image) + + font_size = 12 + + app_font = QApplication.font() + app_font.setPointSize(font_size) + app_font.setWeight(QFont.Weight.Bold) + yscale = 0 + text_length = len(location_name) + + if text_length <= 10: + font_stretch = 100 + text_width_scale = 1.1 + text_height_scale = 1.4 + elif text_length <= 15: + font_stretch = 90 + text_width_scale = 1.0 + text_height_scale = 2 + else: + font_stretch = 100 + text_width_scale = 1.1 + text_height_scale = 4.5 + yscale = 5 + + app_font.setStretch(font_stretch) + painter.setFont(app_font) + painter.setPen(QColor(0, 255, 255)) + + text_rect = painter.fontMetrics().boundingRect(location_name) + max_width = 110 + + while text_rect.width() > max_width: + font_size -= 1 + app_font.setPointSize(font_size) + app_font.setWeight(QFont.Weight.Bold) + painter.setFont(app_font) + text_rect = painter.fontMetrics().boundingRect(location_name) + + x = ((base_image.width() - text_rect.width()) // 2 ) - 20 + y = ((base_image.height() + text_rect.height()) // 2 ) + yscale + + from PyQt6.QtGui import QTransform + transform = QTransform() + transform.scale(text_width_scale, text_height_scale) + painter.setTransform(transform) + + x_scaled = int(x / text_width_scale) + y_scaled = int(y / text_height_scale) + + shadow_offset = 1 + painter.setPen(QColor(0, 0, 0)) + painter.drawText(x_scaled + shadow_offset, y_scaled + shadow_offset, location_name) + + painter.setPen(QColor(0, 255, 255)) + painter.drawText(x_scaled, y_scaled, location_name) + + painter.end() + return base_image class BrowserPage(Page): def __init__(self, page_stack, main_window, parent=None): @@ -3156,7 +3236,7 @@ class BrowserPage(Page): button.setIcon(QIcon(BrowserPage.create_browser_button_image(f"{browser_name} {version}", self.btn_path))) if button.icon().isNull(): fallback_path = os.path.join(self.btn_path, "default_browser_button.png") - button.setIcon(QIcon(fallback_path)) + button.setIcon(QIcon(BrowserPage.create_browser_button_image(f"{browser_name} {version}", fallback_path, True))) self._apply_button_style(button) self.buttons.append(button) @@ -3164,18 +3244,37 @@ class BrowserPage(Page): button.clicked.connect(lambda _, b=icon_name: self.show_browser(b.replace(':', ' '))) @staticmethod - def create_browser_button_image(browser_text, btn_path): + def create_browser_button_image(browser_text, btn_path, is_fallback=False): + browser_name, version = browser_text.split()[0], ' '.join(browser_text.split()[1:]) - base_image = QPixmap(os.path.join(btn_path, f"{browser_name}_button.png")) + if is_fallback: + base_image = QPixmap(btn_path) + else: + base_image = QPixmap(os.path.join(btn_path, f"{browser_name}_button.png")) painter = QPainter(base_image) BrowserPage._setup_version_font(painter, version, base_image) - text_rect = painter.fontMetrics().boundingRect(version) - x = (base_image.width() - text_rect.width()) // 2 - 27 - y = (base_image.height() + text_rect.height()) // 2 + 10 - painter.drawText(x, y, version) + if is_fallback: + BrowserPage._setup_browser_name(painter, browser_name, base_image) painter.end() return base_image + @staticmethod + def _setup_browser_name(painter, browser_name, base_image): + font_size = 13 + app_font = QApplication.font() + app_font.setPointSize(font_size) + app_font.setWeight(QFont.Weight.Bold) + painter.setFont(app_font) + painter.setPen(QColor(0, 255, 255)) + text_rect = painter.fontMetrics().boundingRect(browser_name) + while text_rect.width() > base_image.width() * 0.6 and font_size > 6: + font_size -= 1 + + x = (base_image.width() - text_rect.width()) // 2 - 30 + y = (base_image.height() + text_rect.height()) // 2 - 10 + painter.drawText(x, y, browser_name) + + @staticmethod def _setup_version_font(painter, version, base_image): font_size = 11 @@ -3187,6 +3286,10 @@ class BrowserPage(Page): painter.setFont(QFont('Arial', font_size)) text_rect = painter.fontMetrics().boundingRect(version) + x = (base_image.width() - text_rect.width()) // 2 - 27 + y = (base_image.height() + text_rect.height()) // 2 + 10 + painter.drawText(x, y, version) + def _apply_button_style(self, button): button.setStyleSheet(""" QPushButton { @@ -3335,7 +3438,8 @@ class ResumePage(Page): if os.path.exists(icon_path): label.setPixmap(QPixmap(icon_path)) if label.pixmap().isNull(): - label.setPixmap(QPixmap(os.path.join(self.btn_path, "default_location_button.png"))) + locations = self.connection_manager.get_location_info(icon_name) + label.setPixmap(LocationPage.create_location_button_image(locations.country_name, os.path.join(self.btn_path, "default_location_button.png"))) elif object_type == QLineEdit: self.line_edit = object_type(self) # Define line_edit como un atributo de la clase ResumePage self.line_edit.setGeometry(*geometry) @@ -3377,7 +3481,9 @@ class ResumePage(Page): parent_label.setGeometry(*geometry) parent_label.setPixmap(base_image) if parent_label.pixmap().isNull(): - parent_label.setPixmap(QPixmap(os.path.join(self.btn_path, "default_browser_button.png"))) + fallback_path = os.path.join(self.btn_path, "default_browser_button.png") + base_image = BrowserPage.create_browser_button_image(text, fallback_path, True) + parent_label.setPixmap(base_image) parent_label.show() self.labels_creados.append(parent_label) elif item == 'location': @@ -3387,7 +3493,10 @@ class ResumePage(Page): parent_label.setGeometry(*geometry) parent_label.setPixmap(QPixmap(icon_path)) if parent_label.pixmap().isNull(): - parent_label.setPixmap(QPixmap(os.path.join(self.btn_path, "default_location_button.png"))) + locations = self.connection_manager.get_location_info(text) + fallback_path = os.path.join(self.btn_path, "default_location_button.png") + base_image = LocationPage.create_location_button_image(locations.country_name, fallback_path) + parent_label.setPixmap(base_image) parent_label.show() self.labels_creados.append(parent_label) else: @@ -3790,13 +3899,16 @@ class EditorPage(Page): else: base_image = BrowserPage.create_browser_button_image(browser_value, self.btn_path) if base_image.isNull(): - base_image = QPixmap(os.path.join(self.btn_path, "default_browser_button.png")) + fallback_path = os.path.join(self.btn_path, "default_browser_button.png") + base_image = BrowserPage.create_browser_button_image(browser_value, fallback_path, True) elif key == 'location': current_value = f"{data_profile.get(key, '')}" image_path = os.path.join(self.btn_path, f"button_{current_value}.png") base_image = QPixmap(image_path) if base_image.isNull(): - base_image = QPixmap(os.path.join(self.btn_path, "default_location_button.png")) + locations = self.connection_manager.get_location_info(current_value) + fallback_path = os.path.join(self.btn_path, "default_location_button.png") + base_image = LocationPage.create_location_button_image(locations.country_name, fallback_path) else: image_path = os.path.join(self.btn_path, f"{data_profile.get(key, '')}_button.png") current_value = data_profile.get(key, '') diff --git a/gui/resources/images/default_browser_button.png b/gui/resources/images/default_browser_button.png index 6d6a1c1b8d3fb8ab0289d0f6931a1a796f05f655..18d301908609cc2b408b6acccdd7376d62e2b86d 100644 GIT binary patch delta 4877 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 diff --git a/gui/resources/images/default_location_button.png b/gui/resources/images/default_location_button.png index d7c1c657467edf9b735be211e61bf94985404f5b..5d8b5b4830342bd25b5e06ff246b187a66a53704 100644 GIT binary patch delta 2265 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 q7YDh4FvTG_2@fQjA#u0000