update: added new verification page

This commit is contained in:
John 2025-11-14 16:53:45 +01:00
parent 54ed907b26
commit e57e5a8c6f
2 changed files with 464 additions and 47 deletions

View file

@ -1,5 +1,5 @@
from PyQt6.QtWidgets import QComboBox,QButtonGroup, QLineEdit,QMainWindow, QLabel, QWidget, QVBoxLayout, QStackedWidget, QApplication, QPushButton, QTextEdit, QFrame, QHBoxLayout, QVBoxLayout, QScrollArea, QSystemTrayIcon, QMessageBox, QGridLayout, QCheckBox, QStackedLayout, QGroupBox, QDialog
from PyQt6.QtGui import QIcon, QPixmap,QIcon, QPixmap, QTransform, QPainter, QColor, QFont, QFontDatabase
from PyQt6.QtGui import QIcon, QPixmap,QIcon, QPixmap, QTransform, QPainter, QColor, QFont, QFontDatabase, QTextOption
from PyQt6 import QtGui
from PyQt6 import QtCore
from PyQt6.QtCore import Qt,QSize,QThread,pyqtSignal, QTimer, QPointF, QRect, QMutex, QMutexLocker, QObject
@ -148,11 +148,11 @@ class WorkerThread(QThread):
for profile_id in self.profile_data:
profile = ProfileController.get(int(profile_id))
if isinstance(profile, SessionProfile):
ProfileController.disable(profile, force=True, profile_observer=profile_observer)
ProfileController.disable(profile, ignore=True, profile_observer=profile_observer)
for profile_id in self.profile_data:
profile = ProfileController.get(int(profile_id))
if isinstance(profile, SystemProfile):
ProfileController.disable(profile, force=True, profile_observer=profile_observer)
ProfileController.disable(profile, ignore=True, profile_observer=profile_observer)
self.text_output.emit("All profiles were successfully disabled")
except Exception:
self.text_output.emit("An error occurred when disabling profile")
@ -461,6 +461,15 @@ class CustomWindow(QMainWindow):
sync_screen = self.page_stack.findChild(SyncScreen)
if status:
sync_screen.update_after_sync(available_locations, available_browsers, locations, all_browsers)
menu_page = self.page_stack.findChild(MenuPage)
if menu_page and hasattr(menu_page, 'buttons'):
for button in menu_page.buttons:
parent = button.parent()
if parent:
verification_icons = parent.findChildren(QPushButton)
for icon in verification_icons:
if icon.geometry().width() == 20 and icon.geometry().height() == 20:
icon.setEnabled(True)
else:
self.update_status('Sync failed. Please try again later.')
@ -1193,7 +1202,7 @@ class Worker(QObject):
return
if self.profile:
try:
ProfileController.enable(self.profile, force=self.force, profile_observer=profile_observer,
ProfileController.enable(self.profile, ignore=self.force, profile_observer=profile_observer,
application_version_observer=application_version_observer,
connection_observer=connection_observer)
except (InvalidSubscriptionError, MissingSubscriptionError) as e:
@ -1322,7 +1331,16 @@ class MenuPage(Page):
#self.label.setStyleSheet("background-color: rgba(0, 255, 0, 51);")
self.create_interface_elements() # Establecer el color de fondo y el color del texto utilizando hojas de estilo
def showEvent(self, event):
super().showEvent(event)
if hasattr(self, 'buttons'):
for button in self.buttons:
parent = button.parent()
if parent:
verification_icons = parent.findChildren(QPushButton)
for icon in verification_icons:
if icon.geometry().width() == 20 and icon.geometry().height() == 20:
icon.setEnabled(self.connection_manager.is_synced())
def on_update_check_finished(self):
reply = QMessageBox.question(self, 'Update Available',
@ -1467,6 +1485,8 @@ class MenuPage(Page):
self.boton_just.setEnabled(False)
self.boton_just_session.setEnabled(False)
self.boton_edit.setEnabled(False)
if hasattr(self, 'verification_button'):
self.verification_button.setEnabled(False)
self.profiles_data = self.match_core_profiles(ProfileController.get_all())
self.number_of_profiles = len(self.profiles_data)
@ -1543,6 +1563,35 @@ class MenuPage(Page):
self.buttons.append(button)
button.clicked.connect(lambda checked, pid=profile_id: self.print_profile_details(f"Profile_{pid}"))
profile = ProfileController.get(profile_id)
if profile and profile.location and profile.location.operator:
verification_icon = QPushButton(parent_label)
icon_size = 23
button_width = 175
icon_x = button_width - icon_size - 50
icon_y = 0
verification_icon.setGeometry(icon_x, icon_y, icon_size, icon_size)
verification_icon.setIcon(QIcon(os.path.join(self.btn_path, "verification_icon.png")))
verification_icon.setIconSize(QSize(icon_size, icon_size))
verification_icon.setStyleSheet(f"""
QPushButton {{
background: transparent;
border: none;
}}
QPushButton:hover {{
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}}
QPushButton:disabled {{
opacity: 0.3;
}}
""")
verification_icon.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
verification_icon.setEnabled(self.connection_manager.is_synced())
verification_icon.clicked.connect(lambda checked, pid=profile_id: self.show_profile_verification(pid))
verification_icon.show()
return button
def create_profile_name_label(self, parent_label, name):
@ -1654,6 +1703,14 @@ class MenuPage(Page):
self.boton_just.setEnabled(True)
self.boton_just_session.setEnabled(True)
self.boton_create.setEnabled(True)
if hasattr(self, 'buttons'):
for button in self.buttons:
parent = button.parent()
if parent:
verification_icons = parent.findChildren(QPushButton)
for icon in verification_icons:
if icon.geometry().width() == 20 and icon.geometry().height() == 20:
icon.setEnabled(self.connection_manager.is_synced())
#self.boton_settings.setEnabled(True)
@ -1775,6 +1832,33 @@ class MenuPage(Page):
editar_profile = {"profile_number": profile_number, "name": name, "protocol": protocol}
self.page_stack.currentWidget().add_selected_profile(editar_profile)
self.current_profile_location = location
def show_profile_verification(self, profile_id):
profile = ProfileController.get(profile_id)
if not profile or not profile.location:
return
location_key = f'{profile.location.country_code}_{profile.location.code}'
location_info = self.connection_manager.get_location_info(location_key)
if not location_info:
return
location_icon_name = None
btn_path = self.btn_path
for icon_file in os.listdir(btn_path):
if icon_file.startswith('button_') and icon_file.endswith('.png'):
icon_name = icon_file.replace('button_', '').replace('.png', '')
test_loc = self.connection_manager.get_location_info(icon_name)
if test_loc and test_loc.country_code == location_info.country_code and test_loc.code == location_info.code:
location_icon_name = icon_name
break
if location_icon_name:
verification_page = LocationVerificationPage(self.page_stack, self.update_status, location_icon_name, self)
self.page_stack.addWidget(verification_page)
self.page_stack.setCurrentIndex(self.page_stack.indexOf(verification_page))
def launch(self):
pass
@ -2834,6 +2918,7 @@ class HidetorPage(Page):
self.display.setGeometry(QtCore.QRect(5, 10, 390, 520))
self.title.setGeometry(395, 40, 380, 40); self.title.setText("Pick a location")
def create_interface_elements(self, available_locations):
self.buttonGroup = QButtonGroup(self)
self.buttons = []
@ -2849,7 +2934,7 @@ class HidetorPage(Page):
icon_path = os.path.join(self.btn_path, f"button_{icon_name}.png")
boton.setIcon(QIcon(icon_path))
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
if boton.icon().isNull():
if locations and hasattr(locations, 'country_name'):
base_image = LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', fallback_path, provider)
@ -2866,7 +2951,32 @@ class HidetorPage(Page):
boton.setIcon(QIcon(base_image))
self.buttons.append(boton)
self.buttonGroup.addButton(boton, j)
boton.clicked.connect(lambda _, location=icon_name: self.show_location(location))
boton.location_icon_name = icon_name
boton.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
boton.clicked.connect(lambda checked, loc=icon_name: self.show_location(loc))
if locations and locations.operator:
verification_icon = QPushButton(self)
icon_size = 30
button_x, button_y, button_width, button_height = geometry
icon_x = button_x + button_width - icon_size + 10
icon_y = button_y
verification_icon.setGeometry(icon_x, icon_y, icon_size, icon_size)
verification_icon.setIcon(QIcon(os.path.join(self.btn_path, "verification_icon.png")))
verification_icon.setIconSize(QSize(icon_size - 4, icon_size - 4))
verification_icon.setStyleSheet(f"""
QPushButton {{
background: transparent;
border: none;
}}
QPushButton:hover {{
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}}
""")
verification_icon.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
verification_icon.clicked.connect(lambda checked, loc=icon_name: self.show_location_verification(loc))
verification_icon.show()
def update_swarp_json(self):
inserted_data = {
@ -2882,12 +2992,18 @@ class HidetorPage(Page):
self.button_next.setVisible(True)
self.update_swarp_json()
def reverse(self):
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(ProtocolPage)))
def go_selected(self):
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(BrowserPage)))
def show_location_verification(self, location_icon_name):
verification_page = LocationVerificationPage(self.page_stack, self.update_status, location_icon_name, self)
self.page_stack.addWidget(verification_page)
self.page_stack.setCurrentIndex(self.page_stack.indexOf(verification_page))
class ResidentialPage(Page):
def __init__(self, page_stack, main_window, parent=None):
super().__init__("Wireguard", page_stack, main_window, parent)
@ -3140,6 +3256,8 @@ class LocationPage(Page):
self.button_next.setVisible(False)
for button in self.buttons:
button.setChecked(False)
if hasattr(self, 'verification_button'):
self.verification_button.setEnabled(False)
def create_interface_elements(self, available_locations):
self.buttonGroup = QButtonGroup(self)
@ -3155,7 +3273,7 @@ class LocationPage(Page):
icon_path = os.path.join(self.btn_path, f"button_{icon_name}.png")
boton.setIcon(QIcon(icon_path))
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
if boton.icon().isNull():
if locations and hasattr(locations, 'country_name'):
base_image = LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', fallback_path, provider)
@ -3173,7 +3291,32 @@ class LocationPage(Page):
self.buttons.append(boton)
self.buttonGroup.addButton(boton, j)
boton.clicked.connect(lambda _, location=icon_name: self.show_location(location))
boton.location_icon_name = icon_name
boton.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
boton.clicked.connect(lambda checked, loc=icon_name: self.show_location(loc))
if locations and locations.operator:
verification_icon = QPushButton(self)
icon_size = 30
button_x, button_y, button_width, button_height = geometry
icon_x = button_x + button_width - icon_size + 10
icon_y = button_y
verification_icon.setGeometry(icon_x, icon_y, icon_size, icon_size)
verification_icon.setIcon(QIcon(os.path.join(self.btn_path, "verification_icon.png")))
verification_icon.setIconSize(QSize(icon_size - 4, icon_size - 4))
verification_icon.setStyleSheet(f"""
QPushButton {{
background: transparent;
border: none;
}}
QPushButton:hover {{
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
}}
""")
verification_icon.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
verification_icon.clicked.connect(lambda checked, loc=icon_name: self.show_location_verification(loc))
verification_icon.show()
def update_swarp_json(self, get_connection=False):
profile_data = self.update_status.read_data()
@ -3194,6 +3337,7 @@ class LocationPage(Page):
self.button_next.clicked.connect(self.go_selected)
self.update_swarp_json()
def reverse(self):
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(ProtocolPage)))
@ -3203,6 +3347,11 @@ class LocationPage(Page):
else:
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(BrowserPage)))
def show_location_verification(self, location_icon_name):
verification_page = LocationVerificationPage(self.page_stack, self.update_status, location_icon_name, self)
self.page_stack.addWidget(verification_page)
self.page_stack.setCurrentIndex(self.page_stack.indexOf(verification_page))
@staticmethod
def create_location_button_image(location_name, fallback_image_path, provider=None, existing_icon_path=None):
if existing_icon_path:
@ -3273,22 +3422,30 @@ class LocationPage(Page):
painter.setTransform(QTransform())
if provider:
provider_font = QApplication.font()
provider_font.setPointSize(8)
provider_font.setWeight(QFont.Weight.Normal)
painter.setFont(provider_font)
provider_label_font = QApplication.font()
provider_label_font.setPointSize(8)
provider_label_font.setWeight(QFont.Weight.Bold)
painter.setFont(provider_label_font)
painter.setPen(QColor(128, 128, 128))
provider_label = "Provider:"
provider_label_rect = painter.fontMetrics().boundingRect(provider_label)
provider_text_font = QApplication.font()
provider_text_font.setPointSize(7)
provider_text_font.setWeight(QFont.Weight.Normal)
painter.setFont(provider_text_font)
provider_text_rect = painter.fontMetrics().boundingRect(provider)
provider_x = ((base_image.width() - max(provider_label_rect.width(), provider_text_rect.width())) // 2) - 30
provider_y = 50
px = int(provider_x)
py = int(provider_y)
painter.drawText(px, py, provider_label)
painter.drawText(px, py + provider_label_rect.height() + 2, provider)
painter.setFont(provider_label_font)
painter.drawText(px + 20, py + 2, provider_label)
painter.setFont(provider_text_font)
painter.drawText(px + 5, py + provider_label_rect.height() + 2, provider)
finally:
painter.end()
return base_image
@ -3795,6 +3952,11 @@ class ResumePage(Page):
else:
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(ScreenPage)))
def show_location_verification(self, location_icon_name):
verification_page = LocationVerificationPage(self.page_stack, self.update_status, location_icon_name, self)
self.page_stack.addWidget(verification_page)
self.page_stack.setCurrentIndex(self.page_stack.indexOf(verification_page))
def create_arrow(self):
self.arrow_label = QLabel(self)
self.arrow_label.setGeometry(400, 115, 200, 200)
@ -3824,7 +3986,7 @@ class ResumePage(Page):
if os.path.exists(icon_path):
label.setPixmap(QPixmap(icon_path))
locations = self.connection_manager.get_location_info(icon_name)
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
if label.pixmap().isNull():
if locations and hasattr(locations, 'country_name'):
label.setPixmap(LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', os.path.join(self.btn_path, "default_location_button.png"), provider))
@ -3884,26 +4046,32 @@ class ResumePage(Page):
elif item == 'location':
icon_path = os.path.join(self.btn_path, f"button_{text}.png")
geometry = (585, initial_y + i * label_height, 185, 75)
parent_label = QLabel(self)
parent_label = QPushButton(self)
parent_label.setGeometry(*geometry)
parent_label.setPixmap(QPixmap(icon_path))
parent_label.setFlat(True)
parent_label.setStyleSheet("background: transparent; border: none;")
location_pixmap = QPixmap(icon_path)
locations = self.connection_manager.get_location_info(text)
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
if parent_label.pixmap().isNull():
if location_pixmap.isNull():
if locations and hasattr(locations, 'country_name'):
base_image = LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', fallback_path, provider)
parent_label.setPixmap(base_image)
parent_label.setIcon(QIcon(base_image))
else:
base_image = LocationPage.create_location_button_image('', fallback_path, provider)
parent_label.setPixmap(base_image)
parent_label.setIcon(QIcon(base_image))
else:
if locations and hasattr(locations, 'country_name'):
base_image = LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', fallback_path, provider, icon_path)
parent_label.setPixmap(base_image)
parent_label.setIcon(QIcon(base_image))
else:
base_image = LocationPage.create_location_button_image('', fallback_path, provider, icon_path)
parent_label.setPixmap(base_image)
parent_label.setIcon(QIcon(base_image))
parent_label.setIconSize(QSize(185, 75))
parent_label.location_icon_name = text
parent_label.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
parent_label.clicked.connect(lambda checked, loc=text: self.show_location_verification(loc))
parent_label.show()
self.labels_creados.append(parent_label)
elif item == 'dimentions':
@ -4340,7 +4508,7 @@ class EditorPage(Page):
image_path = os.path.join(self.btn_path, f"button_{current_value}.png")
base_image = QPixmap(image_path)
locations = self.connection_manager.get_location_info(current_value)
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
if base_image.isNull():
if locations and hasattr(locations, 'country_name'):
@ -4705,6 +4873,237 @@ class EditorPage(Page):
resume_page = self.find_resume_page()
if resume_page:
resume_page.handle_core_action_create_profile('CREATE_SESSION_PROFILE', profile_data, 'session')
class LocationVerificationPage(Page):
def __init__(self, page_stack, main_window, location_icon_name, previous_page, parent=None):
super().__init__("LocationVerification", page_stack, main_window, parent)
self.location_icon_name = location_icon_name
self.previous_page = previous_page
self.connection_manager = main_window.connection_manager
self.font_style = f"font-family: '{main_window.open_sans_family}';"
self.verification_info = {}
self.verification_checkmarks = {}
self.verification_full_values = {}
self.verification_labels = {}
self.verification_copy_buttons = {}
self.verification_display_names = {
"operator_name": "Operator Name",
"nostr_public_key": "Nostr Key",
"hydraveil_public_key": "HydraVeil Key",
"nostr_attestation_event_reference": "Nostr Verification"
}
self.setup_ui()
def setup_ui(self):
location_display = QLabel(self)
location_display.setGeometry(10, 0, 390, 520)
location_display.setAlignment(Qt.AlignmentFlag.AlignCenter)
icon_path = os.path.join(self.btn_path, f"icon_{self.location_icon_name}.png")
location_pixmap = QPixmap(icon_path)
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
if location_pixmap.isNull():
location_pixmap = QPixmap(fallback_path)
location_display.setPixmap(location_pixmap.scaled(390, 520, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation))
location_display.show()
title = QLabel("Verification Information", self)
title.setGeometry(350, 50, 350, 30)
title.setStyleSheet(f"color: #808080; font-size: 20px; font-weight: bold; {self.font_style}")
title.show()
info_items = [
("Operator Name", "operator_name", 130),
("Nostr Key", "nostr_public_key", 180),
("HydraVeil Key", "hydraveil_public_key", 230),
("Nostr Verification", "nostr_attestation_event_reference", 280),
]
label_x = 350
label_width = 150
label_height = 30
value_x = 510
value_width = 210
value_height = 30
checkmark_x = 725
checkmark_width = 30
checkmark_height = 30
copy_button_x = 750
copy_button_width = 30
copy_button_height = 30
for label_text, key, y_pos in info_items:
label_widget = QLabel(label_text + ":", self)
label_widget.setGeometry(label_x, y_pos, label_width, label_height)
label_widget.setStyleSheet(f"color: white; font-size: 18px; {self.font_style}")
label_widget.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter)
label_widget.show()
self.verification_labels[key] = label_widget
value_widget = QLabel("N/A", self)
value_widget.setGeometry(value_x, y_pos, value_width, value_height)
value_widget.setStyleSheet(f"color: white; font-size: 16px; {self.font_style}")
value_widget.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter)
value_widget.show()
checkmark_widget = QLabel("", self)
checkmark_widget.setGeometry(checkmark_x, y_pos, checkmark_width, checkmark_height)
checkmark_widget.setStyleSheet(f"color: #4CAF50; font-size: 28px; font-weight: bold; {self.font_style}")
checkmark_widget.setAlignment(Qt.AlignmentFlag.AlignCenter)
checkmark_widget.hide()
self.verification_info[key] = value_widget
self.verification_checkmarks[key] = checkmark_widget
copy_button = QPushButton(self)
copy_button.setGeometry(copy_button_x, y_pos, copy_button_width, copy_button_height)
copy_button.setIcon(QIcon(os.path.join(self.btn_path, "paste_button.png")))
copy_button.setIconSize(QSize(24, 24))
copy_button.setStyleSheet(f"""
QPushButton {{
background: transparent;
border: none;
}}
QPushButton:hover {{
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}}
""")
copy_button.clicked.connect(lambda checked=False, k=key: self.copy_verification_value(k))
copy_button.show()
self.verification_copy_buttons[key] = copy_button
self.back_button = QPushButton(self)
self.back_button.setGeometry(720, 525, 48, 35)
self.back_button.setIcon(QIcon(os.path.join(self.btn_path, "back.png")))
self.back_button.setIconSize(QSize(48, 35))
self.back_button.setStyleSheet(f"""
QPushButton {{
background: transparent;
border: none;
}}
QPushButton:hover {{
background: rgba(255, 255, 255, 0.1);
border-radius: 4px;
}}
""")
self.back_button.clicked.connect(self.go_back)
self.back_button.show()
self.update_verification_info()
def truncate_text_by_width(self, text, widget, max_width):
if not text or text == "N/A":
return text
metrics = widget.fontMetrics()
text_width = metrics.horizontalAdvance(text)
if text_width <= max_width:
return text
ellipsis = "..."
ellipsis_width = metrics.horizontalAdvance(ellipsis)
available_width = max_width - ellipsis_width
if available_width <= 0:
return ellipsis
start_chars = 1
end_chars = 1
while True:
start_text = text[:start_chars]
end_text = text[-end_chars:]
combined_width = metrics.horizontalAdvance(start_text + ellipsis + end_text)
if combined_width <= max_width:
if start_chars + end_chars >= len(text):
return text
start_chars += 1
if start_chars + end_chars >= len(text):
return text
end_chars += 1
else:
if start_chars > 1:
start_chars -= 1
if end_chars > 1:
end_chars -= 1
break
if start_chars + end_chars >= len(text):
return text
return text[:start_chars] + ellipsis + text[-end_chars:]
def update_verification_info(self):
locations = self.connection_manager.get_location_info(self.location_icon_name)
value_width = 210
if not locations:
for key, widget in self.verification_info.items():
widget.setText("N/A")
self.verification_full_values[key] = "N/A"
if key in self.verification_checkmarks:
self.verification_checkmarks[key].hide()
return
operator = None
if locations.operator:
operator = locations.operator
if operator:
operator_name = operator.name or "N/A"
self.verification_full_values["operator_name"] = operator_name
display_operator = self.truncate_text_by_width(operator_name, self.verification_info["operator_name"], value_width)
self.verification_info["operator_name"].setText(display_operator)
nostr_key = operator.nostr_public_key or "N/A"
self.verification_full_values["nostr_public_key"] = nostr_key
display_nostr = self.truncate_text_by_width(nostr_key, self.verification_info["nostr_public_key"], value_width)
self.verification_info["nostr_public_key"].setText(display_nostr)
hydraveil_key = operator.public_key or "N/A"
self.verification_full_values["hydraveil_public_key"] = hydraveil_key
display_hydraveil = self.truncate_text_by_width(hydraveil_key, self.verification_info["hydraveil_public_key"], value_width)
self.verification_info["hydraveil_public_key"].setText(display_hydraveil)
nostr_verification = operator.nostr_attestation_event_reference or "N/A"
self.verification_full_values["nostr_attestation_event_reference"] = nostr_verification
display_nostr_verif = self.truncate_text_by_width(nostr_verification, self.verification_info["nostr_attestation_event_reference"], value_width)
self.verification_info["nostr_attestation_event_reference"].setText(display_nostr_verif)
else:
self.verification_info["operator_name"].setText("N/A")
self.verification_full_values["operator_name"] = "N/A"
self.verification_info["nostr_public_key"].setText("N/A")
self.verification_full_values["nostr_public_key"] = "N/A"
self.verification_info["hydraveil_public_key"].setText("N/A")
self.verification_full_values["hydraveil_public_key"] = "N/A"
self.verification_info["nostr_attestation_event_reference"].setText("N/A")
self.verification_full_values["nostr_attestation_event_reference"] = "N/A"
for key, widget in self.verification_info.items():
if key in self.verification_checkmarks:
full_value = self.verification_full_values.get(key, "")
if full_value and full_value != "N/A":
self.verification_checkmarks[key].show()
else:
self.verification_checkmarks[key].hide()
def copy_verification_value(self, key):
full_value = self.verification_full_values.get(key, "")
if full_value and full_value != "N/A":
clipboard = QApplication.clipboard()
clipboard.setText(full_value)
display_name = self.verification_display_names.get(key, "Verification value")
self.custom_window.update_status(f"{display_name} copied to clipboard")
def go_back(self):
if self.previous_page:
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.previous_page))
class Settings(Page):
def __init__(self, page_stack, main_window, parent=None):
super().__init__("Settings", page_stack, main_window, parent)
@ -5789,7 +6188,6 @@ class Settings(Page):
checkmark_widget.hide()
container_layout.addWidget(checkmark_widget)
if key == "nostr_attestation_event_reference":
copy_button = QPushButton()
copy_button.setIcon(QIcon(os.path.join(self.btn_path, "paste_button.png")))
copy_button.setIconSize(QSize(24, 24))
@ -5896,7 +6294,14 @@ class Settings(Page):
if full_value and full_value != "N/A":
clipboard = QApplication.clipboard()
clipboard.setText(full_value)
self.update_status.update_status("Verification value copied to clipboard")
verification_display_names = {
"operator_name": "Operator Name",
"nostr_public_key": "Nostr Key",
"hydraveil_public_key": "HydraVeil Key",
"nostr_attestation_event_reference": "Nostr Verification"
}
display_name = verification_display_names.get(key, "Verification value")
self.update_status.update_status(f"{display_name} copied to clipboard")
def update_subscription_info(self, index):
if index < 0:
@ -7735,15 +8140,18 @@ class FastRegistrationPage(Page):
self.buttons.append(next_button)
def create_location_section(self):
label = QLabel("Location", self)
label = QPushButton(self)
label.setGeometry(435, 250, 185, 75)
label.setFlat(True)
label.setStyleSheet("background: transparent; border: none;")
if self.selected_values['location']:
image_path = os.path.join(self.btn_path, f"button_{self.selected_values['location']}.png")
location_image = QPixmap(image_path)
locations = self.connection_manager.get_location_info(self.selected_values['location'])
provider = locations.provider_name if locations and hasattr(locations, 'provider_name') else None
provider = locations.operator.name if locations and hasattr(locations, 'operator') else None
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
if location_image.isNull():
if locations and hasattr(locations, 'country_name'):
location_image = LocationPage.create_location_button_image(f'{locations.country_code}_{locations.code}', fallback_path, provider)
@ -7757,8 +8165,12 @@ class FastRegistrationPage(Page):
else:
location_image = QPixmap(os.path.join(self.btn_path, "default_location_button.png"))
label.setPixmap(location_image)
label.setScaledContents(True)
label.setIcon(QIcon(location_image))
label.setIconSize(QSize(185, 75))
if self.selected_values['location']:
label.location_icon_name = self.selected_values['location']
label.setCursor(QtCore.Qt.CursorShape.PointingHandCursor)
label.clicked.connect(lambda checked, loc=self.selected_values['location']: self.show_location_verification(loc))
label.show()
self.labels.append(label)
@ -7954,6 +8366,11 @@ class FastRegistrationPage(Page):
def go_back(self):
self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(MenuPage)))
def show_location_verification(self, location_icon_name):
verification_page = LocationVerificationPage(self.page_stack, self.update_status, location_icon_name, self)
self.page_stack.addWidget(verification_page)
self.page_stack.setCurrentIndex(self.page_stack.indexOf(verification_page))
def create_profile(self):
profile_name = self.name.text()
if not profile_name:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB