skin.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "skin.h"
  2. #include "aconfig.h"
  3. #include "filesystem.h"
  4. #include "mainwindow.h"
  5. #include <QPushButton>
  6. #include <QString>
  7. #include <QDesktopWidget>
  8. #include <QApplication>
  9. #include <QLabel>
  10. #include <QBitmap>
  11. #include <QMovie>
  12. Skin::Skin(QObject *parent) : QObject(parent) {
  13. }
  14. QString Skin::getSkinFile(){
  15. QString current_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "current_theme") + "/skin.ini";
  16. QString default_theme = QApplication::applicationDirPath() + "/styles/" + AConfig::getInstance()->getValue("Global", "default_theme") + "/skin.ini";
  17. QString skinfile = FileSystem::fileExists(current_theme) ? current_theme : default_theme;
  18. return skinfile;
  19. }
  20. QString Skin::getSkinName(){
  21. QString current_theme = AConfig::getInstance()->getValue("Global", "current_theme");
  22. QString default_theme = AConfig::getInstance()->getValue("Global", "default_theme");
  23. QString path = QApplication::applicationDirPath() + "/styles/" + current_theme + "/skin.ini";
  24. QString skinname = FileSystem::fileExists(path) ? current_theme : default_theme;
  25. return skinname;
  26. }
  27. void Skin::loadSkin(){
  28. qInfo("Загружаем скин лаунчера");
  29. qInfo("%s:%i: %s", __FILE__, __LINE__, "Определяем активную тему оформления");
  30. QSettings settings( getSkinFile(), QSettings::IniFormat );
  31. QStringList items = settings.childGroups();
  32. QVariant k;
  33. QPushButton butt;
  34. QLabel lab;
  35. qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем настройку элементов");
  36. foreach (QString item, items){
  37. qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Устанавливаем настройки для ", item.toStdString().c_str());
  38. MainWindow *a = MainWindow::getInstance();
  39. QWidget* obj = a->findChild<QWidget*>(item);
  40. if (obj != nullptr){
  41. obj->installEventFilter(MainWindow::getInstance());
  42. settings.beginGroup(item);
  43. if(settings.value("left").toString() != "-1"){
  44. obj->setGeometry(QRect(
  45. settings.value("left").toInt(),
  46. settings.value("top").toInt(),
  47. settings.value("width").toInt(),
  48. settings.value("height").toInt()
  49. ));
  50. }
  51. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройка геометрии завершена");
  52. if(settings.value("shadow") != k){
  53. QString color = settings.value("shcolor") != k ? settings.value("shcolor").toString() : "#222";
  54. int blur = settings.value("shblur") != k ? settings.value("shblur").toInt() : 2;
  55. int offset_x = settings.value("shx") != k ? settings.value("shx").toInt() : 1;
  56. int offset_y = settings.value("shy") != k ? settings.value("shy").toInt() : 1;
  57. MainWindow::getInstance()->applyShadow(obj, color, blur, offset_x, offset_y);
  58. }
  59. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройка теней завершена");
  60. if(settings.value("text") != k){
  61. QString text = settings.value("text").toString();
  62. if(text == "del") text = "";
  63. if(obj->metaObject()->className() == butt.metaObject()->className()){
  64. QPushButton * b = dynamic_cast<QPushButton* >(obj);
  65. b->setText(text);
  66. }
  67. if(obj->metaObject()->className() == lab.metaObject()->className()){
  68. QLabel * l = dynamic_cast<QLabel* >(obj);
  69. l->setText(settings.value("text").toString());
  70. }
  71. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": текст установлен");
  72. }
  73. if(settings.value("align") != k){
  74. QLabel * lab = dynamic_cast<QLabel* >(obj);
  75. if(settings.value("align") == "left") lab->setAlignment(Qt::AlignLeft);
  76. if(settings.value("align") == "center") lab->setAlignment(Qt::AlignCenter);
  77. if(settings.value("align") == "right") lab->setAlignment(Qt::AlignRight);
  78. }
  79. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": настройки позиционирования применены");
  80. settings.endGroup();
  81. } else {
  82. if(item == "mainWindow") {
  83. settings.beginGroup(item);
  84. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": обработка параметров главного окна");
  85. int w = settings.value("width").toInt();
  86. int h = settings.value("height").toInt();
  87. QDesktopWidget desktop;
  88. QRect rect = desktop.availableGeometry(desktop.primaryScreen()); // прямоугольник с размерами экрана
  89. QPoint center = rect.center(); //координаты центра экрана
  90. int x = center.x() - (w / 2); // учитываем половину ширины окна
  91. int y = center.y() - (h / 2); // .. половину высоты
  92. center.setX(x);
  93. center.setY(y);
  94. MainWindow::getInstance()->move(center);
  95. settings.endGroup();
  96. }
  97. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": закончен просчет геометрии");
  98. if(item == "htmlColors") {
  99. settings.beginGroup(item);
  100. foreach(QString key, settings.allKeys()){
  101. MainWindow::getInstance()->htmlColors.insert(key, settings.value(key).toString());
  102. }
  103. settings.endGroup();
  104. }
  105. qInfo("%s:%i: %s%s", __FILE__, __LINE__, item.toStdString().c_str(), ": загружены HTML-цвета");
  106. }
  107. }
  108. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  109. }
  110. void Skin::findSkins(){
  111. qInfo("Темы оформления");
  112. qInfo("%s:%i: %s", __FILE__, __LINE__, "Производим поиск доступных тем.");
  113. QDir dir(QApplication::applicationDirPath() + "/styles");
  114. QStringList skins = dir.entryList(QDir::Dirs | QDir::AllDirs | QDir::NoDotAndDotDot);
  115. MainWindow::getInstance()->ui->skinSelect->addItems(skins);
  116. QString skinname = AConfig::getInstance()->getValue("Global", "current_theme");
  117. MainWindow::getInstance()->ui->skinSelect->setCurrentText(skinname);
  118. qInfo("%s:%i: %s", __FILE__, __LINE__, "Устанавливаем отметку о файле локализации.");
  119. QString file = AConfig::getInstance()->getValue("Local", "file");
  120. if(file == "client_local_English.dat") MainWindow::getInstance()->ui->enButton->setEnabled(false);
  121. if(file == "client_local_DE.dat") MainWindow::getInstance()->ui->deButton->setEnabled(false);
  122. if(file == "client_local_FR.dat") MainWindow::getInstance()->ui->frButton->setEnabled(false);
  123. qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
  124. }
  125. void Skin::replaceSkin(QString name){
  126. QString text = "Смена темы оформления";
  127. QString info = "Выбрана тема " + name + ". Изменения вступят в силу при следующем запуске лаунчера.";
  128. //app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 120, true, false);
  129. qInfo("%s:%i: %s", __FILE__, __LINE__, "Оформляем главное окно.");
  130. QFile styleF;
  131. QString skin = getSkinName();
  132. styleF.setFileName(QApplication::applicationDirPath() + "/styles/" + name + "/style.css");
  133. styleF.open(QFile::ReadOnly);
  134. QString qssStr = styleF.readAll();
  135. qApp->setStyleSheet(qssStr);
  136. QPixmap maskPix(":/res/styles/" + name + "/bg.png");
  137. QPixmap maskPixLocal(QApplication::applicationDirPath() + "/styles/" + name + "/bg.png");
  138. maskPix = maskPix.isNull() ? maskPixLocal : maskPix;
  139. MainWindow::getInstance()->setMask(maskPix.mask());
  140. QString color = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue";
  141. loadSkin();
  142. QString hrefcolor = MainWindow::getInstance()->htmlColors.contains("a") ? MainWindow::getInstance()->htmlColors.lowerBound("a").value() : "blue";
  143. QString newtext = MainWindow::getInstance()->ui->news1Title->text().replace(color, hrefcolor);
  144. MainWindow::getInstance()->ui->news1Title->setText(newtext);
  145. newtext = MainWindow::getInstance()->ui->news2Title->text().replace(color, hrefcolor);
  146. MainWindow::getInstance()->ui->news2Title->setText(newtext);
  147. newtext = MainWindow::getInstance()->ui->news3Title->text().replace(color, hrefcolor);
  148. MainWindow::getInstance()->ui->news3Title->setText(newtext);
  149. newtext = MainWindow::getInstance()->ui->news4Title->text().replace(color, hrefcolor);
  150. MainWindow::getInstance()->ui->news4Title->setText(newtext);
  151. MainWindow::getInstance()->loadHelp();
  152. QMovie * movie = new QMovie(":/res/styles/" + skin + "/loader.gif");
  153. if(!movie->isValid()) movie = new QMovie(QApplication::applicationDirPath() + "/styles/" + skin + "/loader.gif");
  154. MainWindow::getInstance()->ui->loader->setMovie(movie);
  155. movie->setScaledSize(QSize(MainWindow::getInstance()->ui->loader->width(), MainWindow::getInstance()->ui->loader->height()));
  156. movie->start();
  157. }