Версия с упрощённым GUI
This commit is contained in:
170
mainwindow.cpp
Normal file
170
mainwindow.cpp
Normal file
@@ -0,0 +1,170 @@
|
||||
#include "mainwindow.h"
|
||||
#include "ui_mainwindow.h" // Подключаем сгенерированный заголовочный файл
|
||||
#include "settingsdialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QDesktopServices>
|
||||
#include <QUrl>
|
||||
#include <QDir>
|
||||
#include <QInputDialog> // Для диалога выбора
|
||||
#include <QFileInfo> // Для проверки файла
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: QMainWindow(parent)
|
||||
, ui(new Ui::MainWindow) // Инициализируем указатель на UI
|
||||
{
|
||||
ui->setupUi(this); // Загружаем интерфейс из .ui файла
|
||||
|
||||
// Начальная настройка виджетов
|
||||
ui->progressBar->setRange(0, 0); // Неопределенный прогресс-бар
|
||||
ui->progressBar->setVisible(false);
|
||||
|
||||
// Инициализация логики
|
||||
settings = new QSettings("GaleonDev", "MinecraftLauncher", this);
|
||||
process = new QProcess(this);
|
||||
|
||||
// Подключаем сигналы от процесса (это делается вручную)
|
||||
connect(process, &QProcess::readyReadStandardOutput, this, &MainWindow::readProcessOutput);
|
||||
connect(process, &QProcess::readyReadStandardError, this, &MainWindow::readProcessOutput);
|
||||
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onProcessFinished(int, QProcess::ExitStatus)));
|
||||
connect(process, SIGNAL(errorOccurred(QProcess::ProcessError)), this, SLOT(onProcessError(QProcess::ProcessError)));
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
{
|
||||
delete ui; // Освобождаем память от объекта UI
|
||||
}
|
||||
|
||||
void MainWindow::on_launchButton_clicked()
|
||||
{
|
||||
QString minecraftPath = getMinecraftPath();
|
||||
if (minecraftPath.isEmpty()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. Находим папку с версиями
|
||||
QString versionsPath = minecraftPath + "/versions";
|
||||
QDir versionsDir(versionsPath);
|
||||
if (!versionsDir.exists()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Папка 'versions' не найдена!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Получаем список всех папок внутри 'versions' (это и есть наши версии)
|
||||
QStringList versionList = versionsDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
|
||||
if (versionList.isEmpty()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Не найдено ни одной установленной версии Minecraft.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. Предлагаем пользователю выбрать версию
|
||||
bool ok;
|
||||
QString selectedVersion = QInputDialog::getItem(this, "Выбор версии",
|
||||
"Выберите версию Minecraft для запуска:",
|
||||
versionList, 0, false, &ok);
|
||||
|
||||
// 4. Если пользователь сделал выбор (нажал "OK" и версия не пустая)
|
||||
if (ok && !selectedVersion.isEmpty()) {
|
||||
// Формируем путь к .jar файлу. Например: /.minecraft/versions/1.19.2/1.19.2.jar
|
||||
QString jarPath = versionsPath + "/" + selectedVersion + "/" + selectedVersion + ".jar";
|
||||
|
||||
// Проверяем, что .jar файл действительно существует
|
||||
QFileInfo jarFile(jarPath);
|
||||
if (!jarFile.exists() || !jarFile.isFile()) {
|
||||
QMessageBox::critical(this, "Ошибка запуска",
|
||||
"Не удалось найти запускаемый .jar файл для версии " + selectedVersion + ".\n"
|
||||
"Проверьте целостность файлов игры.\n"
|
||||
"Ожидаемый путь: " + jarPath);
|
||||
return;
|
||||
}
|
||||
|
||||
// 5. Запускаем игру
|
||||
QString javaPath = "java"; // Java должна быть в системной переменной PATH
|
||||
QStringList arguments;
|
||||
arguments << "-jar" << jarPath << "net.fabricmc.loader.impl.launch.knot.KnotClient";
|
||||
|
||||
ui->logOutput->appendPlainText("Запуск Minecraft версии: " + selectedVersion);
|
||||
process->start(javaPath, arguments);
|
||||
ui->progressBar->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_modsFolderButton_clicked()
|
||||
{
|
||||
QString minecraftPath = getMinecraftPath();
|
||||
if (minecraftPath.isEmpty()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft.");
|
||||
return;
|
||||
}
|
||||
QString modsPath = minecraftPath + "/mods";
|
||||
QDesktopServices::openUrl(QUrl::fromLocalFile(modsPath));
|
||||
}
|
||||
|
||||
void MainWindow::on_settingsButton_clicked()
|
||||
{
|
||||
SettingsDialog dialog(this);
|
||||
dialog.exec();
|
||||
}
|
||||
|
||||
void MainWindow::on_updateModsButton_clicked()
|
||||
{
|
||||
QString gitRepoUrl = settings->value("gitRepoUrl").toString();
|
||||
if (gitRepoUrl.isEmpty()) {
|
||||
QMessageBox::information(this, "Настройки", "Пожалуйста, укажите URL Git-репозитория в настройках.");
|
||||
return;
|
||||
}
|
||||
|
||||
QString minecraftPath = getMinecraftPath();
|
||||
if (minecraftPath.isEmpty()) {
|
||||
QMessageBox::warning(this, "Ошибка", "Не удалось найти директорию .minecraft.");
|
||||
return;
|
||||
}
|
||||
QString modsPath = minecraftPath + "/mods";
|
||||
QDir modsDir(modsPath);
|
||||
|
||||
if (!modsDir.exists(".git")) {
|
||||
ui->logOutput->appendPlainText("Клонирование модов из " + gitRepoUrl);
|
||||
process->start("git", QStringList() << "clone" << gitRepoUrl << modsPath);
|
||||
} else {
|
||||
ui->logOutput->appendPlainText("Обновление модов...");
|
||||
process->setWorkingDirectory(modsPath);
|
||||
process->start("git", QStringList() << "pull");
|
||||
}
|
||||
ui->progressBar->setVisible(true);
|
||||
}
|
||||
|
||||
void MainWindow::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
|
||||
{
|
||||
ui->progressBar->setVisible(false);
|
||||
if (exitStatus == QProcess::CrashExit) {
|
||||
ui->logOutput->appendPlainText("Процесс завершился с ошибкой.");
|
||||
} else {
|
||||
ui->logOutput->appendPlainText("Процесс успешно завершен с кодом " + QString::number(exitCode));
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::onProcessError(QProcess::ProcessError error)
|
||||
{
|
||||
ui->progressBar->setVisible(false);
|
||||
ui->logOutput->appendPlainText("Ошибка запуска процесса: " + process->errorString());
|
||||
}
|
||||
|
||||
void MainWindow::readProcessOutput()
|
||||
{
|
||||
ui->logOutput->appendPlainText(process->readAllStandardOutput());
|
||||
ui->logOutput->appendPlainText(process->readAllStandardError());
|
||||
}
|
||||
|
||||
QString MainWindow::getMinecraftPath()
|
||||
{
|
||||
QString path;
|
||||
#if defined(Q_OS_WIN)
|
||||
path = QDir::homePath() + "/AppData/Roaming/.minecraft";
|
||||
#elif defined(Q_OS_MAC)
|
||||
path = QDir::homePath() + "/Library/Application Support/minecraft";
|
||||
#else
|
||||
path = QDir::homePath() + "/.minecraft";
|
||||
#endif
|
||||
return path;
|
||||
}
|
||||
Reference in New Issue
Block a user