Added larger resolutions / custom resolutions
275
gui/__main__.py
|
@ -1959,7 +1959,7 @@ class ConnectionManager:
|
||||||
self._is_synced = False
|
self._is_synced = False
|
||||||
self._is_profile_being_enabled = {}
|
self._is_profile_being_enabled = {}
|
||||||
self.profile_button_objects = {}
|
self.profile_button_objects = {}
|
||||||
|
self.available_resolutions = ['800x600', '1024x760', '1152x1080', '1280x1024', '1920x1080', '2560x1440', '2560x1600', '1920x1440', '1792x1344', '2048x1152']
|
||||||
self._location_list = []
|
self._location_list = []
|
||||||
self._browser_list = []
|
self._browser_list = []
|
||||||
|
|
||||||
|
@ -1969,7 +1969,14 @@ class ConnectionManager:
|
||||||
def set_profile_button_objects(self, profile_id, profile_button_objects):
|
def set_profile_button_objects(self, profile_id, profile_button_objects):
|
||||||
self.profile_button_objects[profile_id] = profile_button_objects
|
self.profile_button_objects[profile_id] = profile_button_objects
|
||||||
|
|
||||||
|
def get_available_resolutions(self, profile_id):
|
||||||
|
profile = ProfileController.get(profile_id)
|
||||||
|
if profile and hasattr(profile, 'resolution') and profile.resolution:
|
||||||
|
self.available_resolutions.append(profile.resolution)
|
||||||
|
return self.available_resolutions
|
||||||
|
|
||||||
|
def add_custom_resolution(self, resolution):
|
||||||
|
self.available_resolutions.append(resolution)
|
||||||
|
|
||||||
def add_connected_profile(self, profile_id):
|
def add_connected_profile(self, profile_id):
|
||||||
self._connected_profiles.add(profile_id)
|
self._connected_profiles.add(profile_id)
|
||||||
|
@ -3355,28 +3362,209 @@ class ScreenPage(Page):
|
||||||
self.selected_dimentions_icon = None
|
self.selected_dimentions_icon = None
|
||||||
self.button_back.setVisible(True)
|
self.button_back.setVisible(True)
|
||||||
self.title.setGeometry(585, 40, 200, 40); self.title.setText("Pick a Resolution")
|
self.title.setGeometry(585, 40, 200, 40); self.title.setText("Pick a Resolution")
|
||||||
self.display.setGeometry(QtCore.QRect(5, 50, 580, 435))#relacion 4:3
|
self.display.setGeometry(QtCore.QRect(5, 50, 580, 435))
|
||||||
|
self.showing_larger_resolutions = False
|
||||||
|
self.larger_resolution_buttons = []
|
||||||
self.create_interface_elements()
|
self.create_interface_elements()
|
||||||
|
|
||||||
def create_interface_elements(self):
|
def create_interface_elements(self):
|
||||||
self.buttonGroup = QButtonGroup(self)
|
self.buttonGroup = QButtonGroup(self)
|
||||||
self.buttons = []
|
self.buttons = []
|
||||||
for j, (object_type, icon_name, geometry) in enumerate([
|
for j, (object_type, icon_name, geometry) in enumerate([
|
||||||
(QPushButton, "800x600", (585, 90, 185, 75)),
|
(QPushButton, "800x600", (595, 90, 180, 70)),
|
||||||
(QPushButton, "1024x760", (585, 170, 185, 75)),
|
(QPushButton, "1024x760", (595, 170, 180, 70)),
|
||||||
(QPushButton, "1152x1080", (585, 250, 185, 75)),
|
(QPushButton, "1152x1080", (595, 250, 180, 70)),
|
||||||
(QPushButton, "1280x1024", (585, 330, 185, 75)),
|
(QPushButton, "1280x1024", (595, 330, 180, 70)),
|
||||||
(QPushButton, "1920x1080", (585, 410, 185, 75))
|
(QPushButton, "1920x1080", (595, 410, 180, 70))
|
||||||
]):
|
]):
|
||||||
boton = object_type(self)
|
boton = object_type(self)
|
||||||
boton.setGeometry(*geometry)
|
boton.setGeometry(*geometry)
|
||||||
boton.setIconSize(boton.size())
|
boton.setIconSize(boton.size())
|
||||||
boton.setCheckable(True)
|
boton.setCheckable(True)
|
||||||
boton.setIcon(QIcon(os.path.join(self.btn_path, f"{icon_name}_button.png")))
|
boton.setIcon(QIcon(self.create_resolution_button_image(icon_name)))
|
||||||
self.buttons.append(boton)
|
self.buttons.append(boton)
|
||||||
self.buttonGroup.addButton(boton, j)
|
self.buttonGroup.addButton(boton, j)
|
||||||
boton.clicked.connect(lambda _, dimentions=icon_name: self.show_dimentions(dimentions))
|
boton.clicked.connect(lambda _, dimentions=icon_name: self.on_standard_resolution_clicked(dimentions))
|
||||||
|
|
||||||
|
self.larger_resolutions_button = QPushButton(self)
|
||||||
|
self.larger_resolutions_button.setGeometry(100, 450, 185, 50)
|
||||||
|
self.larger_resolutions_button.setIconSize(self.larger_resolutions_button.size())
|
||||||
|
self.larger_resolutions_button.setIcon(QIcon(self.create_resolution_button_image("Larger Resolutions")))
|
||||||
|
self.larger_resolutions_button.clicked.connect(self.show_larger_resolutions)
|
||||||
|
|
||||||
|
self.custom_resolution_button = QPushButton(self)
|
||||||
|
self.custom_resolution_button.setGeometry(300, 450, 195, 50)
|
||||||
|
self.custom_resolution_button.setIconSize(self.custom_resolution_button.size())
|
||||||
|
self.custom_resolution_button.setIcon(QIcon(self.create_resolution_button_image("Custom Resolution")))
|
||||||
|
self.custom_resolution_button.clicked.connect(self.show_custom_resolution_dialog)
|
||||||
|
|
||||||
|
def create_resolution_button_image(self, resolution_text):
|
||||||
|
template_path = os.path.join(self.btn_path, "resolution_template_button.png")
|
||||||
|
|
||||||
|
if os.path.exists(template_path):
|
||||||
|
base_image = QPixmap(template_path)
|
||||||
|
if 'Resolution' in resolution_text:
|
||||||
|
base_image = base_image.scaled(195, 50)
|
||||||
|
else:
|
||||||
|
base_image = base_image.scaled(187, 75)
|
||||||
|
else:
|
||||||
|
base_image = QPixmap(185, 75)
|
||||||
|
base_image.fill(QColor(44, 62, 80))
|
||||||
|
|
||||||
|
painter = QPainter(base_image)
|
||||||
|
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||||
|
|
||||||
|
font = QFont()
|
||||||
|
font.setPointSize(10)
|
||||||
|
font.setBold(True)
|
||||||
|
painter.setFont(font)
|
||||||
|
|
||||||
|
painter.setPen(QColor(0, 255, 255))
|
||||||
|
|
||||||
|
text_rect = base_image.rect()
|
||||||
|
painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter | Qt.AlignmentFlag.AlignVCenter, resolution_text)
|
||||||
|
|
||||||
|
painter.end()
|
||||||
|
return base_image
|
||||||
|
|
||||||
|
def show_larger_resolutions(self):
|
||||||
|
if self.showing_larger_resolutions:
|
||||||
|
self.hide_larger_resolutions()
|
||||||
|
else:
|
||||||
|
self.hide_standard_resolutions()
|
||||||
|
self.showing_larger_resolutions = True
|
||||||
|
self.larger_resolutions_button.setIcon(QIcon(self.create_resolution_button_image("Standard Resolutions")))
|
||||||
|
|
||||||
|
larger_resolutions = [
|
||||||
|
("2560x1600", (595, 90, 180, 70)),
|
||||||
|
("2560x1440", (595, 170, 180, 70)),
|
||||||
|
("1920x1440", (595, 250, 180, 70)),
|
||||||
|
("1792x1344", (595, 330, 180, 70)),
|
||||||
|
("2048x1152", (595, 410, 180, 70))
|
||||||
|
]
|
||||||
|
|
||||||
|
for i, (resolution, geometry) in enumerate(larger_resolutions):
|
||||||
|
button = QPushButton(self)
|
||||||
|
button.setGeometry(*geometry)
|
||||||
|
button.setIconSize(button.size())
|
||||||
|
button.setCheckable(True)
|
||||||
|
button.setVisible(True)
|
||||||
|
button.setIcon(QIcon(self.create_resolution_button_image(resolution)))
|
||||||
|
button.clicked.connect(lambda _, res=resolution: self.on_larger_resolution_clicked(res))
|
||||||
|
self.larger_resolution_buttons.append(button)
|
||||||
|
self.buttonGroup.addButton(button, len(self.buttons) + i)
|
||||||
|
|
||||||
|
def hide_larger_resolutions(self):
|
||||||
|
for button in self.larger_resolution_buttons:
|
||||||
|
self.buttonGroup.removeButton(button)
|
||||||
|
button.deleteLater()
|
||||||
|
self.larger_resolution_buttons.clear()
|
||||||
|
self.showing_larger_resolutions = False
|
||||||
|
self.larger_resolutions_button.setIcon(QIcon(self.create_resolution_button_image("Larger Resolutions")))
|
||||||
|
self.show_standard_resolutions()
|
||||||
|
|
||||||
|
def hide_standard_resolutions(self):
|
||||||
|
for button in self.buttons:
|
||||||
|
button.setVisible(False)
|
||||||
|
|
||||||
|
def show_standard_resolutions(self):
|
||||||
|
for button in self.buttons:
|
||||||
|
button.setVisible(True)
|
||||||
|
|
||||||
|
def on_standard_resolution_clicked(self, dimentions):
|
||||||
|
self.custom_resolution_button.setChecked(False)
|
||||||
|
self.show_dimentions(dimentions)
|
||||||
|
|
||||||
|
def on_larger_resolution_clicked(self, dimentions):
|
||||||
|
self.custom_resolution_button.setChecked(False)
|
||||||
|
self.show_dimentions(dimentions)
|
||||||
|
|
||||||
|
def show_custom_resolution_dialog(self):
|
||||||
|
dialog = QDialog(self)
|
||||||
|
dialog.setWindowTitle("Custom Resolution")
|
||||||
|
dialog.setFixedSize(300, 150)
|
||||||
|
dialog.setModal(True)
|
||||||
|
dialog.setStyleSheet("""
|
||||||
|
QDialog {
|
||||||
|
background-color: #2c3e50;
|
||||||
|
border: 2px solid #00ffff;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
QLabel {
|
||||||
|
color: white;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
QLineEdit {
|
||||||
|
background-color: #34495e;
|
||||||
|
color: white;
|
||||||
|
border: 1px solid #00ffff;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
QPushButton {
|
||||||
|
background-color: #2c3e50;
|
||||||
|
color: white;
|
||||||
|
border: 2px solid #00ffff;
|
||||||
|
border-radius: 5px;
|
||||||
|
padding: 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
QPushButton:hover {
|
||||||
|
background-color: #34495e;
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
|
||||||
|
input_layout = QHBoxLayout()
|
||||||
|
width_label = QLabel("Width:")
|
||||||
|
width_input = QLineEdit()
|
||||||
|
width_input.setPlaceholderText("1920")
|
||||||
|
height_label = QLabel("Height:")
|
||||||
|
height_input = QLineEdit()
|
||||||
|
height_input.setPlaceholderText("1080")
|
||||||
|
|
||||||
|
input_layout.addWidget(width_label)
|
||||||
|
input_layout.addWidget(width_input)
|
||||||
|
input_layout.addWidget(height_label)
|
||||||
|
input_layout.addWidget(height_input)
|
||||||
|
|
||||||
|
button_layout = QHBoxLayout()
|
||||||
|
ok_button = QPushButton("OK")
|
||||||
|
cancel_button = QPushButton("Cancel")
|
||||||
|
|
||||||
|
button_layout.addWidget(ok_button)
|
||||||
|
button_layout.addWidget(cancel_button)
|
||||||
|
|
||||||
|
layout.addLayout(input_layout)
|
||||||
|
layout.addLayout(button_layout)
|
||||||
|
dialog.setLayout(layout)
|
||||||
|
|
||||||
|
def validate_and_accept():
|
||||||
|
try:
|
||||||
|
width = int(width_input.text())
|
||||||
|
height = int(height_input.text())
|
||||||
|
|
||||||
|
if width <= 0 or height <= 0:
|
||||||
|
QMessageBox.warning(dialog, "Invalid Resolution", "Width and height must be positive numbers.")
|
||||||
|
return
|
||||||
|
|
||||||
|
if width > 10000 or height > 10000:
|
||||||
|
QMessageBox.warning(dialog, "Invalid Resolution", "Resolution too large. Maximum 10000x10000.")
|
||||||
|
return
|
||||||
|
|
||||||
|
custom_resolution = f"{width}x{height}"
|
||||||
|
self.show_dimentions(custom_resolution)
|
||||||
|
dialog.accept()
|
||||||
|
|
||||||
|
except ValueError:
|
||||||
|
QMessageBox.warning(dialog, "Invalid Input", "Please enter valid numbers for width and height.")
|
||||||
|
|
||||||
|
ok_button.clicked.connect(validate_and_accept)
|
||||||
|
cancel_button.clicked.connect(dialog.reject)
|
||||||
|
|
||||||
|
dialog.exec()
|
||||||
|
|
||||||
def update_swarp_json(self):
|
def update_swarp_json(self):
|
||||||
inserted_data = {
|
inserted_data = {
|
||||||
|
@ -3385,14 +3573,47 @@ class ScreenPage(Page):
|
||||||
|
|
||||||
self.update_status.write_data(inserted_data)
|
self.update_status.write_data(inserted_data)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def show_dimentions(self, dimentions):
|
def show_dimentions(self, dimentions):
|
||||||
self.display.setPixmap(QPixmap(os.path.join(self.btn_path, f"{dimentions}.png")).scaled(self.display.size(), Qt.AspectRatioMode.KeepAspectRatio))
|
try:
|
||||||
|
image_path = os.path.join(self.btn_path, f"{dimentions}.png")
|
||||||
|
if os.path.exists(image_path):
|
||||||
|
self.display.setPixmap(QPixmap(image_path).scaled(self.display.size(), Qt.AspectRatioMode.KeepAspectRatio))
|
||||||
|
else:
|
||||||
|
self.create_resolution_preview_image(dimentions)
|
||||||
|
except:
|
||||||
|
self.display.clear()
|
||||||
|
|
||||||
self.selected_dimentions_icon = dimentions
|
self.selected_dimentions_icon = dimentions
|
||||||
self.button_next.setVisible(True)
|
self.button_next.setVisible(True)
|
||||||
self.update_swarp_json()
|
self.update_swarp_json()
|
||||||
|
|
||||||
|
def create_resolution_preview_image(self, resolution_text):
|
||||||
|
template_path = os.path.join(self.btn_path, "resolution_template.png")
|
||||||
|
|
||||||
|
if os.path.exists(template_path):
|
||||||
|
base_image = QPixmap(template_path)
|
||||||
|
base_image = base_image.scaled(580, 435, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation)
|
||||||
|
else:
|
||||||
|
base_image = QPixmap(580, 435)
|
||||||
|
base_image.fill(QColor(44, 62, 80))
|
||||||
|
|
||||||
|
painter = QPainter(base_image)
|
||||||
|
painter.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||||
|
|
||||||
|
font = QFont()
|
||||||
|
font.setPointSize(24)
|
||||||
|
font.setBold(True)
|
||||||
|
painter.setFont(font)
|
||||||
|
|
||||||
|
painter.setPen(QColor(0, 255, 255))
|
||||||
|
|
||||||
|
text_rect = base_image.rect()
|
||||||
|
painter.drawText(text_rect, Qt.AlignmentFlag.AlignCenter, resolution_text)
|
||||||
|
|
||||||
|
painter.end()
|
||||||
|
|
||||||
|
self.display.setPixmap(base_image)
|
||||||
|
|
||||||
class ResumePage(Page):
|
class ResumePage(Page):
|
||||||
def __init__(self, page_stack, main_window=None, parent=None):
|
def __init__(self, page_stack, main_window=None, parent=None):
|
||||||
super().__init__("Resume", page_stack, main_window, parent)
|
super().__init__("Resume", page_stack, main_window, parent)
|
||||||
|
@ -3506,6 +3727,14 @@ class ResumePage(Page):
|
||||||
parent_label.setPixmap(base_image)
|
parent_label.setPixmap(base_image)
|
||||||
parent_label.show()
|
parent_label.show()
|
||||||
self.labels_creados.append(parent_label)
|
self.labels_creados.append(parent_label)
|
||||||
|
elif item == 'dimentions':
|
||||||
|
base_image = ScreenPage.create_resolution_button_image(self, text)
|
||||||
|
geometry = (585, initial_y + i * label_height, 185, 75)
|
||||||
|
parent_label = QLabel(self)
|
||||||
|
parent_label.setGeometry(*geometry)
|
||||||
|
parent_label.setPixmap(base_image)
|
||||||
|
parent_label.show()
|
||||||
|
self.labels_creados.append(parent_label)
|
||||||
else:
|
else:
|
||||||
icon_path = os.path.join(self.btn_path, f"{text}_button.png")
|
icon_path = os.path.join(self.btn_path, f"{text}_button.png")
|
||||||
geometry = (585, initial_y + i * label_height, 185, 75)
|
geometry = (585, initial_y + i * label_height, 185, 75)
|
||||||
|
@ -3811,9 +4040,13 @@ class EditorPage(Page):
|
||||||
self.profiles_data = menu_page.match_core_profiles(profiles_dict=new_profiles)
|
self.profiles_data = menu_page.match_core_profiles(profiles_dict=new_profiles)
|
||||||
self.data_profile = self.profiles_data[selected_profiles_str].copy()
|
self.data_profile = self.profiles_data[selected_profiles_str].copy()
|
||||||
|
|
||||||
|
profile_id = int(selected_profiles_str.split('_')[1])
|
||||||
|
self.data_profile['id'] = profile_id
|
||||||
|
|
||||||
if selected_profiles_str in self.temp_changes:
|
if selected_profiles_str in self.temp_changes:
|
||||||
for key, value in self.temp_changes[selected_profiles_str].items():
|
for key, value in self.temp_changes[selected_profiles_str].items():
|
||||||
self.data_profile[key] = value
|
self.data_profile[key] = value
|
||||||
|
|
||||||
self.name.textChanged.connect(self.update_name_value)
|
self.name.textChanged.connect(self.update_name_value)
|
||||||
self.verificate(self.data_profile, selected_profiles_str)
|
self.verificate(self.data_profile, selected_profiles_str)
|
||||||
|
|
||||||
|
@ -3827,7 +4060,7 @@ class EditorPage(Page):
|
||||||
"connection": ['browser-only', 'system-wide'],
|
"connection": ['browser-only', 'system-wide'],
|
||||||
"location": self.connection_manager.get_location_list(),
|
"location": self.connection_manager.get_location_list(),
|
||||||
"browser": self.connection_manager.get_browser_list(),
|
"browser": self.connection_manager.get_browser_list(),
|
||||||
"dimentions": ['800x600', '1024x760', '1152x1080', '1280x1024', '1920x1080']
|
"dimentions": self.connection_manager.get_available_resolutions(data_profile.get('id', ''))
|
||||||
}, selected_profile_str)
|
}, selected_profile_str)
|
||||||
|
|
||||||
elif protocol == "residential" or protocol == "hidetor":
|
elif protocol == "residential" or protocol == "hidetor":
|
||||||
|
@ -3836,7 +4069,7 @@ class EditorPage(Page):
|
||||||
"connection": ['tor', 'just proxy'],
|
"connection": ['tor', 'just proxy'],
|
||||||
"location": self.connection_manager.get_location_list(),
|
"location": self.connection_manager.get_location_list(),
|
||||||
"browser": self.connection_manager.get_browser_list(),
|
"browser": self.connection_manager.get_browser_list(),
|
||||||
"dimentions": ['800x600', '1024x760', '1152x1080', '1280x1024', '1920x1080']
|
"dimentions": self.connection_manager.get_available_resolutions(data_profile.get('id', ''))
|
||||||
}, selected_profile_str)
|
}, selected_profile_str)
|
||||||
|
|
||||||
elif protocol == "lokinet":
|
elif protocol == "lokinet":
|
||||||
|
@ -3917,9 +4150,13 @@ class EditorPage(Page):
|
||||||
image_path = os.path.join(self.btn_path, f"button_{current_value}.png")
|
image_path = os.path.join(self.btn_path, f"button_{current_value}.png")
|
||||||
base_image = QPixmap(image_path)
|
base_image = QPixmap(image_path)
|
||||||
if base_image.isNull():
|
if base_image.isNull():
|
||||||
locations = self.connection_manager.get_location_info(current_value)
|
|
||||||
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
|
fallback_path = os.path.join(self.btn_path, "default_location_button.png")
|
||||||
base_image = LocationPage.create_location_button_image(locations.country_name, fallback_path)
|
base_image = LocationPage.create_location_button_image(current_value, fallback_path)
|
||||||
|
|
||||||
|
elif key == 'dimentions':
|
||||||
|
current_value = f"{data_profile.get(key, '')}"
|
||||||
|
if current_value != 'None':
|
||||||
|
base_image = ScreenPage.create_resolution_button_image(self, current_value)
|
||||||
else:
|
else:
|
||||||
image_path = os.path.join(self.btn_path, f"{data_profile.get(key, '')}_button.png")
|
image_path = os.path.join(self.btn_path, f"{data_profile.get(key, '')}_button.png")
|
||||||
current_value = data_profile.get(key, '')
|
current_value = data_profile.get(key, '')
|
||||||
|
@ -6231,5 +6468,3 @@ if __name__ == "__main__":
|
||||||
window = CustomWindow()
|
window = CustomWindow()
|
||||||
window.show()
|
window.show()
|
||||||
sys.exit(app.exec())
|
sys.exit(app.exec())
|
||||||
|
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1,012 B |
Before Width: | Height: | Size: 1 KiB |
Before Width: | Height: | Size: 1,000 B |
Before Width: | Height: | Size: 999 B |
BIN
gui/resources/images/resolution_template.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
gui/resources/images/resolution_template_button.png
Normal file
After Width: | Height: | Size: 1.2 KiB |