mirror of
https://github.com/nixietab/picodulce.git
synced 2025-04-10 10:28:56 +01:00
Add files via upload
This commit is contained in:
parent
942daa79ad
commit
3523325449
95
marroc.py
95
marroc.py
@ -2,20 +2,39 @@ import sys
|
|||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
import json
|
import json
|
||||||
|
import threading
|
||||||
import requests
|
import requests
|
||||||
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QListWidget, QListWidgetItem, QMessageBox, QComboBox, QDialog, QTabWidget, QMainWindow, QSpacerItem, QSizePolicy
|
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QListWidget, QListWidgetItem, QMessageBox, QComboBox, QDialog, QTabWidget, QMainWindow, QSpacerItem, QSizePolicy
|
||||||
from PyQt5.QtCore import Qt, QSize
|
from PyQt5.QtCore import Qt, QSize, QObject, pyqtSignal
|
||||||
from PyQt5.QtGui import QIcon, QPalette, QColor, QPixmap
|
from PyQt5.QtGui import QIcon, QPalette, QColor, QPixmap
|
||||||
|
|
||||||
CONFIG_FILE = "config.json"
|
CONFIG_FILE = "config.json"
|
||||||
|
|
||||||
|
class IconLoader(QObject, threading.Thread):
|
||||||
|
icon_loaded = pyqtSignal(QPixmap)
|
||||||
|
|
||||||
|
def __init__(self, icon_url):
|
||||||
|
super().__init__()
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.icon_url = icon_url
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
try:
|
||||||
|
response = requests.get(self.icon_url)
|
||||||
|
if response.status_code == 200:
|
||||||
|
pixmap = QPixmap()
|
||||||
|
pixmap.loadFromData(response.content)
|
||||||
|
self.icon_loaded.emit(pixmap.scaled(QSize(42, 42), Qt.KeepAspectRatio, Qt.SmoothTransformation))
|
||||||
|
else:
|
||||||
|
self.icon_loaded.emit(None)
|
||||||
|
except Exception as e:
|
||||||
|
print("Error loading icon:", e)
|
||||||
|
self.icon_loaded.emit(None)
|
||||||
|
|
||||||
class ModrinthSearchApp(QWidget):
|
class ModrinthSearchApp(QWidget):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
# Check and create folders if they don't exist
|
|
||||||
self.check_and_create_folders()
|
|
||||||
|
|
||||||
self.setWindowTitle("Marroc Mod Manager")
|
self.setWindowTitle("Marroc Mod Manager")
|
||||||
self.setGeometry(100, 100, 500, 400)
|
self.setGeometry(100, 100, 500, 400)
|
||||||
|
|
||||||
@ -45,7 +64,7 @@ class ModrinthSearchApp(QWidget):
|
|||||||
self.mods_tab = QWidget()
|
self.mods_tab = QWidget()
|
||||||
|
|
||||||
tab_widget.addTab(self.search_tab, "Search")
|
tab_widget.addTab(self.search_tab, "Search")
|
||||||
tab_widget.addTab(self.mods_tab, "Mods")
|
tab_widget.addTab(self.mods_tab, "Manager")
|
||||||
|
|
||||||
self.init_search_tab()
|
self.init_search_tab()
|
||||||
self.init_mods_tab()
|
self.init_mods_tab()
|
||||||
@ -54,26 +73,19 @@ class ModrinthSearchApp(QWidget):
|
|||||||
|
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
def check_and_create_folders(self):
|
|
||||||
# Check and create 'marroc/mods' and 'marroc/resourcepacks' folders if they don't exist
|
|
||||||
folders = ['marroc/mods', 'marroc/resourcepacks']
|
|
||||||
for folder in folders:
|
|
||||||
if not os.path.exists(folder):
|
|
||||||
os.makedirs(folder)
|
|
||||||
|
|
||||||
def init_search_tab(self):
|
def init_search_tab(self):
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
|
|
||||||
search_layout = QHBoxLayout() # Horizontal layout for search bar and dropdown
|
search_layout = QHBoxLayout()
|
||||||
self.search_input = QLineEdit()
|
self.search_input = QLineEdit()
|
||||||
self.search_input.setPlaceholderText("Enter mod name...")
|
self.search_input.setPlaceholderText("Enter a search term...")
|
||||||
search_layout.addWidget(self.search_input)
|
search_layout.addWidget(self.search_input)
|
||||||
|
|
||||||
self.search_button = QPushButton("Search")
|
self.search_button = QPushButton("Search")
|
||||||
self.search_button.clicked.connect(self.search_mods)
|
self.search_button.clicked.connect(self.search_mods)
|
||||||
search_layout.addWidget(self.search_button)
|
search_layout.addWidget(self.search_button)
|
||||||
|
|
||||||
self.search_type_dropdown = QComboBox() # Dropdown for selecting mod type
|
self.search_type_dropdown = QComboBox()
|
||||||
self.search_type_dropdown.addItems(["Mod", "Texture Pack"])
|
self.search_type_dropdown.addItems(["Mod", "Texture Pack"])
|
||||||
search_layout.addWidget(self.search_type_dropdown)
|
search_layout.addWidget(self.search_type_dropdown)
|
||||||
|
|
||||||
@ -82,7 +94,7 @@ class ModrinthSearchApp(QWidget):
|
|||||||
self.mods_list = QListWidget()
|
self.mods_list = QListWidget()
|
||||||
layout.addWidget(self.mods_list)
|
layout.addWidget(self.mods_list)
|
||||||
|
|
||||||
self.select_button = QPushButton("Select Mod")
|
self.select_button = QPushButton("Select")
|
||||||
self.select_button.clicked.connect(self.show_mod_details_window)
|
self.select_button.clicked.connect(self.show_mod_details_window)
|
||||||
layout.addWidget(self.select_button)
|
layout.addWidget(self.select_button)
|
||||||
|
|
||||||
@ -92,14 +104,14 @@ class ModrinthSearchApp(QWidget):
|
|||||||
|
|
||||||
def init_mods_tab(self):
|
def init_mods_tab(self):
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
self.mod_manager_window = ModManagerWindow() # Initialize ModManagerWindow
|
self.mod_manager_window = ModManagerWindow()
|
||||||
layout.addWidget(self.mod_manager_window)
|
layout.addWidget(self.mod_manager_window)
|
||||||
self.mods_tab.setLayout(layout)
|
self.mods_tab.setLayout(layout)
|
||||||
|
|
||||||
def search_mods(self):
|
def search_mods(self):
|
||||||
self.mods_list.clear()
|
self.mods_list.clear()
|
||||||
mod_name = self.search_input.text()
|
mod_name = self.search_input.text()
|
||||||
search_type = self.search_type_dropdown.currentText().lower() # Get selected mod type
|
search_type = self.search_type_dropdown.currentText().lower()
|
||||||
if search_type == "texture pack":
|
if search_type == "texture pack":
|
||||||
api_url = f"https://api.modrinth.com/v2/search?query={mod_name}&limit=20&facets=%5B%5B%22project_type%3Aresourcepack%22%5D%5D"
|
api_url = f"https://api.modrinth.com/v2/search?query={mod_name}&limit=20&facets=%5B%5B%22project_type%3Aresourcepack%22%5D%5D"
|
||||||
else:
|
else:
|
||||||
@ -110,13 +122,24 @@ class ModrinthSearchApp(QWidget):
|
|||||||
for mod in mods_data['hits']:
|
for mod in mods_data['hits']:
|
||||||
mod_name = mod['title']
|
mod_name = mod['title']
|
||||||
mod_description = mod['description']
|
mod_description = mod['description']
|
||||||
|
icon_url = mod['icon_url']
|
||||||
item = QListWidgetItem(f"Title: {mod_name}\nDescription: {mod_description}")
|
item = QListWidgetItem(f"Title: {mod_name}\nDescription: {mod_description}")
|
||||||
item.setSizeHint(QSize(100, 50)) # Set size hint to increase height
|
item.setSizeHint(QSize(200, 50))
|
||||||
|
icon_loader = IconLoader(icon_url)
|
||||||
|
icon_loader.icon_loaded.connect(lambda pixmap, item=item: self.set_item_icon(item, pixmap))
|
||||||
|
icon_loader.start()
|
||||||
item.mod_data = mod
|
item.mod_data = mod
|
||||||
self.mods_list.addItem(item)
|
self.mods_list.addItem(item)
|
||||||
else:
|
else:
|
||||||
self.mods_list.addItem("Failed to fetch mods. Please try again later.")
|
self.mods_list.addItem("Failed to fetch mods. Please try again later.")
|
||||||
|
|
||||||
|
def set_item_icon(self, item, pixmap):
|
||||||
|
if pixmap:
|
||||||
|
item.setData(Qt.DecorationRole, pixmap)
|
||||||
|
else:
|
||||||
|
# Set a default icon if loading failed
|
||||||
|
item.setIcon(QIcon("default_icon.png"))
|
||||||
|
|
||||||
def show_mod_details_window(self):
|
def show_mod_details_window(self):
|
||||||
selected_item = self.mods_list.currentItem()
|
selected_item = self.mods_list.currentItem()
|
||||||
if selected_item is not None:
|
if selected_item is not None:
|
||||||
@ -167,48 +190,32 @@ class ModManagerWindow(QMainWindow):
|
|||||||
|
|
||||||
self.layout = QHBoxLayout(self.central_widget)
|
self.layout = QHBoxLayout(self.central_widget)
|
||||||
|
|
||||||
# Combo box to select between mods and resource packs
|
|
||||||
self.file_type_combo_box = QComboBox()
|
self.file_type_combo_box = QComboBox()
|
||||||
self.file_type_combo_box.addItems(["Mods", "Resource Packs"])
|
self.file_type_combo_box.addItems(["Mods", "Resource Packs"])
|
||||||
self.file_type_combo_box.currentIndexChanged.connect(self.load_files)
|
self.file_type_combo_box.currentIndexChanged.connect(self.load_files)
|
||||||
|
|
||||||
# Left column - Available files
|
|
||||||
self.available_files_widget = QListWidget()
|
self.available_files_widget = QListWidget()
|
||||||
|
|
||||||
# Right column - Installed files
|
|
||||||
self.installed_files_widget = QListWidget()
|
self.installed_files_widget = QListWidget()
|
||||||
|
|
||||||
# Vertical layout for buttons and dropdown
|
|
||||||
self.button_dropdown_layout = QVBoxLayout()
|
self.button_dropdown_layout = QVBoxLayout()
|
||||||
self.button_dropdown_layout.addWidget(self.file_type_combo_box)
|
self.button_dropdown_layout.addWidget(self.file_type_combo_box)
|
||||||
|
|
||||||
# Spacer to center the buttons vertically
|
|
||||||
self.button_dropdown_layout.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
|
self.button_dropdown_layout.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
|
||||||
|
|
||||||
# Button to move selected mod from available to installed
|
|
||||||
self.move_right_button = QPushButton(">")
|
self.move_right_button = QPushButton(">")
|
||||||
self.move_right_button.clicked.connect(self.move_right)
|
self.move_right_button.clicked.connect(self.move_right)
|
||||||
self.button_dropdown_layout.addWidget(self.move_right_button)
|
self.button_dropdown_layout.addWidget(self.move_right_button)
|
||||||
|
|
||||||
# Button to move selected mod from installed to available
|
|
||||||
self.move_left_button = QPushButton("<")
|
self.move_left_button = QPushButton("<")
|
||||||
self.move_left_button.clicked.connect(self.move_left)
|
self.move_left_button.clicked.connect(self.move_left)
|
||||||
self.button_dropdown_layout.addWidget(self.move_left_button)
|
self.button_dropdown_layout.addWidget(self.move_left_button)
|
||||||
|
|
||||||
# Button to delete selected item
|
|
||||||
self.delete_button = QPushButton("Delete")
|
self.delete_button = QPushButton("Delete")
|
||||||
self.delete_button.clicked.connect(self.delete_selected_item)
|
self.delete_button.clicked.connect(self.delete_selected_item)
|
||||||
self.button_dropdown_layout.addWidget(self.delete_button)
|
self.button_dropdown_layout.addWidget(self.delete_button)
|
||||||
|
|
||||||
# Spacer to center the buttons vertically
|
|
||||||
self.button_dropdown_layout.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
|
self.button_dropdown_layout.addSpacerItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding))
|
||||||
|
|
||||||
# Add widgets to the layout
|
|
||||||
self.layout.addWidget(self.available_files_widget)
|
self.layout.addWidget(self.available_files_widget)
|
||||||
self.layout.addLayout(self.button_dropdown_layout)
|
self.layout.addLayout(self.button_dropdown_layout)
|
||||||
self.layout.addWidget(self.installed_files_widget)
|
self.layout.addWidget(self.installed_files_widget)
|
||||||
|
|
||||||
# Load files based on initial selection
|
|
||||||
self.load_files()
|
self.load_files()
|
||||||
|
|
||||||
def load_files(self):
|
def load_files(self):
|
||||||
@ -219,36 +226,28 @@ class ModManagerWindow(QMainWindow):
|
|||||||
self.load_resource_packs()
|
self.load_resource_packs()
|
||||||
|
|
||||||
def load_mods(self):
|
def load_mods(self):
|
||||||
# Load mods from specified directory
|
|
||||||
mods_directory = "marroc/mods"
|
mods_directory = "marroc/mods"
|
||||||
if os.path.exists(mods_directory) and os.path.isdir(mods_directory):
|
if os.path.exists(mods_directory) and os.path.isdir(mods_directory):
|
||||||
mods = os.listdir(mods_directory)
|
mods = os.listdir(mods_directory)
|
||||||
self.available_files_widget.clear()
|
self.available_files_widget.clear()
|
||||||
self.available_files_widget.addItems(mods)
|
self.available_files_widget.addItems(mods)
|
||||||
|
|
||||||
# Load installed mods
|
|
||||||
self.load_installed_mods("mods")
|
self.load_installed_mods("mods")
|
||||||
|
|
||||||
def load_resource_packs(self):
|
def load_resource_packs(self):
|
||||||
# Load resource packs from specified directory
|
|
||||||
resource_packs_directory = "marroc/resourcepacks"
|
resource_packs_directory = "marroc/resourcepacks"
|
||||||
if os.path.exists(resource_packs_directory) and os.path.isdir(resource_packs_directory):
|
if os.path.exists(resource_packs_directory) and os.path.isdir(resource_packs_directory):
|
||||||
resource_packs = os.listdir(resource_packs_directory)
|
resource_packs = os.listdir(resource_packs_directory)
|
||||||
self.available_files_widget.clear()
|
self.available_files_widget.clear()
|
||||||
self.available_files_widget.addItems(resource_packs)
|
self.available_files_widget.addItems(resource_packs)
|
||||||
|
|
||||||
# Load installed resource packs
|
|
||||||
self.load_installed_mods("resourcepacks")
|
self.load_installed_mods("resourcepacks")
|
||||||
|
|
||||||
def load_installed_mods(self, file_type):
|
def load_installed_mods(self, file_type):
|
||||||
# Detect Minecraft directory based on the operating system
|
|
||||||
if sys.platform.startswith('linux'):
|
if sys.platform.startswith('linux'):
|
||||||
minecraft_directory = os.path.expanduser("~/.local/share/picomc/instances/default/minecraft")
|
minecraft_directory = os.path.expanduser("~/.local/share/picomc/instances/default/minecraft")
|
||||||
elif sys.platform.startswith('win'):
|
elif sys.platform.startswith('win'):
|
||||||
minecraft_directory = os.path.join(os.getenv('APPDATA'), '.picomc/instances/default/minecraft')
|
minecraft_directory = os.path.join(os.getenv('APPDATA'), '.picomc/instances/default/minecraft')
|
||||||
else:
|
else:
|
||||||
minecraft_directory = ""
|
minecraft_directory = ""
|
||||||
|
|
||||||
if minecraft_directory:
|
if minecraft_directory:
|
||||||
installed_files_directory = os.path.join(minecraft_directory, file_type)
|
installed_files_directory = os.path.join(minecraft_directory, file_type)
|
||||||
if os.path.exists(installed_files_directory) and os.path.isdir(installed_files_directory):
|
if os.path.exists(installed_files_directory) and os.path.isdir(installed_files_directory):
|
||||||
@ -330,7 +329,7 @@ class ModDetailsWindow(QDialog):
|
|||||||
self.setWindowTitle("Mod Details")
|
self.setWindowTitle("Mod Details")
|
||||||
self.setGeometry(100, 100, 400, 300)
|
self.setGeometry(100, 100, 400, 300)
|
||||||
|
|
||||||
self.mod_data = mod_data # Store mod data
|
self.mod_data = mod_data
|
||||||
|
|
||||||
layout = QVBoxLayout()
|
layout = QVBoxLayout()
|
||||||
|
|
||||||
@ -345,7 +344,7 @@ class ModDetailsWindow(QDialog):
|
|||||||
icon_pixmap = self.load_icon(icon_url)
|
icon_pixmap = self.load_icon(icon_url)
|
||||||
icon_label = QLabel()
|
icon_label = QLabel()
|
||||||
if icon_pixmap:
|
if icon_pixmap:
|
||||||
icon_label.setPixmap(icon_pixmap.scaledToWidth(200))
|
icon_label.setPixmap(icon_pixmap)
|
||||||
icon_label.setAlignment(Qt.AlignCenter)
|
icon_label.setAlignment(Qt.AlignCenter)
|
||||||
layout.addWidget(icon_label)
|
layout.addWidget(icon_label)
|
||||||
|
|
||||||
@ -373,7 +372,7 @@ class ModDetailsWindow(QDialog):
|
|||||||
if response.status_code == 200:
|
if response.status_code == 200:
|
||||||
pixmap = QPixmap()
|
pixmap = QPixmap()
|
||||||
pixmap.loadFromData(response.content)
|
pixmap.loadFromData(response.content)
|
||||||
return pixmap
|
return pixmap.scaled(QSize(128, 128), Qt.KeepAspectRatio, Qt.SmoothTransformation)
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -401,8 +400,8 @@ class ModDetailsWindow(QDialog):
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
app_icon = QIcon('marroc.ico') # Provide the path to your icon file
|
app_icon = QIcon('marroc.ico')
|
||||||
app.setWindowIcon(app_icon) # Set the application icon
|
app.setWindowIcon(app_icon)
|
||||||
window = ModrinthSearchApp()
|
window = ModrinthSearchApp()
|
||||||
window.show()
|
window.show()
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
@ -453,4 +453,5 @@ if __name__ == '__main__':
|
|||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
window = PicomcVersionSelector()
|
window = PicomcVersionSelector()
|
||||||
window.show()
|
window.show()
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|
Loading…
Reference in New Issue
Block a user