Added fast reg / auto syncs
This commit is contained in:
		
							parent
							
								
									3c814d6655
								
							
						
					
					
						commit
						d66be255d3
					
				
					 1 changed files with 633 additions and 20 deletions
				
			
		
							
								
								
									
										653
									
								
								gui/__main__.py
									
									
									
									
									
								
							
							
						
						
									
										653
									
								
								gui/__main__.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -458,8 +458,10 @@ class CustomWindow(QMainWindow):
 | 
			
		|||
 | 
			
		||||
    def update_values(self, available_locations, available_browsers, status, is_tor, locations, all_browsers):
 | 
			
		||||
        sync_screen = self.page_stack.findChild(SyncScreen)
 | 
			
		||||
        if sync_screen:
 | 
			
		||||
        if status:
 | 
			
		||||
            sync_screen.update_after_sync(available_locations, available_browsers, locations, all_browsers)
 | 
			
		||||
        else:
 | 
			
		||||
            self.update_status.update_status('Sync failed. Please try again later.')
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -893,6 +895,7 @@ class CustomWindow(QMainWindow):
 | 
			
		|||
                     IdPage(self.page_stack, self),
 | 
			
		||||
                     TorPage(self.page_stack, self),
 | 
			
		||||
                     EditorPage(self.page_stack, self),
 | 
			
		||||
                     FastRegistrationPage(self.page_stack, self),
 | 
			
		||||
                     Settings(self.page_stack, self),
 | 
			
		||||
                     ConnectionPage(self.page_stack, self),
 | 
			
		||||
                     SyncScreen(self.page_stack, self)]
 | 
			
		||||
| 
						 | 
				
			
			@ -1012,7 +1015,7 @@ class CustomWindow(QMainWindow):
 | 
			
		|||
 | 
			
		||||
        if isinstance(current_page, MenuPage):
 | 
			
		||||
            self.update_status(None)
 | 
			
		||||
            if isinstance(previous_page, (ResumePage, EditorPage, Settings)):
 | 
			
		||||
            if isinstance(previous_page, (ResumePage, EditorPage, Settings, FastRegistrationPage)):
 | 
			
		||||
                current_page.eliminacion() 
 | 
			
		||||
        
 | 
			
		||||
            else:
 | 
			
		||||
| 
						 | 
				
			
			@ -1327,7 +1330,6 @@ class MenuPage(Page):
 | 
			
		|||
            
 | 
			
		||||
        self.create()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def delete_profile(self):
 | 
			
		||||
        self.popup = ConfirmationPopup(self, message="Are you sure you want to\ndelete this profile?", action_button_text="Delete", cancel_button_text="Cancel")
 | 
			
		||||
        self.popup.setWindowModality(Qt.WindowModality.ApplicationModal)
 | 
			
		||||
| 
						 | 
				
			
			@ -1766,6 +1768,18 @@ class MenuPage(Page):
 | 
			
		|||
        if len(self.profile_info) == 6:
 | 
			
		||||
            self.update_status.update_status('Maximum number of profiles reached!')
 | 
			
		||||
            return
 | 
			
		||||
        
 | 
			
		||||
        settings_page = self.page_stack.findChild(Settings)
 | 
			
		||||
        if settings_page and settings_page.is_fast_registration_enabled():
 | 
			
		||||
            if not self.connection_manager.is_synced():
 | 
			
		||||
                self.update_status.update_status('Syncing in progress..')
 | 
			
		||||
                self.update_status.sync()
 | 
			
		||||
                self.update_status.worker_thread.sync_output.connect(self.on_sync_complete_for_fast_registration)
 | 
			
		||||
            else:
 | 
			
		||||
                self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(FastRegistrationPage)))
 | 
			
		||||
            return
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if not self.connection_manager.is_synced():
 | 
			
		||||
            self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(SyncScreen)))
 | 
			
		||||
        else:
 | 
			
		||||
| 
						 | 
				
			
			@ -1773,6 +1787,13 @@ class MenuPage(Page):
 | 
			
		|||
        
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    def on_sync_complete_for_fast_registration(self, available_locations, available_browsers, status, is_tor, locations, all_browsers):
 | 
			
		||||
        if status:
 | 
			
		||||
            self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(FastRegistrationPage)))
 | 
			
		||||
        else:
 | 
			
		||||
            self.update_status.update_status('Sync failed. Please try again later.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def change_connect_button(self):
 | 
			
		||||
        profile = ProfileController.get(int(self.reverse_id))
 | 
			
		||||
        is_connected = self.connection_manager.is_profile_connected(int(self.reverse_id))
 | 
			
		||||
| 
						 | 
				
			
			@ -1797,7 +1818,23 @@ class MenuPage(Page):
 | 
			
		|||
            
 | 
			
		||||
 | 
			
		||||
    def edit_prof(self):   
 | 
			
		||||
        self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(EditorPage)))
 | 
			
		||||
        settings_page = self.page_stack.findChild(Settings)
 | 
			
		||||
        if settings_page and settings_page.is_auto_sync_enabled():
 | 
			
		||||
            self.update_status.update_status('Syncing in progress..')
 | 
			
		||||
            self.update_status.sync()
 | 
			
		||||
            self.update_status.worker_thread.sync_output.connect(self.on_sync_complete_for_edit_profile)
 | 
			
		||||
        else:
 | 
			
		||||
            self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(EditorPage)))
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
    def on_sync_complete_for_edit_profile(self, available_locations, available_browsers, status, is_tor, locations, all_browsers):
 | 
			
		||||
        if status:
 | 
			
		||||
            self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(EditorPage)))
 | 
			
		||||
        else:
 | 
			
		||||
            self.update_status.update_status('Sync failed. Please try again later.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def settings_gui(self):   
 | 
			
		||||
        self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(Settings)))
 | 
			
		||||
| 
						 | 
				
			
			@ -3250,16 +3287,25 @@ class BrowserPage(Page):
 | 
			
		|||
    @staticmethod
 | 
			
		||||
    def create_browser_button_image(browser_text, btn_path, is_fallback=False):
 | 
			
		||||
 | 
			
		||||
        browser_name, version = browser_text.split()[0], ' '.join(browser_text.split()[1:])
 | 
			
		||||
        if ':' in browser_text:
 | 
			
		||||
            browser_name, version = browser_text.split(':', 1)
 | 
			
		||||
        else:
 | 
			
		||||
            browser_name, version = browser_text.split()[0], ' '.join(browser_text.split()[1:])
 | 
			
		||||
        if is_fallback:
 | 
			
		||||
            base_image = QPixmap(btn_path)
 | 
			
		||||
        else:
 | 
			
		||||
            base_image = QPixmap(os.path.join(btn_path, f"{browser_name}_button.png"))
 | 
			
		||||
        
 | 
			
		||||
        if base_image.isNull():
 | 
			
		||||
            base_image = QPixmap(185, 75)
 | 
			
		||||
            base_image.fill(QColor(44, 62, 80))
 | 
			
		||||
        
 | 
			
		||||
        painter = QPainter(base_image)
 | 
			
		||||
        BrowserPage._setup_version_font(painter, version, base_image)
 | 
			
		||||
        if is_fallback:
 | 
			
		||||
            BrowserPage._setup_browser_name(painter, browser_name, base_image)
 | 
			
		||||
        painter.end()
 | 
			
		||||
        if painter.isActive():
 | 
			
		||||
            BrowserPage._setup_version_font(painter, version, base_image)
 | 
			
		||||
            if is_fallback:
 | 
			
		||||
                BrowserPage._setup_browser_name(painter, browser_name, base_image)
 | 
			
		||||
            painter.end()
 | 
			
		||||
        return base_image
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
| 
						 | 
				
			
			@ -4218,20 +4264,38 @@ class EditorPage(Page):
 | 
			
		|||
                prev_button.setVisible(False)
 | 
			
		||||
                next_button.setVisible(False)
 | 
			
		||||
 | 
			
		||||
    def on_sync_complete_for_edit_profile(self, available_locations, available_browsers, status, is_tor, locations, all_browsers):
 | 
			
		||||
        if status:
 | 
			
		||||
            self.update_status.update_status('Sync complete.')
 | 
			
		||||
            self.extraccion()
 | 
			
		||||
        else:
 | 
			
		||||
            self.update_status.update_status('Sync failed. Please try again later.')
 | 
			
		||||
 | 
			
		||||
    def show_previous_value(self, key: str, index: int, parameters: dict) -> None:
 | 
			
		||||
        if len(parameters[key]) > 1:
 | 
			
		||||
            previous_index = (index - 1) % len(parameters[key])
 | 
			
		||||
            previous_value = parameters[key][previous_index]
 | 
			
		||||
            self.update_temp_value(key, previous_value)
 | 
			
		||||
        if key == 'browser' or key == 'location':
 | 
			
		||||
            if not self.connection_manager.is_synced():
 | 
			
		||||
                self.update_status.update_status('Syncing in progress..')
 | 
			
		||||
                self.update_status.sync()
 | 
			
		||||
                self.update_status.worker_thread.sync_output.connect(self.on_sync_complete_for_edit_profile)
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        previous_index = (index - 1) % len(parameters[key])
 | 
			
		||||
        previous_value = parameters[key][previous_index]
 | 
			
		||||
        self.update_temp_value(key, previous_value)
 | 
			
		||||
            
 | 
			
		||||
 | 
			
		||||
    def show_next_value(self, key: str, index: int, parameters: dict) -> None:
 | 
			
		||||
        
 | 
			
		||||
        if len(parameters[key]) > 1:
 | 
			
		||||
            next_index = (index + 1) % len(parameters[key])
 | 
			
		||||
            next_value = parameters[key][next_index]
 | 
			
		||||
        if key == 'browser' or key == 'location':
 | 
			
		||||
            if not self.connection_manager.is_synced():
 | 
			
		||||
                self.update_status.update_status('Syncing in progress..')
 | 
			
		||||
                self.update_status.sync()
 | 
			
		||||
                self.update_status.worker_thread.sync_output.connect(self.on_sync_complete_for_edit_profile)
 | 
			
		||||
                return
 | 
			
		||||
                
 | 
			
		||||
        next_index = (index + 1) % len(parameters[key])
 | 
			
		||||
        next_value = parameters[key][next_index]
 | 
			
		||||
 | 
			
		||||
            self.update_temp_value(key, next_value)
 | 
			
		||||
        self.update_temp_value(key, next_value)
 | 
			
		||||
 | 
			
		||||
    def update_temp_value(self, key: str, new_value: str) -> None:
 | 
			
		||||
        selected_profiles_str = ', '.join([f"Profile_{profile['profile_number']}" for profile in self.page_stack.widget(0).selected_profiles])
 | 
			
		||||
| 
						 | 
				
			
			@ -4467,6 +4531,7 @@ class Settings(Page):
 | 
			
		|||
        menu_items = [
 | 
			
		||||
            ("Overview", self.show_account_page),
 | 
			
		||||
            ("Subscriptions", self.show_subscription_page),
 | 
			
		||||
            ("Registrations", self.show_registrations_page),
 | 
			
		||||
            ("Delete Profile", self.show_delete_page),
 | 
			
		||||
            ("Error Logs", self.show_logs_page)
 | 
			
		||||
        ]
 | 
			
		||||
| 
						 | 
				
			
			@ -4730,13 +4795,17 @@ class Settings(Page):
 | 
			
		|||
        self.content_layout.setCurrentWidget(self.subscription_page)
 | 
			
		||||
        self.update_button_states(1)
 | 
			
		||||
 | 
			
		||||
    def show_registrations_page(self):
 | 
			
		||||
        self.content_layout.setCurrentWidget(self.registrations_page)
 | 
			
		||||
        self.update_button_states(2)
 | 
			
		||||
 | 
			
		||||
    def show_delete_page(self):
 | 
			
		||||
        self.content_layout.setCurrentWidget(self.delete_page)
 | 
			
		||||
        self.update_button_states(2)
 | 
			
		||||
        self.update_button_states(3)
 | 
			
		||||
 | 
			
		||||
    def show_logs_page(self):
 | 
			
		||||
        self.content_layout.setCurrentWidget(self.logs_page)
 | 
			
		||||
        self.update_button_states(3)
 | 
			
		||||
        self.update_button_states(4)
 | 
			
		||||
 | 
			
		||||
    def update_button_states(self, active_index):
 | 
			
		||||
        for i, btn in enumerate(self.menu_buttons):
 | 
			
		||||
| 
						 | 
				
			
			@ -4875,6 +4944,10 @@ class Settings(Page):
 | 
			
		|||
        self.subscription_page = self.create_subscription_page()
 | 
			
		||||
        self.content_layout.addWidget(self.subscription_page)
 | 
			
		||||
 | 
			
		||||
        self.content_layout.removeWidget(self.registrations_page)
 | 
			
		||||
        self.registrations_page = self.create_registrations_page()
 | 
			
		||||
        self.content_layout.addWidget(self.registrations_page)
 | 
			
		||||
 | 
			
		||||
        self.content_layout.removeWidget(self.delete_page)
 | 
			
		||||
        self.delete_page = self.create_delete_page()
 | 
			
		||||
        self.content_layout.addWidget(self.delete_page)
 | 
			
		||||
| 
						 | 
				
			
			@ -5074,11 +5147,13 @@ class Settings(Page):
 | 
			
		|||
    def setup_pages(self):
 | 
			
		||||
        self.account_page = self.create_account_page()
 | 
			
		||||
        self.subscription_page = self.create_subscription_page()
 | 
			
		||||
        self.registrations_page = self.create_registrations_page()
 | 
			
		||||
        self.logs_page = self.create_logs_page()
 | 
			
		||||
        self.delete_page = self.create_delete_page()
 | 
			
		||||
 | 
			
		||||
        self.content_layout.addWidget(self.account_page)
 | 
			
		||||
        self.content_layout.addWidget(self.subscription_page)
 | 
			
		||||
        self.content_layout.addWidget(self.registrations_page)
 | 
			
		||||
        self.content_layout.addWidget(self.logs_page)
 | 
			
		||||
        self.content_layout.addWidget(self.delete_page)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5158,6 +5233,108 @@ class Settings(Page):
 | 
			
		|||
            logging.error(f"Error saving logging settings: {str(e)}")
 | 
			
		||||
            self.update_status.update_status("Error saving logging settings")
 | 
			
		||||
 | 
			
		||||
    def create_registrations_page(self):
 | 
			
		||||
        page = QWidget()
 | 
			
		||||
        layout = QVBoxLayout(page)
 | 
			
		||||
        layout.setSpacing(20)
 | 
			
		||||
        layout.setContentsMargins(20, 20, 20, 20)
 | 
			
		||||
 | 
			
		||||
        title = QLabel("REGISTRATION SETTINGS")
 | 
			
		||||
        title.setStyleSheet(f"color: #808080; font-size: 12px; font-weight: bold; {self.font_style}")
 | 
			
		||||
        layout.addWidget(title)
 | 
			
		||||
 | 
			
		||||
        registrations_group = QGroupBox("Registration Configuration")
 | 
			
		||||
        registrations_group.setStyleSheet(f"QGroupBox {{ color: white; padding: 15px; {self.font_style} }}")
 | 
			
		||||
        registrations_layout = QVBoxLayout(registrations_group)
 | 
			
		||||
 | 
			
		||||
        self.enable_auto_sync = QCheckBox("Enable auto-sync")
 | 
			
		||||
        self.enable_auto_sync.setStyleSheet(self.get_checkbox_style())
 | 
			
		||||
        registrations_layout.addWidget(self.enable_auto_sync)
 | 
			
		||||
 | 
			
		||||
        self.enable_fast_registration = QCheckBox("Enable fast registration")
 | 
			
		||||
        self.enable_fast_registration.setStyleSheet(self.get_checkbox_style())
 | 
			
		||||
        registrations_layout.addWidget(self.enable_fast_registration)
 | 
			
		||||
 | 
			
		||||
        layout.addWidget(registrations_group)
 | 
			
		||||
 | 
			
		||||
        save_button = QPushButton()
 | 
			
		||||
        save_button.setFixedSize(75, 46)
 | 
			
		||||
        save_button.setIcon(QIcon(os.path.join(self.btn_path, f"save.png")))
 | 
			
		||||
        save_button.setIconSize(QSize(75, 46))
 | 
			
		||||
        save_button.clicked.connect(self.save_registrations_settings)
 | 
			
		||||
 | 
			
		||||
        button_layout = QHBoxLayout()
 | 
			
		||||
        button_layout.addStretch()
 | 
			
		||||
        button_layout.addWidget(save_button)
 | 
			
		||||
        layout.addLayout(button_layout)
 | 
			
		||||
 | 
			
		||||
        layout.addStretch()
 | 
			
		||||
        self.load_registrations_settings()
 | 
			
		||||
        return page
 | 
			
		||||
 | 
			
		||||
    def load_registrations_settings(self) -> None:
 | 
			
		||||
        try:
 | 
			
		||||
            config = self.update_status._load_gui_config()
 | 
			
		||||
            if config and "registrations" in config:
 | 
			
		||||
                self.enable_auto_sync.setChecked(config["registrations"]["auto_sync_enabled"])
 | 
			
		||||
                self.enable_fast_registration.setChecked(config["registrations"]["fast_registration_enabled"])
 | 
			
		||||
            else:
 | 
			
		||||
                self.enable_auto_sync.setChecked(False)
 | 
			
		||||
                self.enable_fast_registration.setChecked(False)
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logging.error(f"Error loading registration settings: {str(e)}")
 | 
			
		||||
            self.enable_auto_sync.setChecked(False)
 | 
			
		||||
            self.enable_fast_registration.setChecked(False)
 | 
			
		||||
 | 
			
		||||
    def save_registrations_settings(self) -> None:
 | 
			
		||||
        try:
 | 
			
		||||
            config = self.update_status._load_gui_config()
 | 
			
		||||
            if config is None:
 | 
			
		||||
                config = {
 | 
			
		||||
                    "logging": {
 | 
			
		||||
                        "gui_logging_enabled": True,
 | 
			
		||||
                        "log_level": "INFO"
 | 
			
		||||
                    },
 | 
			
		||||
                    "registrations": {
 | 
			
		||||
                        "auto_sync_enabled": False,
 | 
			
		||||
                        "fast_registration_enabled": False
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            if "registrations" not in config:
 | 
			
		||||
                config["registrations"] = {}
 | 
			
		||||
 | 
			
		||||
            config["registrations"]["auto_sync_enabled"] = self.enable_auto_sync.isChecked()
 | 
			
		||||
            config["registrations"]["fast_registration_enabled"] = self.enable_fast_registration.isChecked()
 | 
			
		||||
            
 | 
			
		||||
            self.update_status._save_gui_config(config)
 | 
			
		||||
            self.update_status.update_status("Registration settings saved")
 | 
			
		||||
            
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logging.error(f"Error saving registration settings: {str(e)}")
 | 
			
		||||
            self.update_status.update_status("Error saving registration settings")
 | 
			
		||||
 | 
			
		||||
    def is_auto_sync_enabled(self) -> bool:
 | 
			
		||||
        try:
 | 
			
		||||
            config = self.update_status._load_gui_config()
 | 
			
		||||
            if config and "registrations" in config:
 | 
			
		||||
                return config["registrations"]["auto_sync_enabled"]
 | 
			
		||||
            return False
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logging.error(f"Error checking auto-sync setting: {str(e)}")
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
    def is_fast_registration_enabled(self) -> bool:
 | 
			
		||||
        try:
 | 
			
		||||
            config = self.update_status._load_gui_config()
 | 
			
		||||
            if config and "registrations" in config:
 | 
			
		||||
                return config["registrations"]["fast_registration_enabled"]
 | 
			
		||||
            return False
 | 
			
		||||
        except Exception as e:
 | 
			
		||||
            logging.error(f"Error checking fast registration setting: {str(e)}")
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -6374,6 +6551,442 @@ class PaymentDetailsPage(Page):
 | 
			
		|||
            total_hours = duration_month_num * (30 * 24)
 | 
			
		||||
        return total_hours
 | 
			
		||||
 | 
			
		||||
class FastRegistrationPage(Page):
 | 
			
		||||
    def __init__(self, page_stack, main_window):
 | 
			
		||||
        super().__init__("FastRegistration", page_stack, main_window)
 | 
			
		||||
        self.page_stack = page_stack
 | 
			
		||||
        self.update_status = main_window
 | 
			
		||||
        self.connection_manager = main_window.connection_manager
 | 
			
		||||
        self.labels = []
 | 
			
		||||
        self.buttons = []
 | 
			
		||||
        self.title.setGeometry(550, 40, 250, 40)
 | 
			
		||||
        self.title.setText("Fast Registration")
 | 
			
		||||
        
 | 
			
		||||
        self.button_apply.setVisible(True)
 | 
			
		||||
        self.button_apply.clicked.connect(self.create_profile)
 | 
			
		||||
        
 | 
			
		||||
        self.button_back.setVisible(True)
 | 
			
		||||
        try:
 | 
			
		||||
            self.button_back.clicked.disconnect()
 | 
			
		||||
        except TypeError:
 | 
			
		||||
            pass
 | 
			
		||||
        self.button_back.clicked.connect(self.go_back)
 | 
			
		||||
 | 
			
		||||
        self.name_handle = QLabel(self)
 | 
			
		||||
        self.name_handle.setGeometry(110, 70, 400, 30)
 | 
			
		||||
        self.name_handle.setStyleSheet('color: #cacbcb;')
 | 
			
		||||
        self.name_handle.setText("Profile Name:")
 | 
			
		||||
 | 
			
		||||
        self.name = QLineEdit(self)
 | 
			
		||||
        self.name.setGeometry(265, 70, 190, 30)
 | 
			
		||||
        self.name.setStyleSheet("color: cyan; border: transparent;")
 | 
			
		||||
 | 
			
		||||
        self.profile_data = {}
 | 
			
		||||
        self.selected_values = {
 | 
			
		||||
            'protocol': 'wireguard',
 | 
			
		||||
            'connection': 'browser-only',
 | 
			
		||||
            'location': '',
 | 
			
		||||
            'browser': '',
 | 
			
		||||
            'resolution': '1024x760'
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        self.initialize_default_selections()
 | 
			
		||||
 | 
			
		||||
    def showEvent(self, event):
 | 
			
		||||
        super().showEvent(event)
 | 
			
		||||
        self.initialize_default_selections()
 | 
			
		||||
        self.create_interface_elements()
 | 
			
		||||
 | 
			
		||||
    def create_interface_elements(self):
 | 
			
		||||
        for label in self.labels:
 | 
			
		||||
            label.deleteLater()
 | 
			
		||||
        self.labels = []
 | 
			
		||||
        for button in self.buttons:
 | 
			
		||||
            button.deleteLater()
 | 
			
		||||
        self.buttons = []
 | 
			
		||||
 | 
			
		||||
        self.create_protocol_section()
 | 
			
		||||
        self.create_connection_section()
 | 
			
		||||
        self.create_location_section()
 | 
			
		||||
        self.create_browser_section()
 | 
			
		||||
        self.create_resolution_section()
 | 
			
		||||
 | 
			
		||||
    def create_protocol_section(self):
 | 
			
		||||
        label = QLabel("Protocol", self)
 | 
			
		||||
        label.setGeometry(300, 150, 185, 75)
 | 
			
		||||
        
 | 
			
		||||
        protocol_image = QPixmap(os.path.join(self.btn_path, f"{self.selected_values['protocol']}_button.png"))
 | 
			
		||||
        label.setPixmap(protocol_image)
 | 
			
		||||
        label.setScaledContents(True)
 | 
			
		||||
        label.show()
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
        prev_button = QPushButton(self)
 | 
			
		||||
        prev_button.setGeometry(265, 150, 30, 75)
 | 
			
		||||
        prev_button.clicked.connect(lambda: self.show_previous_value('protocol'))
 | 
			
		||||
        prev_button.show()
 | 
			
		||||
        icon_path = os.path.join(self.btn_path, "UP_button.png")
 | 
			
		||||
        icon = QPixmap(icon_path)
 | 
			
		||||
        transform = QTransform().rotate(180)
 | 
			
		||||
        rotated_icon = icon.transformed(transform)
 | 
			
		||||
        prev_button.setIcon(QIcon(rotated_icon))
 | 
			
		||||
        prev_button.setIconSize(prev_button.size())
 | 
			
		||||
        self.buttons.append(prev_button)
 | 
			
		||||
 | 
			
		||||
        next_button = QPushButton(self)
 | 
			
		||||
        next_button.setGeometry(490, 150, 30, 75)
 | 
			
		||||
        next_button.clicked.connect(lambda: self.show_next_value('protocol'))
 | 
			
		||||
        next_button.show()
 | 
			
		||||
        next_button.setIcon(QIcon(os.path.join(self.btn_path, "UP_button.png")))
 | 
			
		||||
        next_button.setIconSize(next_button.size())
 | 
			
		||||
        self.buttons.append(next_button)
 | 
			
		||||
 | 
			
		||||
    def create_connection_section(self):
 | 
			
		||||
        label = QLabel("Connection", self)
 | 
			
		||||
        label.setGeometry(150, 250, 185, 75)
 | 
			
		||||
        
 | 
			
		||||
        if self.selected_values['connection']:
 | 
			
		||||
            connection_image = QPixmap(os.path.join(self.btn_path, f"{self.selected_values['connection']}_button.png"))
 | 
			
		||||
            if connection_image.isNull():
 | 
			
		||||
                fallback_path = os.path.join(self.btn_path, "browser-only_button.png")
 | 
			
		||||
                connection_image = QPixmap(fallback_path)
 | 
			
		||||
        else:
 | 
			
		||||
            connection_image = QPixmap(os.path.join(self.btn_path, "browser-only_button.png"))
 | 
			
		||||
        
 | 
			
		||||
        label.setPixmap(connection_image)
 | 
			
		||||
        label.setScaledContents(True)
 | 
			
		||||
        label.show()
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
        prev_button = QPushButton(self)
 | 
			
		||||
        prev_button.setGeometry(115, 250, 30, 75)
 | 
			
		||||
        prev_button.clicked.connect(lambda: self.show_previous_value('connection'))
 | 
			
		||||
        prev_button.show()
 | 
			
		||||
        icon_path = os.path.join(self.btn_path, "UP_button.png")
 | 
			
		||||
        icon = QPixmap(icon_path)
 | 
			
		||||
        transform = QTransform().rotate(180)
 | 
			
		||||
        rotated_icon = icon.transformed(transform)
 | 
			
		||||
        prev_button.setIcon(QIcon(rotated_icon))
 | 
			
		||||
        prev_button.setIconSize(prev_button.size())
 | 
			
		||||
        self.buttons.append(prev_button)
 | 
			
		||||
 | 
			
		||||
        next_button = QPushButton(self)
 | 
			
		||||
        next_button.setGeometry(340, 250, 30, 75)
 | 
			
		||||
        next_button.clicked.connect(lambda: self.show_next_value('connection'))
 | 
			
		||||
        next_button.show()
 | 
			
		||||
        next_button.setIcon(QIcon(os.path.join(self.btn_path, "UP_button.png")))
 | 
			
		||||
        next_button.setIconSize(next_button.size())
 | 
			
		||||
        self.buttons.append(next_button)
 | 
			
		||||
 | 
			
		||||
    def create_location_section(self):
 | 
			
		||||
        label = QLabel("Location", self)
 | 
			
		||||
        label.setGeometry(435, 250, 185, 75)
 | 
			
		||||
        
 | 
			
		||||
        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)
 | 
			
		||||
            if location_image.isNull():
 | 
			
		||||
                fallback_path = os.path.join(self.btn_path, "default_location_button.png")
 | 
			
		||||
                location_image = LocationPage.create_location_button_image(self.selected_values['location'], fallback_path)
 | 
			
		||||
        else:
 | 
			
		||||
            location_image = QPixmap(os.path.join(self.btn_path, "default_location_button.png"))
 | 
			
		||||
        
 | 
			
		||||
        label.setPixmap(location_image)
 | 
			
		||||
        label.setScaledContents(True)
 | 
			
		||||
        label.show()
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
        prev_button = QPushButton(self)
 | 
			
		||||
        prev_button.setGeometry(400, 250, 30, 75)
 | 
			
		||||
        prev_button.clicked.connect(lambda: self.show_previous_value('location'))
 | 
			
		||||
        prev_button.show()
 | 
			
		||||
        icon_path = os.path.join(self.btn_path, "UP_button.png")
 | 
			
		||||
        icon = QPixmap(icon_path)
 | 
			
		||||
        transform = QTransform().rotate(180)
 | 
			
		||||
        rotated_icon = icon.transformed(transform)
 | 
			
		||||
        prev_button.setIcon(QIcon(rotated_icon))
 | 
			
		||||
        prev_button.setIconSize(prev_button.size())
 | 
			
		||||
        self.buttons.append(prev_button)
 | 
			
		||||
 | 
			
		||||
        next_button = QPushButton(self)
 | 
			
		||||
        next_button.setGeometry(625, 250, 30, 75)
 | 
			
		||||
        next_button.clicked.connect(lambda: self.show_next_value('location'))
 | 
			
		||||
        next_button.show()
 | 
			
		||||
        next_button.setIcon(QIcon(os.path.join(self.btn_path, "UP_button.png")))
 | 
			
		||||
        next_button.setIconSize(next_button.size())
 | 
			
		||||
        self.buttons.append(next_button)
 | 
			
		||||
 | 
			
		||||
    def create_browser_section(self):
 | 
			
		||||
        label = QLabel("Browser", self)
 | 
			
		||||
        label.setGeometry(150, 350, 185, 75)
 | 
			
		||||
        
 | 
			
		||||
        if self.selected_values['browser']:
 | 
			
		||||
            browser_image = BrowserPage.create_browser_button_image(self.selected_values['browser'], self.btn_path)
 | 
			
		||||
            if browser_image.isNull():
 | 
			
		||||
                fallback_path = os.path.join(self.btn_path, "default_browser_button.png")
 | 
			
		||||
                browser_image = BrowserPage.create_browser_button_image(self.selected_values['browser'], fallback_path, True)
 | 
			
		||||
        else:
 | 
			
		||||
            browser_image = QPixmap()
 | 
			
		||||
        
 | 
			
		||||
        label.setPixmap(browser_image)
 | 
			
		||||
        label.setScaledContents(True)
 | 
			
		||||
        label.show()
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
        prev_button = QPushButton(self)
 | 
			
		||||
        prev_button.setGeometry(115, 350, 30, 75)
 | 
			
		||||
        prev_button.clicked.connect(lambda: self.show_previous_value('browser'))
 | 
			
		||||
        prev_button.show()
 | 
			
		||||
        icon_path = os.path.join(self.btn_path, "UP_button.png")
 | 
			
		||||
        icon = QPixmap(icon_path)
 | 
			
		||||
        transform = QTransform().rotate(180)
 | 
			
		||||
        rotated_icon = icon.transformed(transform)
 | 
			
		||||
        prev_button.setIcon(QIcon(rotated_icon))
 | 
			
		||||
        prev_button.setIconSize(prev_button.size())
 | 
			
		||||
        self.buttons.append(prev_button)
 | 
			
		||||
 | 
			
		||||
        next_button = QPushButton(self)
 | 
			
		||||
        next_button.setGeometry(340, 350, 30, 75)
 | 
			
		||||
        next_button.clicked.connect(lambda: self.show_next_value('browser'))
 | 
			
		||||
        next_button.show()
 | 
			
		||||
        next_button.setIcon(QIcon(os.path.join(self.btn_path, "UP_button.png")))
 | 
			
		||||
        next_button.setIconSize(next_button.size())
 | 
			
		||||
        self.buttons.append(next_button)
 | 
			
		||||
 | 
			
		||||
    def create_resolution_section(self):
 | 
			
		||||
        label = QLabel("Resolution", self)
 | 
			
		||||
        label.setGeometry(435, 350, 185, 75)
 | 
			
		||||
        screen_page = self.page_stack.findChild(ScreenPage)
 | 
			
		||||
        if self.selected_values['resolution']:
 | 
			
		||||
            
 | 
			
		||||
            resolution_image = screen_page.create_resolution_button_image(self.selected_values['resolution'])
 | 
			
		||||
        else:
 | 
			
		||||
            resolution_image = screen_page.create_resolution_button_image("1024x760")
 | 
			
		||||
        
 | 
			
		||||
        label.setPixmap(resolution_image)
 | 
			
		||||
        label.setScaledContents(True)
 | 
			
		||||
        label.show()
 | 
			
		||||
        self.labels.append(label)
 | 
			
		||||
 | 
			
		||||
        prev_button = QPushButton(self)
 | 
			
		||||
        prev_button.setGeometry(400, 350, 30, 75)
 | 
			
		||||
        prev_button.clicked.connect(lambda: self.show_previous_value('resolution'))
 | 
			
		||||
        prev_button.show()
 | 
			
		||||
        icon_path = os.path.join(self.btn_path, "UP_button.png")
 | 
			
		||||
        icon = QPixmap(icon_path)
 | 
			
		||||
        transform = QTransform().rotate(180)
 | 
			
		||||
        rotated_icon = icon.transformed(transform)
 | 
			
		||||
        prev_button.setIcon(QIcon(rotated_icon))
 | 
			
		||||
        prev_button.setIconSize(prev_button.size())
 | 
			
		||||
        self.buttons.append(prev_button)
 | 
			
		||||
 | 
			
		||||
        next_button = QPushButton(self)
 | 
			
		||||
        next_button.setGeometry(625, 350, 30, 75)
 | 
			
		||||
        next_button.clicked.connect(lambda: self.show_next_value('resolution'))
 | 
			
		||||
        next_button.show()
 | 
			
		||||
        next_button.setIcon(QIcon(os.path.join(self.btn_path, "UP_button.png")))
 | 
			
		||||
        next_button.setIconSize(next_button.size())
 | 
			
		||||
        self.buttons.append(next_button)
 | 
			
		||||
 | 
			
		||||
    def show_previous_value(self, key):
 | 
			
		||||
        if key == 'protocol':
 | 
			
		||||
            protocols = ['wireguard', 'hidetor']
 | 
			
		||||
            current_index = protocols.index(self.selected_values[key])
 | 
			
		||||
            previous_index = (current_index - 1) % len(protocols)
 | 
			
		||||
            self.selected_values[key] = protocols[previous_index]
 | 
			
		||||
            if self.selected_values[key] == 'wireguard':
 | 
			
		||||
                self.selected_values['connection'] = 'browser-only'
 | 
			
		||||
            else:
 | 
			
		||||
                self.selected_values['connection'] = 'tor'
 | 
			
		||||
        elif key == 'connection':
 | 
			
		||||
            if self.selected_values['protocol'] == 'wireguard':
 | 
			
		||||
                connections = ['browser-only', 'system-wide']
 | 
			
		||||
            else:
 | 
			
		||||
                connections = ['tor', 'just proxy']
 | 
			
		||||
            current_index = connections.index(self.selected_values[key])
 | 
			
		||||
            previous_index = (current_index - 1) % len(connections)
 | 
			
		||||
            self.selected_values[key] = connections[previous_index]
 | 
			
		||||
        elif key == 'location':
 | 
			
		||||
            locations = self.connection_manager.get_location_list()
 | 
			
		||||
            if locations and self.selected_values[key] in locations:
 | 
			
		||||
                current_index = locations.index(self.selected_values[key])
 | 
			
		||||
                previous_index = (current_index - 1) % len(locations)
 | 
			
		||||
                self.selected_values[key] = locations[previous_index]
 | 
			
		||||
            elif locations:
 | 
			
		||||
                self.selected_values[key] = locations[0]
 | 
			
		||||
        elif key == 'browser':
 | 
			
		||||
            browsers = self.connection_manager.get_browser_list()
 | 
			
		||||
            if browsers and self.selected_values[key] in browsers:
 | 
			
		||||
                current_index = browsers.index(self.selected_values[key])
 | 
			
		||||
                previous_index = (current_index - 1) % len(browsers)
 | 
			
		||||
                self.selected_values[key] = browsers[previous_index]
 | 
			
		||||
            elif browsers:
 | 
			
		||||
                self.selected_values[key] = browsers[0]
 | 
			
		||||
        elif key == 'resolution':
 | 
			
		||||
            resolutions = ['800x600', '1024x760', '1152x1080', '1280x1024', '1920x1080', '2560x1440', '2560x1600', '1920x1440', '1792x1344', '2048x1152']
 | 
			
		||||
            current_index = resolutions.index(self.selected_values[key])
 | 
			
		||||
            previous_index = (current_index - 1) % len(resolutions)
 | 
			
		||||
            self.selected_values[key] = resolutions[previous_index]
 | 
			
		||||
        
 | 
			
		||||
        self.create_interface_elements()
 | 
			
		||||
 | 
			
		||||
    def show_next_value(self, key):
 | 
			
		||||
        if key == 'protocol':
 | 
			
		||||
            protocols = ['wireguard', 'hidetor']
 | 
			
		||||
            current_index = protocols.index(self.selected_values[key])
 | 
			
		||||
            next_index = (current_index + 1) % len(protocols)
 | 
			
		||||
            self.selected_values[key] = protocols[next_index]
 | 
			
		||||
            if self.selected_values[key] == 'wireguard':
 | 
			
		||||
                self.selected_values['connection'] = 'browser-only'
 | 
			
		||||
            else:
 | 
			
		||||
                self.selected_values['connection'] = 'tor'
 | 
			
		||||
        elif key == 'connection':
 | 
			
		||||
            if self.selected_values['protocol'] == 'wireguard':
 | 
			
		||||
                connections = ['browser-only', 'system-wide']
 | 
			
		||||
            else:
 | 
			
		||||
                connections = ['tor', 'just proxy']
 | 
			
		||||
            current_index = connections.index(self.selected_values[key])
 | 
			
		||||
            next_index = (current_index + 1) % len(connections)
 | 
			
		||||
            self.selected_values[key] = connections[next_index]
 | 
			
		||||
        elif key == 'location':
 | 
			
		||||
            locations = self.connection_manager.get_location_list()
 | 
			
		||||
            if locations and self.selected_values[key] in locations:
 | 
			
		||||
                current_index = locations.index(self.selected_values[key])
 | 
			
		||||
                next_index = (current_index + 1) % len(locations)
 | 
			
		||||
                self.selected_values[key] = locations[next_index]
 | 
			
		||||
            elif locations:
 | 
			
		||||
                self.selected_values[key] = locations[0]
 | 
			
		||||
        elif key == 'browser':
 | 
			
		||||
            browsers = self.connection_manager.get_browser_list()
 | 
			
		||||
            if browsers and self.selected_values[key] in browsers:
 | 
			
		||||
                current_index = browsers.index(self.selected_values[key])
 | 
			
		||||
                next_index = (current_index + 1) % len(browsers)
 | 
			
		||||
                self.selected_values[key] = browsers[next_index]
 | 
			
		||||
            elif browsers:
 | 
			
		||||
                self.selected_values[key] = browsers[0]
 | 
			
		||||
        elif key == 'resolution':
 | 
			
		||||
            resolutions = ['800x600', '1024x760', '1152x1080', '1280x1024', '1920x1080', '2560x1440', '2560x1600', '1920x1440', '1792x1344', '2048x1152']
 | 
			
		||||
            current_index = resolutions.index(self.selected_values[key])
 | 
			
		||||
            next_index = (current_index + 1) % len(resolutions)
 | 
			
		||||
            self.selected_values[key] = resolutions[next_index]
 | 
			
		||||
        
 | 
			
		||||
        self.create_interface_elements()
 | 
			
		||||
 | 
			
		||||
    def go_back(self):
 | 
			
		||||
        self.page_stack.setCurrentIndex(self.page_stack.indexOf(self.page_stack.findChild(MenuPage)))
 | 
			
		||||
 | 
			
		||||
    def create_profile(self):
 | 
			
		||||
        profile_name = self.name.text()
 | 
			
		||||
        if not profile_name:
 | 
			
		||||
            self.update_status.update_status('Please enter a profile name')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        if not self.selected_values['location']:
 | 
			
		||||
            self.update_status.update_status('Please select a location')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        if self.selected_values['connection'] != 'system-wide' and not self.selected_values['browser']:
 | 
			
		||||
            self.update_status.update_status('Please select a browser')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        profile_data = {
 | 
			
		||||
            'name': profile_name,
 | 
			
		||||
            'protocol': self.selected_values['protocol'],
 | 
			
		||||
            'connection': self.selected_values['connection'],
 | 
			
		||||
            'location': self.selected_values['location'],
 | 
			
		||||
            'browser': self.selected_values['browser'],
 | 
			
		||||
            'resolution': self.selected_values['resolution']
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        self.profile_data = profile_data
 | 
			
		||||
        self.update_status.write_data(profile_data)
 | 
			
		||||
        
 | 
			
		||||
        resume_page = self.find_resume_page()
 | 
			
		||||
        if resume_page:
 | 
			
		||||
            if self.selected_values['protocol'] == 'wireguard':
 | 
			
		||||
                self.create_wireguard_profile(profile_data)
 | 
			
		||||
            else:
 | 
			
		||||
                self.create_tor_profile(profile_data)
 | 
			
		||||
 | 
			
		||||
        self.go_back()
 | 
			
		||||
 | 
			
		||||
    def create_wireguard_profile(self, profile_data):
 | 
			
		||||
        location_info = self.connection_manager.get_location_info(profile_data['location'])
 | 
			
		||||
        if not location_info:
 | 
			
		||||
            self.update_status.update_status('Invalid location selected')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        profile_id = self.get_next_available_profile_id()
 | 
			
		||||
        profile_data_for_resume = {
 | 
			
		||||
            'id': profile_id,
 | 
			
		||||
            'name': profile_data['name'],
 | 
			
		||||
            'country_code': location_info.country_code,
 | 
			
		||||
            'code': location_info.code,
 | 
			
		||||
            'application': profile_data['browser'],
 | 
			
		||||
            'connection_type': 'wireguard',
 | 
			
		||||
            'resolution': profile_data['resolution'],
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        resume_page = self.find_resume_page()
 | 
			
		||||
        if resume_page:
 | 
			
		||||
            resume_page.handle_core_action_create_profile('CREATE_SESSION_PROFILE', profile_data_for_resume, 'session')
 | 
			
		||||
 | 
			
		||||
    def create_tor_profile(self, profile_data):
 | 
			
		||||
        location_info = self.connection_manager.get_location_info(profile_data['location'])
 | 
			
		||||
        if not location_info:
 | 
			
		||||
            self.update_status.update_status('Invalid location selected')
 | 
			
		||||
            return
 | 
			
		||||
 | 
			
		||||
        connection_type = 'tor' if profile_data['connection'] == 'tor' else 'system'
 | 
			
		||||
 | 
			
		||||
        profile_id = self.get_next_available_profile_id()
 | 
			
		||||
        profile_data_for_resume = {
 | 
			
		||||
            'id': profile_id,
 | 
			
		||||
            'name': profile_data['name'],
 | 
			
		||||
            'country_code': location_info.country_code,
 | 
			
		||||
            'code': location_info.code,
 | 
			
		||||
            'application': profile_data['browser'],
 | 
			
		||||
            'connection_type': connection_type,
 | 
			
		||||
            'resolution': profile_data['resolution'],
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        resume_page = self.find_resume_page()
 | 
			
		||||
        if resume_page:
 | 
			
		||||
            resume_page.handle_core_action_create_profile('CREATE_SESSION_PROFILE', profile_data_for_resume, 'session')
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
    def find_resume_page(self):
 | 
			
		||||
        for i in range(self.page_stack.count()):
 | 
			
		||||
            page = self.page_stack.widget(i)
 | 
			
		||||
            if isinstance(page, ResumePage):
 | 
			
		||||
                return page
 | 
			
		||||
        return None
 | 
			
		||||
 | 
			
		||||
    def initialize_default_selections(self):
 | 
			
		||||
        if not self.selected_values['location']:
 | 
			
		||||
            locations = self.connection_manager.get_location_list()
 | 
			
		||||
            if locations:
 | 
			
		||||
                self.selected_values['location'] = locations[0]
 | 
			
		||||
        
 | 
			
		||||
        if not self.selected_values['browser']:
 | 
			
		||||
            browsers = self.connection_manager.get_browser_list()
 | 
			
		||||
            if browsers:
 | 
			
		||||
                self.selected_values['browser'] = browsers[0]
 | 
			
		||||
 | 
			
		||||
    def get_next_available_profile_id(self) -> int:
 | 
			
		||||
        profiles = ProfileController.get_all()
 | 
			
		||||
        if not profiles:
 | 
			
		||||
            return 1
 | 
			
		||||
            
 | 
			
		||||
        existing_ids = sorted(profiles.keys())
 | 
			
		||||
        
 | 
			
		||||
        for i in range(1, max(existing_ids) + 2):
 | 
			
		||||
            if i not in existing_ids:
 | 
			
		||||
                return i
 | 
			
		||||
                
 | 
			
		||||
        return 1
 | 
			
		||||
 | 
			
		||||
class QRCodeDialog(QDialog):
 | 
			
		||||
    def __init__(self, address_text, full_amount, currency_type=None, parent=None):
 | 
			
		||||
        super().__init__(parent)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue