mirror of
				https://github.com/nixietab/picodulce.git
				synced 2025-10-31 13:35:11 +00:00 
			
		
		
		
	Compare commits
	
		
			No commits in common. "f4b0b39090278c05cc84f1c43ae8b847e6c7636c" and "b55ac71db1bbecc79dc06cdb3df289225c815d0d" have entirely different histories.
		
	
	
		
			f4b0b39090
			...
			b55ac71db1
		
	
		
							
								
								
									
										247
									
								
								picodulce.py
									
									
									
									
									
								
							
							
						
						
									
										247
									
								
								picodulce.py
									
									
									
									
									
								
							| @ -299,7 +299,6 @@ class PicomcVersionSelector(QWidget): | |||||||
|             "IsRCPenabled": False, |             "IsRCPenabled": False, | ||||||
|             "CheckUpdate": False, |             "CheckUpdate": False, | ||||||
|             "LastPlayed": "", |             "LastPlayed": "", | ||||||
|             "Instance": "default", |  | ||||||
|             "Theme": "Dark.json", |             "Theme": "Dark.json", | ||||||
|             "ThemeBackground": True, |             "ThemeBackground": True, | ||||||
|             "ThemeRepository": "https://raw.githubusercontent.com/nixietab/picodulce-themes/main/repo.json" |             "ThemeRepository": "https://raw.githubusercontent.com/nixietab/picodulce-themes/main/repo.json" | ||||||
| @ -826,18 +825,12 @@ class PicomcVersionSelector(QWidget): | |||||||
|         try: |         try: | ||||||
|             # Set current_state to the selected instance |             # Set current_state to the selected instance | ||||||
|             self.current_state = selected_instance |             self.current_state = selected_instance | ||||||
| 
 |  | ||||||
|             # Read the config.json to get the "Instance" value |  | ||||||
|             with open('config.json', 'r') as config_file: |  | ||||||
|                 config = json.load(config_file) |  | ||||||
|                 instance_value = config.get("Instance", "default")  # Default to "default" if not found |  | ||||||
| 
 |  | ||||||
|             # Update lastplayed field in config.json on a separate thread |             # Update lastplayed field in config.json on a separate thread | ||||||
|             update_thread = threading.Thread(target=self.update_last_played, args=(selected_instance,)) |             update_thread = threading.Thread(target=self.update_last_played, args=(selected_instance,)) | ||||||
|             update_thread.start() |             update_thread.start() | ||||||
| 
 | 
 | ||||||
|             # Run the game subprocess with the instance_value from config.json |             # Run the game subprocess | ||||||
|             subprocess.run(['picomc', 'instance', 'launch', '--version-override', selected_instance, instance_value], check=True) |             subprocess.run(['picomc', 'play', selected_instance], check=True) | ||||||
| 
 | 
 | ||||||
|         except subprocess.CalledProcessError as e: |         except subprocess.CalledProcessError as e: | ||||||
|             error_message = f"Error playing {selected_instance}: {e}" |             error_message = f"Error playing {selected_instance}: {e}" | ||||||
| @ -1242,11 +1235,9 @@ class ModLoaderAndVersionMenu(QDialog): | |||||||
|         # Create tabs |         # Create tabs | ||||||
|         install_mod_tab = QWidget() |         install_mod_tab = QWidget() | ||||||
|         download_version_tab = QWidget() |         download_version_tab = QWidget() | ||||||
|         instances_tab = QWidget()  # New tab for instances |  | ||||||
| 
 | 
 | ||||||
|         tab_widget.addTab(download_version_tab, "Download Version") |         tab_widget.addTab(download_version_tab, "Download Version") | ||||||
|         tab_widget.addTab(install_mod_tab, "Install Mod Loader") |         tab_widget.addTab(install_mod_tab, "Install Mod Loader") | ||||||
|         tab_widget.addTab(instances_tab, "Instances")  # Add the new tab |  | ||||||
| 
 | 
 | ||||||
|         # Add content to "Install Mod Loader" tab |         # Add content to "Install Mod Loader" tab | ||||||
|         self.setup_install_mod_loader_tab(install_mod_tab) |         self.setup_install_mod_loader_tab(install_mod_tab) | ||||||
| @ -1254,240 +1245,6 @@ class ModLoaderAndVersionMenu(QDialog): | |||||||
|         # Add content to "Download Version" tab |         # Add content to "Download Version" tab | ||||||
|         self.setup_download_version_tab(download_version_tab) |         self.setup_download_version_tab(download_version_tab) | ||||||
| 
 | 
 | ||||||
|         # Add content to "Instances" tab |  | ||||||
|         self.setup_instances_tab(instances_tab) |  | ||||||
| 
 |  | ||||||
|     def setup_instances_tab(self, instances_tab): |  | ||||||
|         layout = QVBoxLayout(instances_tab) |  | ||||||
| 
 |  | ||||||
|         # Create title label |  | ||||||
|         title_label = QLabel('Current Instance:') |  | ||||||
|         title_label.setFont(QFont("Arial", 14)) |  | ||||||
|         layout.addWidget(title_label) |  | ||||||
| 
 |  | ||||||
|         # Create a label to display the current instance |  | ||||||
|         self.current_instance_label = QLabel('Loading...')  # Placeholder text |  | ||||||
|         layout.addWidget(self.current_instance_label) |  | ||||||
| 
 |  | ||||||
|         # Create a QListWidget to display the instances |  | ||||||
|         self.instances_list_widget = QListWidget() |  | ||||||
|         layout.addWidget(self.instances_list_widget) |  | ||||||
| 
 |  | ||||||
|         # Create input field and button to create a new instance |  | ||||||
|         self.create_instance_input = QLineEdit() |  | ||||||
|         self.create_instance_input.setPlaceholderText("Enter instance name") |  | ||||||
|         layout.addWidget(self.create_instance_input) |  | ||||||
| 
 |  | ||||||
|         create_instance_button = QPushButton("Create Instance") |  | ||||||
|         create_instance_button.clicked.connect(self.create_instance) |  | ||||||
|         layout.addWidget(create_instance_button) |  | ||||||
| 
 |  | ||||||
|         # Create input field and button to rename an instance |  | ||||||
|         self.rename_instance_input = QLineEdit() |  | ||||||
|         self.rename_instance_input.setPlaceholderText("Enter new instance name") |  | ||||||
|         layout.addWidget(self.rename_instance_input) |  | ||||||
| 
 |  | ||||||
|         rename_instance_button = QPushButton("Rename Instance") |  | ||||||
|         rename_instance_button.clicked.connect(self.rename_instance) |  | ||||||
|         layout.addWidget(rename_instance_button) |  | ||||||
| 
 |  | ||||||
|         # Create button to delete an instance |  | ||||||
|         delete_instance_button = QPushButton("Delete Instance") |  | ||||||
|         delete_instance_button.clicked.connect(self.delete_instance) |  | ||||||
|         layout.addWidget(delete_instance_button) |  | ||||||
| 
 |  | ||||||
|         # Fetch and display the current instances |  | ||||||
|         self.load_instances() |  | ||||||
| 
 |  | ||||||
|         # Connect the item selection to the instance selection method |  | ||||||
|         self.instances_list_widget.itemClicked.connect(self.on_instance_selected) |  | ||||||
| 
 |  | ||||||
|         # Update the label with the current instance from the config |  | ||||||
|         self.update_instance_label() |  | ||||||
| 
 |  | ||||||
|     def create_instance(self): |  | ||||||
|         instance_name = self.create_instance_input.text().strip() |  | ||||||
| 
 |  | ||||||
|         if instance_name: |  | ||||||
|             try: |  | ||||||
|                 # Run the "picomc instance create" command |  | ||||||
|                 process = subprocess.Popen(['picomc', 'instance', 'create', instance_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) |  | ||||||
|                 output, error = process.communicate() |  | ||||||
| 
 |  | ||||||
|                 if process.returncode != 0: |  | ||||||
|                     raise subprocess.CalledProcessError(process.returncode, process.args, error) |  | ||||||
| 
 |  | ||||||
|                 # Notify the user that the instance was created |  | ||||||
|                 QMessageBox.information(self, "Instance Created", f"Instance '{instance_name}' has been created successfully.") |  | ||||||
| 
 |  | ||||||
|                 # Reload the instances list |  | ||||||
|                 self.load_instances() |  | ||||||
| 
 |  | ||||||
|                 # Optionally select the newly created instance |  | ||||||
|                 self.on_instance_selected(self.instances_list_widget.item(self.instances_list_widget.count() - 1)) |  | ||||||
| 
 |  | ||||||
|             except FileNotFoundError: |  | ||||||
|                 logging.error("'picomc' command not found. Please make sure it's installed and in your PATH.") |  | ||||||
|             except subprocess.CalledProcessError as e: |  | ||||||
|                 logging.error("Error creating instance: %s", e.stderr) |  | ||||||
|                 QMessageBox.critical(self, "Error", f"Failed to create instance: {e.stderr}") |  | ||||||
|         else: |  | ||||||
|             QMessageBox.warning(self, "Invalid Input", "Please enter a valid instance name.") |  | ||||||
| 
 |  | ||||||
|     def rename_instance(self): |  | ||||||
|         selected_item = self.instances_list_widget.currentItem() |  | ||||||
| 
 |  | ||||||
|         if not selected_item: |  | ||||||
|             QMessageBox.warning(self, "No Selection", "Please select an instance to rename.") |  | ||||||
|             return |  | ||||||
| 
 |  | ||||||
|         old_instance_name = selected_item.text() |  | ||||||
|         new_instance_name = self.rename_instance_input.text().strip() |  | ||||||
| 
 |  | ||||||
|         if not new_instance_name: |  | ||||||
|             QMessageBox.warning(self, "Invalid Input", "Please enter a valid new instance name.") |  | ||||||
|             return |  | ||||||
| 
 |  | ||||||
|         if old_instance_name == "default": |  | ||||||
|             QMessageBox.warning(self, "Cannot Rename Instance", "You cannot rename the 'default' instance.") |  | ||||||
|             return |  | ||||||
| 
 |  | ||||||
|         try: |  | ||||||
|             # Run the "picomc instance rename" command |  | ||||||
|             process = subprocess.Popen( |  | ||||||
|                 ['picomc', 'instance', 'rename', old_instance_name, new_instance_name], |  | ||||||
|                 stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True |  | ||||||
|             ) |  | ||||||
|             output, error = process.communicate() |  | ||||||
| 
 |  | ||||||
|             if process.returncode != 0: |  | ||||||
|                 raise subprocess.CalledProcessError(process.returncode, process.args, error) |  | ||||||
| 
 |  | ||||||
|             QMessageBox.information(self, "Instance Renamed", f"Instance '{old_instance_name}' has been renamed to '{new_instance_name}' successfully.") |  | ||||||
| 
 |  | ||||||
|             # Reload the instances list |  | ||||||
|             self.load_instances() |  | ||||||
| 
 |  | ||||||
|             # Optionally select the newly renamed instance |  | ||||||
|             matching_items = self.instances_list_widget.findItems(new_instance_name, Qt.MatchExactly) |  | ||||||
|             if matching_items: |  | ||||||
|                 self.instances_list_widget.setCurrentItem(matching_items[0]) |  | ||||||
| 
 |  | ||||||
|         except FileNotFoundError: |  | ||||||
|             logging.error("'picomc' command not found. Please make sure it's installed and in your PATH.") |  | ||||||
|         except subprocess.CalledProcessError as e: |  | ||||||
|             logging.error("Error renaming instance: %s", e.stderr) |  | ||||||
|             QMessageBox.critical(self, "Error", f"Failed to rename instance: {e.stderr}") |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     def delete_instance(self): |  | ||||||
|         # Get the selected instance name |  | ||||||
|         selected_instance = self.instances_list_widget.currentItem() |  | ||||||
| 
 |  | ||||||
|         if selected_instance: |  | ||||||
|             instance_name = selected_instance.text() |  | ||||||
| 
 |  | ||||||
|             # Prevent deletion of the "default" instance |  | ||||||
|             if instance_name == "default": |  | ||||||
|                 QMessageBox.warning(self, "Cannot Delete Instance", "You cannot delete the 'default' instance.") |  | ||||||
|                 return |  | ||||||
| 
 |  | ||||||
|             confirm_delete = QMessageBox.question( |  | ||||||
|                 self, "Confirm Deletion", f"Are you sure you want to delete the instance '{instance_name}'?", |  | ||||||
|                 QMessageBox.Yes | QMessageBox.No, QMessageBox.No |  | ||||||
|             ) |  | ||||||
| 
 |  | ||||||
|             if confirm_delete == QMessageBox.Yes: |  | ||||||
|                 try: |  | ||||||
|                     # Run the "picomc instance delete" command |  | ||||||
|                     process = subprocess.Popen(['picomc', 'instance', 'delete', instance_name], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) |  | ||||||
|                     output, error = process.communicate() |  | ||||||
| 
 |  | ||||||
|                     if process.returncode != 0: |  | ||||||
|                         raise subprocess.CalledProcessError(process.returncode, process.args, error) |  | ||||||
| 
 |  | ||||||
|                     # Notify the user that the instance was deleted |  | ||||||
|                     QMessageBox.information(self, "Instance Deleted", f"Instance '{instance_name}' has been deleted successfully.") |  | ||||||
| 
 |  | ||||||
|                     # Reload the instances list |  | ||||||
|                     self.load_instances() |  | ||||||
| 
 |  | ||||||
|                 except FileNotFoundError: |  | ||||||
|                     logging.error("'picomc' command not found. Please make sure it's installed and in your PATH.") |  | ||||||
|                 except subprocess.CalledProcessError as e: |  | ||||||
|                     logging.error("Error deleting instance: %s", e.stderr) |  | ||||||
|                     QMessageBox.critical(self, "Error", f"Failed to delete instance: {e.stderr}") |  | ||||||
|         else: |  | ||||||
|             QMessageBox.warning(self, "No Selection", "Please select an instance to delete.") |  | ||||||
| 
 |  | ||||||
|     def load_instances(self): |  | ||||||
|         try: |  | ||||||
|             process = subprocess.Popen(['picomc', 'instance', 'list'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) |  | ||||||
|             output, error = process.communicate() |  | ||||||
|             if process.returncode != 0: |  | ||||||
|                 raise subprocess.CalledProcessError(process.returncode, process.args, error) |  | ||||||
| 
 |  | ||||||
|             # Parse the output and add each instance to the list widget |  | ||||||
|             instances = output.splitlines() |  | ||||||
|             self.instances_list_widget.clear()  # Clear the previous list |  | ||||||
|             self.instances_list_widget.addItems(instances) |  | ||||||
| 
 |  | ||||||
|         except FileNotFoundError: |  | ||||||
|             logging.error("'picomc' command not found. Please make sure it's installed and in your PATH.") |  | ||||||
|         except subprocess.CalledProcessError as e: |  | ||||||
|             logging.error("Error fetching instances: %s", e.stderr) |  | ||||||
| 
 |  | ||||||
|     def on_instance_selected(self, item): |  | ||||||
|         # Get the selected instance name |  | ||||||
|         selected_instance = item.text() |  | ||||||
| 
 |  | ||||||
|         # Path to the config.json file |  | ||||||
|         config_file = 'config.json' |  | ||||||
| 
 |  | ||||||
|         # Check if the config file exists |  | ||||||
|         if os.path.exists(config_file): |  | ||||||
|             try: |  | ||||||
|                 # Load the current config.json file |  | ||||||
|                 with open(config_file, 'r') as file: |  | ||||||
|                     config_data = json.load(file) |  | ||||||
| 
 |  | ||||||
|                 # Update the "Instance" value with the selected instance name |  | ||||||
|                 config_data['Instance'] = selected_instance |  | ||||||
| 
 |  | ||||||
|                 # Save the updated config back to the file |  | ||||||
|                 with open(config_file, 'w') as file: |  | ||||||
|                     json.dump(config_data, file, indent=4) |  | ||||||
| 
 |  | ||||||
|                 logging.info(f"Config updated: Instance set to {selected_instance}") |  | ||||||
| 
 |  | ||||||
|                 # Update the label with the new instance |  | ||||||
|                 self.update_instance_label() |  | ||||||
| 
 |  | ||||||
|             except (json.JSONDecodeError, FileNotFoundError) as e: |  | ||||||
|                 logging.error(f"Error reading config.json: {e}") |  | ||||||
|         else: |  | ||||||
|             logging.warning(f"{config_file} not found. Unable to update instance.") |  | ||||||
| 
 |  | ||||||
|     def update_instance_label(self): |  | ||||||
|         config_file = 'config.json' |  | ||||||
| 
 |  | ||||||
|         if os.path.exists(config_file): |  | ||||||
|             try: |  | ||||||
|                 # Load the config file |  | ||||||
|                 with open(config_file, 'r') as file: |  | ||||||
|                     config_data = json.load(file) |  | ||||||
| 
 |  | ||||||
|                 # Get the current instance from the config and update the label |  | ||||||
|                 current_instance = config_data.get('Instance', 'Not set') |  | ||||||
|                 self.current_instance_label.setText(f'Current instance: {current_instance}') |  | ||||||
| 
 |  | ||||||
|             except (json.JSONDecodeError, FileNotFoundError) as e: |  | ||||||
|                 logging.error(f"Error reading config.json: {e}") |  | ||||||
|         else: |  | ||||||
|             self.current_instance_label.setText('Current instance: Not set') |  | ||||||
| 
 |  | ||||||
|     def setup_install_mod_loader_tab(self, install_mod_tab): |     def setup_install_mod_loader_tab(self, install_mod_tab): | ||||||
|         layout = QVBoxLayout(install_mod_tab) |         layout = QVBoxLayout(install_mod_tab) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
|   "version": "0.11.4", |   "version": "0.11.3", | ||||||
|   "links": [ |   "links": [ | ||||||
|     "https://raw.githubusercontent.com/nixietab/picodulce/main/version.json", |     "https://raw.githubusercontent.com/nixietab/picodulce/main/version.json", | ||||||
|     "https://raw.githubusercontent.com/nixietab/picodulce/main/picodulce.py", |     "https://raw.githubusercontent.com/nixietab/picodulce/main/picodulce.py", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user