#include "skin.h" #include "aconfig.h" #include "filesystem.h" #include "mainwindow.h" #include #include #include #include #include #include #include Skin::Skin(QObject *parent) : QObject(parent) { } QString Skin::getSkinFile(){ QString current_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "current_theme") + "/skin.ini"; QString default_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "default_theme") + "/skin.ini"; QString skinfile = FileSystem::fileExists(current_theme) ? current_theme : default_theme; return skinfile; } QString Skin::getSkinName(){ QString current_theme = AConfig::getInstance()->getValue("Global", "current_theme"); QString default_theme = AConfig::getInstance()->getValue("Global", "default_theme"); QString path = QApplication::applicationDirPath() + "/styles/" + current_theme + "/skin.ini"; QString skinname = FileSystem::fileExists(path) ? current_theme : default_theme; return skinname; } void Skin::loadSkin(){ qInfo("Загружаем скин лаунчера"); qInfo("%s:%i: %s", __FILE__, __LINE__, "Определяем активную тему оформления"); QSettings settings( getSkinFile(), QSettings::IniFormat ); QStringList items = settings.childGroups(); QVariant k; QPushButton butt; QLabel lab; qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем настройку элементов"); foreach (QString item, items){ qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Устанавливаем настройки для ", item.toStdString().c_str()); MainWindow *a = MainWindow::getInstance(); QWidget* obj = a->findChild(item); if (obj != nullptr){ obj->installEventFilter(MainWindow::getInstance()); settings.beginGroup(item); if(settings.value("left").toString() != "-1"){ obj->setGeometry(QRect( settings.value("left").toInt(), settings.value("top").toInt(), settings.value("width").toInt(), settings.value("height").toInt() )); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройка геометрии завершена"); if(settings.value("shadow") != k){ QString color = settings.value("shcolor") != k ? settings.value("shcolor").toString() : "#222"; int blur = settings.value("shblur") != k ? settings.value("shblur").toInt() : 2; int offset_x = settings.value("shx") != k ? settings.value("shx").toInt() : 1; int offset_y = settings.value("shy") != k ? settings.value("shy").toInt() : 1; MainWindow::getInstance()->applyShadow(obj, color, blur, offset_x, offset_y); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройка теней завершена"); if(settings.value("text") != k){ QString text = settings.value("text").toString(); if(text == "del") text = ""; if(obj->metaObject()->className() == butt.metaObject()->className()){ QPushButton * b = dynamic_cast(obj); b->setText(text); } if(obj->metaObject()->className() == lab.metaObject()->className()){ QLabel * l = dynamic_cast(obj); l->setText(settings.value("text").toString()); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": текст установлен"); } if(settings.value("align") != k){ QLabel * lab = dynamic_cast(obj); if(settings.value("align") == "left") lab->setAlignment(Qt::AlignLeft); if(settings.value("align") == "center") lab->setAlignment(Qt::AlignCenter); if(settings.value("align") == "right") lab->setAlignment(Qt::AlignRight); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройки позиционирования применены"); settings.endGroup(); } else { if(item == "mainWindow") { settings.beginGroup(item); qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": обработка параметров главного окна"); int w = settings.value("width").toInt(); int h = settings.value("height").toInt(); QDesktopWidget desktop; QRect rect = desktop.availableGeometry(desktop.primaryScreen()); // прямоугольник с размерами экрана QPoint center = rect.center(); //координаты центра экрана int x = center.x() - (w / 2); // учитываем половину ширины окна int y = center.y() - (h / 2); // .. половину высоты center.setX(x); center.setY(y); MainWindow::getInstance()->move(center); settings.endGroup(); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": закончен просчет геометрии"); if(item == "htmlColors") { settings.beginGroup(item); foreach(QString key, settings.allKeys()){ MainWindow::getInstance()->htmlColors.insert(key, settings.value(key).toString()); } settings.endGroup(); } qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": загружены HTML-цвета"); } } qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); } void Skin::findSkins(){ qInfo("Темы оформления"); qInfo("%s:%i: %s", __FILE__, __LINE__, "Производим поиск доступных тем."); QDir dir(QApplication::applicationDirPath() + "/styles"); QStringList skins = dir.entryList(QDir::Dirs | QDir::AllDirs | QDir::NoDotAndDotDot); MainWindow::getInstance()->ui->skinSelect->addItems(skins); QString skinname = AConfig::getInstance()->getValue("Global", "current_theme"); MainWindow::getInstance()->ui->skinSelect->setCurrentText(skinname); qInfo("%s:%i: %s", __FILE__, __LINE__, "Устанавливаем отметку о файле локализации."); QString file = AConfig::getInstance()->getValue("Local", "file"); if(file == "client_local_English.dat") MainWindow::getInstance()->ui->enButton->setEnabled(false); if(file == "client_local_DE.dat") MainWindow::getInstance()->ui->deButton->setEnabled(false); if(file == "client_local_FR.dat") MainWindow::getInstance()->ui->frButton->setEnabled(false); qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено."); } void Skin::replaceSkin(QString name){ QString text = "Смена темы оформления"; QString info = "Выбрана тема " + name + ". Изменения вступят в силу при следующем запуске лаунчера."; //app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 120, true, false); qInfo("%s:%i: %s", __FILE__, __LINE__, "Оформляем главное окно."); QFile styleF; QString skin = getSkinName(); styleF.setFileName(QApplication::applicationDirPath() + "/styles/" + name + "/style.css"); styleF.open(QFile::ReadOnly); QString qssStr = styleF.readAll(); qApp->setStyleSheet(qssStr); QPixmap maskPix(":/res/styles/" + name + "/bg.png"); QPixmap maskPixLocal(QApplication::applicationDirPath() + "/styles/" + name + "/bg.png"); maskPix = maskPix.isNull() ? maskPixLocal : maskPix; MainWindow::getInstance()->setMask(maskPix.mask()); QString color = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue"; loadSkin(); QString hrefcolor = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue"; QString newtext = MainWindow::getInstance()->ui->news1Title->text().replace(color, hrefcolor); MainWindow::getInstance()->ui->news1Title->setText(newtext); newtext = MainWindow::getInstance()->ui->news2Title->text().replace(color, hrefcolor); MainWindow::getInstance()->ui->news2Title->setText(newtext); newtext = MainWindow::getInstance()->ui->news3Title->text().replace(color, hrefcolor); MainWindow::getInstance()->ui->news3Title->setText(newtext); newtext = MainWindow::getInstance()->ui->news4Title->text().replace(color, hrefcolor); MainWindow::getInstance()->ui->news4Title->setText(newtext); MainWindow::getInstance()->loadHelp(); QMovie * movie = new QMovie(":/res/styles/" + skin + "/loader.gif"); if(!movie->isValid()) movie = new QMovie(QApplication::applicationDirPath() + "/styles/" + skin + "/loader.gif"); MainWindow::getInstance()->ui->loader->setMovie(movie); movie->setScaledSize(QSize(MainWindow::getInstance()->ui->loader->width(), MainWindow::getInstance()->ui->loader->height())); movie->start(); }