From 931c8f2ebfe0739073cb395034ba5e34a991945e Mon Sep 17 00:00:00 2001 From: Nix <75538775+nixietab@users.noreply.github.com> Date: Mon, 15 Apr 2024 07:51:47 -0300 Subject: [PATCH] Add files via upload --- launcher_icon.ico | Bin 0 -> 10415 bytes picodulce.py | 268 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 launcher_icon.ico create mode 100644 picodulce.py diff --git a/launcher_icon.ico b/launcher_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6e8d8dbe5c2e456a5a2999c13b67f37780f8a475 GIT binary patch literal 10415 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 S@JmzxV62b4RC>|n{{I0UA8H){ literal 0 HcmV?d00001 diff --git a/picodulce.py b/picodulce.py new file mode 100644 index 0000000..5e97b1a --- /dev/null +++ b/picodulce.py @@ -0,0 +1,268 @@ +import sys +import subprocess +import picomc +from PyQt5.QtWidgets import QApplication, QComboBox, QWidget, QVBoxLayout, QPushButton, QMessageBox, QDialog, QHBoxLayout, QLabel, QLineEdit, QCheckBox +from PyQt5.QtGui import QFont, QIcon, QColor, QPalette +from PyQt5.QtCore import Qt + + +class PicomcVersionSelector(QWidget): + def __init__(self): + super().__init__() + + self.init_ui() + + def init_ui(self): + self.setWindowTitle('PicoDulce Launcher') + self.setWindowIcon(QIcon('launcher_icon.ico')) # Set window icon + self.setGeometry(100, 100, 400, 250) + + # Create title label + title_label = QLabel('PicoDulce Launcher') + title_label.setFont(QFont("Arial", 24, QFont.Bold)) + + # Create installed versions section + installed_versions_label = QLabel('Installed Versions:') + installed_versions_label.setFont(QFont("Arial", 14)) + self.installed_version_combo = QComboBox() + self.installed_version_combo.setMinimumWidth(200) + self.populate_installed_versions() + + # Create buttons layout + buttons_layout = QVBoxLayout() + + # Create play button for installed versions + self.play_button = QPushButton('Play') + self.play_button.setFocusPolicy(Qt.NoFocus) # Set focus policy to prevent highlighting + self.play_button.clicked.connect(self.play_instance) + self.play_button.setStyleSheet("background-color: #1E90FF; color: white;") + buttons_layout.addWidget(self.play_button) + + # Create button to open version download menu + self.version_download_button = QPushButton('Download Version') + self.version_download_button.clicked.connect(self.open_version_menu) + buttons_layout.addWidget(self.version_download_button) + + # Create button to manage accounts + self.manage_accounts_button = QPushButton('Manage Accounts') + self.manage_accounts_button.clicked.connect(self.manage_accounts) + buttons_layout.addWidget(self.manage_accounts_button) + + # Create About button + self.about_button = QPushButton('About') + self.about_button.clicked.connect(self.show_about_dialog) + buttons_layout.addWidget(self.about_button) + + # Set buttons layout alignment and spacing + buttons_layout.setAlignment(Qt.AlignTop) + buttons_layout.setSpacing(10) + + # Set layout + main_layout = QVBoxLayout() + main_layout.addWidget(title_label, alignment=Qt.AlignCenter) + main_layout.addWidget(installed_versions_label) + main_layout.addWidget(self.installed_version_combo) + main_layout.addLayout(buttons_layout) + main_layout.setAlignment(Qt.AlignCenter) + main_layout.setSpacing(20) + + self.setLayout(main_layout) + + def populate_installed_versions(self): + # Run the command and get the output + try: + process = subprocess.Popen(['picomc', 'version', '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) + except FileNotFoundError: + print("Error: 'picomc' command not found. Please make sure it's installed and in your PATH.") + sys.exit(1) + except subprocess.CalledProcessError as e: + print("Error:", e.stderr) + sys.exit(1) + + # Parse the output and replace '[local]' with a space + versions = output.splitlines() + versions = [version.replace('[local]', ' ').strip() for version in versions] + + # Populate installed versions combo box + self.installed_version_combo.clear() + self.installed_version_combo.addItems(versions) + + def play_instance(self): + selected_instance = self.installed_version_combo.currentText() + try: + subprocess.run(['picomc', 'play', selected_instance], check=True) + except subprocess.CalledProcessError as e: + error_message = f"Error playing {selected_instance}: {e.stderr.decode()}" + QMessageBox.critical(self, "Error", error_message) + + def open_version_menu(self): + dialog = QDialog(self) + dialog.setWindowTitle('Download Version') + dialog.setFixedSize(300, 250) + + # Create title label + title_label = QLabel('Download Version') + title_label.setFont(QFont("Arial", 14)) + + # Create checkboxes for different version types + release_checkbox = QCheckBox('Releases') + snapshot_checkbox = QCheckBox('Snapshots') + alpha_checkbox = QCheckBox('Alpha') + beta_checkbox = QCheckBox('Beta') + + # Create dropdown menu for versions + version_combo = QComboBox() + + def update_versions(): + version_combo.clear() + options = [] + if release_checkbox.isChecked(): + options.append('--release') + if snapshot_checkbox.isChecked(): + options.append('--snapshot') + if alpha_checkbox.isChecked(): + options.append('--alpha') + if beta_checkbox.isChecked(): + options.append('--beta') + if options: + try: + process = subprocess.Popen(['picomc', 'version', 'list'] + options, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + output, error = process.communicate() + if process.returncode != 0: + raise subprocess.CalledProcessError(process.returncode, process.args, error) + except FileNotFoundError: + print("Error: 'picomc' command not found. Please make sure it's installed and in your PATH.") + sys.exit(1) + except subprocess.CalledProcessError as e: + print("Error:", e.stderr) + sys.exit(1) + + # Parse the output and replace '[local]' with a space + versions = output.splitlines() + versions = [version.replace('[local]', ' ').strip() for version in versions] + version_combo.addItems(versions) + + release_checkbox.clicked.connect(update_versions) + snapshot_checkbox.clicked.connect(update_versions) + alpha_checkbox.clicked.connect(update_versions) + beta_checkbox.clicked.connect(update_versions) + + # Set layout + layout = QVBoxLayout() + layout.addWidget(title_label) + layout.addWidget(release_checkbox) + layout.addWidget(snapshot_checkbox) + layout.addWidget(alpha_checkbox) + layout.addWidget(beta_checkbox) + layout.addWidget(version_combo) + + # Create download button + download_button = QPushButton('Download') + download_button.clicked.connect(lambda: self.prepare_version(dialog, version_combo.currentText())) + + layout.addWidget(download_button) + + dialog.setLayout(layout) + dialog.exec_() + + def prepare_version(self, dialog, version): + dialog.close() + try: + subprocess.run(['picomc', 'version', 'prepare', version], check=True) + QMessageBox.information(self, "Success", f"Version {version} prepared successfully!") + self.populate_installed_versions() # Refresh the installed versions list after downloading + except subprocess.CalledProcessError as e: + error_message = f"Error preparing {version}: {e.stderr.decode()}" + QMessageBox.critical(self, "Error", error_message) + + def manage_accounts(self): + dialog = QDialog(self) + dialog.setWindowTitle('Manage Accounts') + dialog.setFixedSize(300, 150) + + # Create title label + title_label = QLabel('Manage Accounts') + title_label.setFont(QFont("Arial", 14)) + + # Create dropdown menu for accounts + account_combo = QComboBox() + self.populate_accounts(account_combo) + + # Create select button + select_button = QPushButton('Select') + select_button.clicked.connect(lambda: self.set_default_account(dialog, account_combo.currentText())) + + # Set layout + layout = QVBoxLayout() + layout.addWidget(title_label) + layout.addWidget(account_combo) + layout.addWidget(select_button) + + # Create a separate section for creating a new account + create_account_layout = QHBoxLayout() + new_account_input = QLineEdit() + create_account_button = QPushButton('Create') + create_account_button.clicked.connect(lambda: self.create_account(dialog, new_account_input.text())) + create_account_layout.addWidget(new_account_input) + create_account_layout.addWidget(create_account_button) + + layout.addLayout(create_account_layout) + + dialog.setLayout(layout) + dialog.exec_() + + def populate_accounts(self, account_combo): + # Run the command and get the output + try: + process = subprocess.Popen(['picomc', 'account', '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) + except FileNotFoundError: + print("Error: 'picomc' command not found. Please make sure it's installed and in your PATH.") + sys.exit(1) + except subprocess.CalledProcessError as e: + print("Error:", e.stderr) + sys.exit(1) + + # Parse the output and remove ' *' from account names + accounts = output.splitlines() + accounts = [account.replace(' *', '').strip() for account in accounts] + + # Populate accounts combo box + account_combo.clear() + account_combo.addItems(accounts) + + def create_account(self, dialog, username): + if username.strip() == '': + QMessageBox.warning(dialog, "Warning", "Username cannot be blank.") + return + try: + subprocess.run(['picomc', 'account', 'create', username], check=True) + QMessageBox.information(self, "Success", f"Account {username} created successfully!") + self.populate_accounts(dialog.findChild(QComboBox)) + except subprocess.CalledProcessError as e: + error_message = f"Error creating account: {e.stderr.decode()}" + QMessageBox.critical(self, "Error", error_message) + + def set_default_account(self, dialog, account): + dialog.close() + try: + subprocess.run(['picomc', 'account', 'setdefault', account], check=True) + QMessageBox.information(self, "Success", f"Default account set to {account}!") + except subprocess.CalledProcessError as e: + error_message = f"Error setting default account: {e.stderr.decode()}" + QMessageBox.critical(self, "Error", error_message) + + def show_about_dialog(self): + about_message = "PicoDulce Launcher\n\nA simple gui for the picomc proyect." + QMessageBox.about(self, "About", about_message) + +if __name__ == '__main__': + app = QApplication(sys.argv) + window = PicomcVersionSelector() + window.show() + sys.exit(app.exec_())