194 lines
7.2 KiB
Python
194 lines
7.2 KiB
Python
|
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_())
|
||
|
|