#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(this, SIGNAL(datFileChecked(int)), this, SLOT(PostDatFileCheckTransactions(int))); app->helper->loadNews(); app->network->getFootMessage(); app->network->getServers(); app->network->getCoupon(); ui->hintLabel->setText("Проверка .dat файла"); ui->exthintLabel->setText("Выполняется предварительная проверка файлов данных..."); QFuture future = QtConcurrent::run([=]() { qInfo("%s:%i: %s", __FILE__, __LINE__, "Инициализация закончена."); // Проверяем файл локализации int result = LotroManager::getInstance().checkDatFile(); emit(datFileChecked(result)); }); } 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"); } else { app->helper->setState("free"); } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); // Если приготовления выполнены загружаем патчи if(app->state == "free" && app->ready == true){ app->logSectionStart("Загрузка патчей"); //for (int i = 0; i < 5; i++) app->datfiles[i].CommitChanges(); app->network->getPaths(); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); app->logSectionEnd(); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::closeEvent(QCloseEvent *e){ App *app = &App::getInstance(); if(app->state == "busy") 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 ) { if( e->button() == Qt::LeftButton ) { dx = e->x(); dy = e->y(); setCursor( Qt::OpenHandCursor ); } } void MainWindow::mouseReleaseEvent( QMouseEvent* e ) { if( e->button() == Qt::LeftButton ) { setCursor( Qt::ArrowCursor ); dx = e->x(); dy = e->y(); } } 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 != "busy") app->network->getPaths(); } 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->goProgress->show(); QtConcurrent::run([=]() { LotroManager::getInstance().setGameLocale("Original"); LotroManager::getInstance().startGame(); }); } void MainWindow::on_goLocal_clicked(){ App *app = &App::getInstance(); app->window->ui->goProgress->show(); QtConcurrent::run([=]() { if(LotroManager::getInstance().setGameLocale("RU")) LotroManager::getInstance().startGame(); }); } 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(); LotroManager::getInstance().saveLocale(0, this->ui->enButton); app->config->setValue("Local", "lang", "en"); } void MainWindow::on_deButton_clicked(){ App *app = &App::getInstance(); LotroManager::getInstance().saveLocale(1, this->ui->deButton); app->config->setValue("Local", "lang", "de"); } void MainWindow::on_frButton_clicked(){ App *app = &App::getInstance(); LotroManager::getInstance().saveLocale(2, this->ui->frButton); app->config->setValue("Local", "lang", "fr"); } 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"); } void MainWindow::on_checkTexts_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "texts", arg1 ? "true" : "false");; app->downloader->abortDownload("texts"); } void MainWindow::on_checkSounds_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "sounds", arg1 ? "true" : "false"); app->downloader->abortDownload("sounds"); } void MainWindow::on_checkMaps_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "images", arg1 ? "true" : "false"); app->downloader->abortDownload("images"); } void MainWindow::on_checkScreens_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "screens", arg1 ? "true" : "false"); app->downloader->abortDownload("screens"); } void MainWindow::on_checkVideos_stateChanged(int arg1){ App *app = &App::getInstance(); app->config->setValue("Editor", "videos", arg1 ? "true" : "false"); app->downloader->abortDownload("videos"); } 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"); LotroManager::getInstance().applyGlobal(); app->helper->checkTab("mainbox"); } void MainWindow::on_okButton_clicked(){ App *app = &App::getInstance(); QStringList commands = app->helper->dialog_ok_answer.split(" "); foreach(QString command, commands){ 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"); 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->config->setValue("Local", "runfirst", "1"); app->helper->setState("free"); } if(command == "applypaths"){ app->ready = true; app->config->deleteSection("Applied"); app->network->getPaths(); app->helper->checkTab("mainbox"); } if(command == "loaddatfile"){ app->config->deleteSection("Applied"); QString filename = app->config->getDatPath(0); qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Удаляем файл: ", app->helper->stringToChar(filename)); LotroManager::getInstance().saveDatFiles(); QFile::remove(filename); if (!FileSystem::fileExists(filename)) { LotroManager::getInstance().startGame(); qApp->exit(); } } } } 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(); if (command == "exit") QApplication::exit(0); } }