#include "app.h" #include #include #include #include #include "filesystem.h" #include "lotromanager.h" MainWindow::MainWindow( double scale_factor, QMainWindow* parent) : QMainWindow( parent, Qt::Window | Qt::FramelessWindowHint), ui( new Ui::MainWindow ), dx( 0 ), dy( 0 ) { ui->setupUi(this); scale_factor_ = scale_factor; //setAttribute( Qt::WA_NoSystemBackground, true); App *app = &App::getInstance(); if(!FileSystem::fileExists(QApplication::applicationDirPath() + "/settings.ini")) app->config->saveConfig(); QString skin = app->helper->getSkinName(); setWindowIcon(QIcon(":/res/styles/" + skin + "/icon6.png")); QCoreApplication::setOrganizationName(ORGANIZATION_NAME); QCoreApplication::setOrganizationDomain(ORGANIZATION_DOMAIN); QCoreApplication::setApplicationName(APPLICATION_NAME); setWindowTitle("ВКО: Наследие"); app->logSectionEnd(); // Проводим подготовку к запуску app->window = this; app->config->loadConfig(); app->config->loadSkin(); app->helper->hideAll(); app->helper->loadHelp(); app->helper->setAbout(); app->helper->findSkins(); //app->helper->setPatchsDates(); app->logSectionStart("Начинаем работать"); QFile styleF; styleF.setFileName(app->app_folder + "styles/" + skin + "/style.css"); styleF.open(QFile::ReadOnly); QString qssStr = styleF.readAll(); qApp->setStyleSheet(qssStr); app->logSectionStart("Запуск Наследия"); qInfo("%s:%i: %s", __FILE__, __LINE__, "Оформляем главное окно."); QPixmap maskPix(":/res/styles/" + skin + "/bg.png"); QPixmap maskPixLocal(app->app_folder + "styles/" + skin + "/bg.png"); maskPix = maskPix.isNull() ? maskPixLocal : maskPix; setMask(maskPix.mask()); qInfo("%s:%i: %s", __FILE__, __LINE__, "Устанавливаем анимации."); QMovie * movie = new QMovie(":/res/styles/" + skin + "/loader.gif"); if(!movie->isValid()) movie = new QMovie(app->app_folder + "styles/" + skin + "/loader.gif"); ui->loader->setMovie(movie); movie->setScaledSize(QSize(ui->loader->width(), ui->loader->height())); movie->start(); app->helper->setState("busy"); ui->hintLabel->setText("Получение данных с сервера"); ui->exthintLabel->setText("Скачиваем необходимую информацию с сервера..."); show(); connect(app->window->ui->skinSelect, SIGNAL(currentIndexChanged(int)), this, SLOT(saveSkin())); connect(std::addressof(LotroManager::getInstance()), &LotroManager::dat_operation_finished, this, &MainWindow::lotro_manager_finished); connect(std::addressof(LotroManager::getInstance()), &LotroManager::dat_operation_started, this, &MainWindow::lotro_manager_started); connect(std::addressof(LotroManager::getInstance()), &LotroManager::changePatchStatus, this, &MainWindow::change_patch_status); connect(std::addressof(LotroManager::getInstance()), &LotroManager::changeHint, this, &MainWindow::change_hint); connect(app->network, &ANetwork::changePatchStatus, this, &MainWindow::change_patch_status); connect(app->network, &ANetwork::changeHint, this, &MainWindow::change_hint); connect(app->downloader, &DownloadManager::changePatchStatus, this, &MainWindow::change_patch_status); connect(app->downloader, &DownloadManager::changeHint, this, &MainWindow::change_hint); connect(app->downloader, &DownloadManager::allDownloadsFinished, this, &MainWindow::patches_updated); app->helper->loadNews(); app->network->getFootMessage(); app->network->getServers(); app->network->getCoupon(); ui->hintLabel->setText("Проверка .dat файла"); ui->exthintLabel->setText("Выполняется предварительная проверка файлов данных..."); LotroManager::getInstance().execute("CheckDatFile", "", "init_check_dat"); } void MainWindow::lotro_manager_started(QString command, QString args, QString name) { App* app = &App::getInstance(); app->helper->setState("busy"); } void MainWindow::lotro_manager_finished(QString command, QString args, QString name, QString result) { App* app = &App::getInstance(); if (app->state == "busy") app->helper->setState("free"); if (name == "init_check_dat") { PostDatFileCheckTransactions(result.toInt()); return; } if (name == "delete_before_start_game") { QString filename = app->config->getDatPath(0); QFile::remove(filename); if (!FileSystem::fileExists(filename)) LotroManager::getInstance().execute("StartGame", "", "start_game"); return; } if (name == "save_before_start_game") { app->window->ui->goHint->hide(); app->window->ui->goProgress->hide(); app->window->ui->startbox->hide(); app->window->ui->goLocal->setEnabled(true); app->window->ui->goOriginal->setEnabled(true); app->window->ui->goCancel->setEnabled(true); LotroManager::getInstance().execute("StartGame", "", "start_game"); return; } if (name == "start_game" && result != "error") { QApplication::exit(); return; } } void MainWindow::patches_updated(QStringList patches) { App* app = &App::getInstance(); if (app->downloader->getDownloadedCount() == 0) return; LotroManager::getInstance().execute("ApplyPatchList", QString(patches.join('|')), ""); } void MainWindow::change_patch_status(QString patch_name, QString new_status) { QLabel* obj = ui->mainbox->findChild(patch_name + "Status"); if (obj != nullptr){ obj->setText(new_status); } } void MainWindow::change_hint(QString title, QString hint) { ui->hintLabel->setText(title); ui->exthintLabel->setText(hint); } void MainWindow::PostDatFileCheckTransactions(int check_result) { ui->hintLabel->setText("Проверка .dat файла..."); ui->exthintLabel->setText("Успешно!"); App *app = &App::getInstance(); //app->helper->setState("free"); if (check_result == 1) { app->ready = false; QString text = "Файлы локализации изменены"; QString info = "В процессе последнего запуска игры были установлены обновления игрового клиента. Это могло затронуть файлы локализации. Желаете провести проверку и исправить поврежденные участки перевода? Вы можете в любой момент сделать это самостоятельно, нажав кнопку «Применить патчи заново»."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "applypaths", "", 400, 220, true, true); } if (check_result == 2) { app->ready = false; QString text = "Файлы локализации отсутствуют"; QString info = "Текущий файл локализации не содержит патчей. Возможно это первый запуск «Наследия» с данным игровым клиентом, или клиент был обновлён игровым лаунчером. Применить выбранные патчи в данному файлу?"; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "applypaths", "", 420, 200, true, true); } if (check_result == 3) { QString text = "Файлы локализации не являются оригинальными"; QString info = "Внимание! Присутствующие в вашем игровом клиенте файлы локализации не являются оригинальными, поскольку были модифицированы другой программой.
Мы настоятельно рекомендуем перекачать оригинальные версии файлов, поскольку правильная работа Наследия с данными файлами не гарантируется!"; app->helper->myDialogBox(text, info, "Перекачать", "Не надо", "gandalf.png", "loaddatfile", "", 550, 200, true, true); } // Если это первый запуск то показываем мастер if(app->config->getValue("Local", "runfirst") == "-1") { qInfo("%s:%i: %s", __FILE__, __LINE__, "Показываем мастер начальных настроек."); app->helper->setState("runfirst"); } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); // Если приготовления выполнены загружаем патчи if(app->state == "free" && app->ready == true) { app->logSectionStart("Загрузка патчей"); app->network->UpdatePatches(); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::closeEvent(QCloseEvent *e){ App *app = &App::getInstance(); if(app->state != "free") e->ignore(); } void MainWindow::mouseMoveEvent( QMouseEvent* e ) { if( e->buttons() | Qt::LeftButton ) { QPoint pt=mapFromGlobal(QCursor::pos()); QWidget* child=childAt(pt); if (child == 0) { setGeometry(pos().x() + ( e->x() - dx ), pos().y() + ( e->y() - dy ), width(), height()); return; } QString cname = child->metaObject()->className(); if (cname != "QPushButton" && cname != "QComboBox"){ // отключаем перетягивание при наведение на активные элементы setGeometry(pos().x() + ( e->x() - dx ), pos().y() + ( e->y() - dy ), width(), height()); } else { dx = e->x(); dy = e->y(); } } } void MainWindow::mousePressEvent( QMouseEvent* e ) { QPoint pt=mapFromGlobal(QCursor::pos()); QWidget* child=childAt(pt); QString cname = child->metaObject()->className(); if(e->button() == Qt::LeftButton || (cname != "QPushButton" && cname != "QComboBox" && cname != "QLabel")) { dx = e->x(); dy = e->y(); setCursor(Qt::OpenHandCursor); } } void MainWindow::mouseReleaseEvent( QMouseEvent* e ) { QPoint pt=mapFromGlobal(QCursor::pos()); QWidget* child=childAt(pt); QString cname = child->metaObject()->className(); if(e->button() == Qt::LeftButton || (cname != "QPushButton" && cname != "QComboBox" && cname != "QLabel")) { dx = e->x(); dy = e->y(); } setCursor( Qt::ArrowCursor); } void MainWindow::minimize() { setWindowState(Qt::WindowMinimized); } bool MainWindow::eventFilter(QObject *obj, QEvent *){ App *app = &App::getInstance(); if(app->state == "busy") return false; if(obj->objectName() == "mainButton"){ this->ui->hintLabel->setText("Применение патчей"); this->ui->exthintLabel->setText("На данной странице показан список патчей и прогресс их применения"); } if(obj->objectName() == "optButton"){ this->ui->hintLabel->setText("Настройки лаунчера"); this->ui->exthintLabel->setText("Управление параметрами применения патчей и запуском игры"); } if(obj->objectName() == "newsButton"){ this->ui->hintLabel->setText("Новости проекта"); this->ui->exthintLabel->setText("Актуальная информация из нашего цеха русификации LotRO"); } if(obj->objectName() == "helpButton"){ this->ui->hintLabel->setText("Справочная информация"); this->ui->exthintLabel->setText("Полезная информация о программе русификации, настройках и использовании"); } if(obj->objectName() == "aboutButton"){ this->ui->hintLabel->setText("О нас"); this->ui->exthintLabel->setText("Информация о разработчиках, переводчиках и других хороших людях"); } if(obj->objectName() == "enterButton"){ this->ui->hintLabel->setText("Запуск игры"); this->ui->exthintLabel->setText("Создание портала в мир Средиземья"); } if(obj->objectName() == "couponButton"){ this->ui->hintLabel->setText("Купон скидки"); this->ui->exthintLabel->setText("Нажмите, чтобы скопировать код купона в буфер обмена"); } return false; } void MainWindow::on_mainButton_clicked(){ App *app = &App::getInstance(); app->helper->checkTab("mainbox"); app->window->ui->titleLabel->setText("Патчи"); if (app->state == "free") { QtConcurrent::run(app->network, &app->network->UpdatePatches); } } void MainWindow::on_optButton_clicked(){ App *app = &App::getInstance(); app->helper->checkTab("optbox"); app->window->ui->titleLabel->setText("Настройки"); } void MainWindow::on_newsButton_clicked(){ App *app = &App::getInstance(); app->helper->checkTab("newsbox"); app->window->ui->titleLabel->setText("Новости"); } void MainWindow::on_helpButton_clicked(){ App *app = &App::getInstance(); app->helper->checkTab("helpbox"); app->window->ui->titleLabel->setText("Справка"); } void MainWindow::on_aboutButton_clicked(){ App *app = &App::getInstance(); app->helper->checkTab("aboutbox"); app->window->ui->titleLabel->setText("О нас"); } void MainWindow::on_enterButton_clicked(){ App *app = &App::getInstance(); app->window->ui->startbox->setGeometry(0, 0, app->window->width(), app->window->height()); QSettings settings( app->config->getSkinFile(), QSettings::IniFormat ); settings.beginGroup("mainWindow"); int left = (settings.value("width").toInt() - app->window->ui->startframe->width())/2; int top = (settings.value("height").toInt() - app->window->ui->startframe->height())/2; app->window->ui->startframe->setGeometry(QRect(left, top, app->window->ui->startframe->width(), app->window->ui->startframe->height())); settings.endGroup(); QString file = app->config->getValue("Local", "file"); if(file == "client_local_English.dat") file = "goenr.png"; if(file == "client_local_DE.dat") file = "goderr.png"; if(file == "client_local_FR.dat") file = "gofrr.png"; QString skin = app->config->getSkinName(); QString bname = ":/res/styles/" + skin + "/" + file; QPixmap isset(bname); bname = isset.isNull() ? app->app_folder + "styles/" + skin + "/" + file : bname; app->window->ui->goOriginal->setStyleSheet("QPushButton#goOriginal { border-image: url(" + bname + ") 0 0 0 0 stretch stretch;}"); app->window->ui->startbox->show(); } void MainWindow::on_goCancel_clicked(){ this->ui->startbox->hide(); } void MainWindow::on_goOriginal_clicked(){ App *app = &App::getInstance(); app->window->ui->goHint->show(); app->window->ui->goLocal->setEnabled(false); app->window->ui->goOriginal->setEnabled(false); app->window->ui->goCancel->setEnabled(false); app->window->ui->goProgress->show(); LotroManager::getInstance().execute("SetLocale", "Original", "save_before_start_game"); } void MainWindow::on_goLocal_clicked(){ App *app = &App::getInstance(); app->window->ui->goHint->show(); app->window->ui->goLocal->setEnabled(false); app->window->ui->goOriginal->setEnabled(false); app->window->ui->goCancel->setEnabled(false); app->window->ui->goProgress->show(); LotroManager::getInstance().execute("SetLocale", "RU", "save_before_start_game"); } void MainWindow::on_minimizeButton_clicked(){ setWindowState(Qt::WindowMinimized); } void MainWindow::on_closeButton_clicked(){ this->close(); } void MainWindow::on_couponButton_clicked(){ App *app = &App::getInstance(); QApplication::clipboard()->setText(app->window->ui->couponButton->text()); this->ui->exthintLabel->setText("Код скопирован."); } void MainWindow::on_enButton_clicked(){ App *app = &App::getInstance(); QString file = "client_local_English.dat"; if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) { app->config->setValue("Local", "file", file); app->config->setValue("Local", "lang", "en"); } else { QString text = "Данная локализация отсутствует"; QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false); } } void MainWindow::on_deButton_clicked(){ App *app = &App::getInstance(); QString file = "client_local_DE.dat"; if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) { app->config->setValue("Local", "file", file); app->config->setValue("Local", "lang", "de"); } else { QString text = "Данная локализация отсутствует"; QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false); } } void MainWindow::on_frButton_clicked(){ App *app = &App::getInstance(); QString file = "client_local_FR.dat"; if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) { app->config->setValue("Local", "file", file); app->config->setValue("Local", "lang", "fr"); } else { QString text = "Данная локализация отсутствует"; QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false); } } void MainWindow::saveSkin(){ App *app = &App::getInstance(); QString new_theme = app->window->ui->skinSelect->currentText(); if(app->config->getSkinName() != new_theme){ app->config->setValue("Global", "current_theme", new_theme); app->helper->replaceSkin(new_theme); } } void MainWindow::on_checkFonts_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "fonts", arg1 ? "true" : "false"); if (!arg1) { app->downloader->abortDownload("fonts"); } } void MainWindow::on_checkTexts_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "texts", arg1 ? "true" : "false"); if (!arg1) { app->downloader->abortDownload("texts"); } } void MainWindow::on_checkSounds_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "sounds", arg1 ? "true" : "false"); if (!arg1) { app->downloader->abortDownload("sounds"); } } void MainWindow::on_checkMaps_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "images", arg1 ? "true" : "false"); app->config->setValue("Editor", "textures", arg1 ? "true" : "false"); if (!arg1) { app->downloader->abortDownload("images"); app->downloader->abortDownload("textures"); } } void MainWindow::on_checkScreens_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "loadscreens", arg1 ? "true" : "false"); if (!arg1) { app->downloader->abortDownload("loadscreens"); } } void MainWindow::on_checkVideos_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "videos", arg1 ? "true" : "false"); } void MainWindow::on_checkMicro_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Updates", "micro", arg1 ? "true" : "false"); } void MainWindow::on_lotropathButton_clicked(){ App *app = &App::getInstance(); QString path = QFileDialog::getExistingDirectory(0, "Выберите папку с игрой"); if(path != "" && FileSystem::fileExists(path + "/TurbineLauncher.exe")){ app->window->ui->lotropathLabel->setText(path); app->config->setValue("Local", "folder", path); } else { QString text = "Выбрана неверная папка"; QString info = "

Убедитесь, что выбранный вами каталог является папкой игры и содержит такие файлы как, например," " TurbineLauncher.exe, lotroclient.exe и т.п.

"; app->helper->myDialogBox(text, info, "OK", "Выход", "gandalf.png", "choosedatpath", "exit", 400, 160, true, true); } } void MainWindow::on_designButton_clicked(){ App *app = &App::getInstance(); app->helper->replaceSkin(app->config->getSkinName()); } void MainWindow::on_repairButton_clicked(){ App *app = &App::getInstance(); app->config->deleteSection("Applied"); app->helper->checkTab("mainbox"); LotroManager::getInstance().execute("ApplyGlobal", "", ""); } void MainWindow::on_okButton_clicked(){ App *app = &App::getInstance(); QStringList commands = app->helper->dialog_ok_answer.split(" "); foreach(QString command, commands) { if (app->state == "dialog") app->helper->setState("free"); if (command == "close"){ this->ui->dialogbox->hide(); } if(command == "gamefind") { QStringList folders = app->config->getLotroPath(); if(folders.count() > 1) { QString text = "Результаты поиска"; QString info = "Найдены следующие папки в которых установлена игра:




Выберите нужную папку и нажмите «Далее»
"; app->helper->myDialogBox(text, info, "Далее", "Отмена", "gandalf.png", "writefolder", "", 530, 200, true, false); app->window->ui->dialogList->setGeometry(QRect( app->window->ui->dialogImage->rect().right() + 10, app->window->ui->dialogHeader->rect().bottom()+40, 417, 50)); foreach(QString f, folders) new QListWidgetItem(f, app->window->ui->dialogList); app->window->ui->dialogList->show(); } else { if(folders.count() == 1){ app->window->ui->lotropathLabel->setText(folders.first()); app->config->setValue("Local", "folder", folders.first()); this->ui->dialogbox->hide(); QString text = "Завершающий этап"; QString info = "Необходимые приготовления завершены. Сейчас вы будете перенаправлены в раздел «Настройки», где сможете выбрать патчи, которые хотите установить. После этого перейдите в раздел «Патчи» для начала их загрузки и применения."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "close gotooptions", "",400, 200, true, false); } else { QString text = "Завершающий этап"; QString info = "Обнаружить каталог игры автоматически не удалось. Сейчас вы будете перенаправлены в раздел «Настройки», где сможете вручную выбрать каталог игры и патчи, которые хотите установить. После этого перейдите в раздел «Патчи» для начала их загрузки и применения."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "close gotooptions", "",450, 200, true, false); } } qDebug() << folders; } if(command == "choosedatpath") { app->helper->checkTab("optbox"); app->state = "free"; emit app->window->ui->lotropathButton->clicked(true); } if(command == "writefolder"){ if (app->window->ui->dialogList->currentItem()) { QString path = app->window->ui->dialogList->currentItem()->text(); qDebug() << path; app->window->ui->lotropathLabel->setText(path); app->config->setValue("Local", "folder", path); app->window->ui->dialogList->clear(); app->window->ui->dialogList->hide(); this->ui->dialogbox->hide(); QString text = "Завершающий этап"; QString info = "Необходимые приготовления завершены. Сейчас вы будете перенаправлены в раздел «Настройки», где сможете выбрать патчи, которые хотите установить. После этого перейдите в раздел «Патчи» для начала их загрузки и применения."; app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "close gotooptions", "",400, 200, true, false); } else { break; } } if(command == "gotooptions"){ app->helper->checkTab("optbox"); app->state = "free"; app->config->setValue("Local", "runfirst", "1"); } if(command == "applypaths"){ app->ready = true; app->config->deleteSection("Applied"); LotroManager::getInstance().execute("ApplyGlobal", "", ""); app->helper->checkTab("mainbox"); } if(command == "loaddatfile"){ app->config->deleteSection("Applied"); QString filename = app->config->getDatPath(0); qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Удаляем файл: ", filename.toUtf8().data()); LotroManager::getInstance().execute("SaveDatFiles", "", "delete_before_start_game"); } } } void MainWindow::on_cancelButton_clicked(){ App *app = &App::getInstance(); QStringList commands = app->helper->dialog_cancel_answer.split(" "); foreach(QString command, commands){ if(command == "close") { this->ui->dialogbox->hide(); app->helper->setState("free"); } if (command == "exit") QApplication::exit(0); } }