import sys import subprocess from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QLabel, QPushButton, QWidget, QComboBox, QLineEdit, QProgressBar, QMessageBox, QStackedWidget, QHBoxLayout, QFormLayout) from PyQt5.QtGui import QPixmap, QFont from PyQt5.QtCore import Qt class InstallerWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Void Linux Installer") self.setGeometry(300, 200, 800, 600) # Widget com layout empilhado para etapas de instalação self.stack = QStackedWidget() self.setCentralWidget(self.stack) # Fontes e estilos básicos self.title_font = QFont("Arial", 18, QFont.Bold) self.normal_font = QFont("Arial", 12) # Etapas do instalador self.create_welcome_page() self.create_partition_page() self.create_user_page() self.create_install_page() # Layout para os botões de navegação self.nav_layout = QHBoxLayout() self.prev_button = QPushButton("Anterior") self.prev_button.clicked.connect(self.prev_page) self.prev_button.setEnabled(False) # Desativado na primeira página self.next_button = QPushButton("Próximo") self.next_button.clicked.connect(self.next_page) self.nav_layout.addWidget(self.prev_button) self.nav_layout.addWidget(self.next_button) # Adicionar os botões de navegação no final nav_widget = QWidget() nav_widget.setLayout(self.nav_layout) layout = QVBoxLayout() layout.addWidget(self.stack) layout.addWidget(nav_widget) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) def create_welcome_page(self): """Página de boas-vindas.""" page = QWidget() layout = QVBoxLayout() welcome_label = QLabel("Bem-vindo ao Instalador do Void Linux") welcome_label.setFont(self.title_font) layout.addWidget(welcome_label, alignment=Qt.AlignCenter) img_label = QLabel() img = QPixmap("image.png") # Certifique-se de que o caminho da imagem esteja correto img_label.setPixmap(img.scaled(300, 300, Qt.KeepAspectRatio)) layout.addWidget(img_label, alignment=Qt.AlignCenter) page.setLayout(layout) self.stack.addWidget(page) def create_partition_page(self): """Página de seleção de partição.""" page = QWidget() layout = QVBoxLayout() title = QLabel("Seleção de Partição") title.setFont(self.title_font) layout.addWidget(title) form_layout = QFormLayout() self.partition_combo = QComboBox() self.partition_combo.addItems(self.get_partitions()) form_layout.addRow("Escolha uma partição:", self.partition_combo) # Botão para abrir GParted gparted_button = QPushButton("Abrir GParted para Particionamento") gparted_button.clicked.connect(self.open_gparted) layout.addLayout(form_layout) layout.addWidget(gparted_button) page.setLayout(layout) self.stack.addWidget(page) def create_user_page(self): """Página de configuração de usuário e senha.""" page = QWidget() layout = QVBoxLayout() title = QLabel("Configuração do Usuário") title.setFont(self.title_font) layout.addWidget(title) form_layout = QFormLayout() self.user_input = QLineEdit() self.password_input = QLineEdit() self.password_input.setEchoMode(QLineEdit.Password) form_layout.addRow("Nome do usuário:", self.user_input) form_layout.addRow("Senha:", self.password_input) layout.addLayout(form_layout) page.setLayout(layout) self.stack.addWidget(page) def create_install_page(self): """Página de instalação com barra de progresso.""" page = QWidget() layout = QVBoxLayout() title = QLabel("Instalação do Sistema") title.setFont(self.title_font) layout.addWidget(title) self.progress_bar = QProgressBar() self.progress_bar.setAlignment(Qt.AlignCenter) layout.addWidget(self.progress_bar) install_button = QPushButton("Iniciar Instalação") install_button.clicked.connect(self.start_installation) layout.addWidget(install_button, alignment=Qt.AlignCenter) page.setLayout(layout) self.stack.addWidget(page) def get_partitions(self): """Função para listar partições do sistema.""" partitions = subprocess.getoutput("lsblk -nd -o NAME").splitlines() return [f"/dev/{p}" for p in partitions] def open_gparted(self): """Abre o GParted para particionamento de disco.""" try: subprocess.Popen(["gparted"]) except FileNotFoundError: QMessageBox.critical(self, "Erro", "GParted não está instalado.") def start_installation(self): """Inicia a instalação e atualiza a barra de progresso.""" partition = self.partition_combo.currentText() username = self.user_input.text() password = self.password_input.text() if not partition or not username or not password: QMessageBox.warning(self, "Erro", "Por favor, preencha todos os campos.") return try: self.progress_bar.setValue(0) subprocess.run(["./mklive.sh"], check=True) self.progress_bar.setValue(25) subprocess.run(["./mkrootfs.sh"], check=True) self.progress_bar.setValue(50) subprocess.run(["./mkimage.sh"], check=True) self.progress_bar.setValue(75) subprocess.run(["./installer.sh", partition, username, password], check=True) self.progress_bar.setValue(100) QMessageBox.information(self, "Sucesso", "Instalação concluída com sucesso!") except subprocess.CalledProcessError as e: QMessageBox.critical(self, "Erro", f"Ocorreu um erro: {e}") def next_page(self): """Avançar para a próxima página.""" current_index = self.stack.currentIndex() if current_index < self.stack.count() - 1: self.stack.setCurrentIndex(current_index + 1) self.prev_button.setEnabled(True) # Alterar o texto do botão para "Instalar" na última página if current_index == self.stack.count() - 2: self.next_button.setText("Instalar") else: self.next_button.setText("Próximo") def prev_page(self): """Voltar para a página anterior.""" current_index = self.stack.currentIndex() if current_index > 0: self.stack.setCurrentIndex(current_index - 1) self.next_button.setText("Próximo") if current_index == 1: self.prev_button.setEnabled(False) if __name__ == "__main__": app = QApplication(sys.argv) window = InstallerWindow() window.show() sys.exit(app.exec_())