Browse Source

Added Legacy launcher subproject

Ivan Arkhipov 5 years ago
parent
commit
f23e2e5b43
36 changed files with 4698 additions and 0 deletions
  1. 66 0
      src/Legacy/Legacy.pro
  2. 37 0
      src/Legacy/Legacy_resource.rc
  3. 26 0
      src/Legacy/build_res.pri
  4. 15 0
      src/Legacy/gui/helpwidget.cpp
  5. 25 0
      src/Legacy/gui/helpwidget.h
  6. 775 0
      src/Legacy/gui/helpwidget.ui
  7. 286 0
      src/Legacy/gui/mainwindow.cpp
  8. 107 0
      src/Legacy/gui/mainwindow.h
  9. 415 0
      src/Legacy/gui/mainwindow.ui
  10. 161 0
      src/Legacy/gui/newswidget.cpp
  11. 37 0
      src/Legacy/gui/newswidget.h
  12. 261 0
      src/Legacy/gui/newswidget.ui
  13. 91 0
      src/Legacy/gui/rusificationwidget.cpp
  14. 37 0
      src/Legacy/gui/rusificationwidget.h
  15. 345 0
      src/Legacy/gui/rusificationwidget.ui
  16. 166 0
      src/Legacy/gui/settingswidget.cpp
  17. 48 0
      src/Legacy/gui/settingswidget.h
  18. 660 0
      src/Legacy/gui/settingswidget.ui
  19. 15 0
      src/Legacy/gui/statuswidget.cpp
  20. 34 0
      src/Legacy/gui/statuswidget.h
  21. 508 0
      src/Legacy/gui/statuswidget.ui
  22. 14 0
      src/Legacy/legacy_plugin_import.cpp
  23. 26 0
      src/Legacy/object_script.Legacy.Debug
  24. 24 0
      src/Legacy/object_script.Legacy.Release
  25. 80 0
      src/Legacy/src/filesystem.cpp
  26. 26 0
      src/Legacy/src/filesystem.h
  27. 47 0
      src/Legacy/src/legacyapp.cpp
  28. 47 0
      src/Legacy/src/legacyapp.h
  29. 22 0
      src/Legacy/src/main.cpp
  30. 59 0
      src/Legacy/src/menuentry.cpp
  31. 39 0
      src/Legacy/src/menuentry.h
  32. 74 0
      src/Legacy/src/networkdownloader.cpp
  33. 49 0
      src/Legacy/src/networkdownloader.h
  34. 42 0
      src/Legacy/src/rusificationtreeitem.cpp
  35. 24 0
      src/Legacy/src/rusificationtreeitem.h
  36. 10 0
      src/Legacy/uic_wrapper.bat

+ 66 - 0
src/Legacy/Legacy.pro

@@ -0,0 +1,66 @@
+include( ../../common.pri )
+include( ../../app.pri )
+
+QT       += core gui network
+
+QMAKE_LFLAGS_RELEASE += -static -static-libgcc -static-libstdc++
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = Legacy
+TEMPLATE = app
+
+CXXFLAGS += -O2 -fno-stack-limit
+CONFIG += resources_big
+
+SOURCES += \
+    src/main.cpp \
+    gui/mainwindow.cpp \
+    src/menuentry.cpp \
+    src/legacyapp.cpp \
+    src/filesystem.cpp \
+    gui/statuswidget.cpp \
+    gui/rusificationwidget.cpp \
+    gui/settingswidget.cpp \
+    gui/newswidget.cpp \
+    gui/helpwidget.cpp \
+    src/networkdownloader.cpp \
+    src/rusificationtreeitem.cpp
+
+HEADERS += \
+    gui/mainwindow.h \
+    src/menuentry.h \
+    src/legacyapp.h \
+    src/filesystem.h \
+    gui/statuswidget.h \
+    gui/rusificationwidget.h \
+    gui/settingswidget.h \
+    gui/newswidget.h \
+    gui/helpwidget.h \
+    src/networkdownloader.h \
+    src/rusificationtreeitem.h
+
+FORMS += \
+    gui/mainwindow.ui \
+    gui/statuswidget.ui \
+    gui/rusificationwidget.ui \
+    gui/settingswidget.ui \
+    gui/newswidget.ui \
+    gui/helpwidget.ui
+
+CONFIG(debug, debug|release) {
+	RESOURCES += \
+                resources/backgrounds.qrc \
+                resources/common.qrc
+} else {
+	include(build_res.pri)
+}
+
+win32:RC_ICONS = $$PWD/resources/appicon.ico
+
+INCLUDEPATH += $$PWD/src
+INCLUDEPATH += $$PWD/gui
+
+LIBS += -llibLotroDat_static
+LIBS += -llibyaml-cpp
+LIBS += -llibzlibstatic

+ 37 - 0
src/Legacy/Legacy_resource.rc

@@ -0,0 +1,37 @@
+#include <windows.h>
+
+IDI_ICON1	ICON	DISCARDABLE	"D:\\Programming\\SourceRepos\\Legacy_v2\\src\\Legacy\\resources\\appicon.ico"
+
+VS_VERSION_INFO VERSIONINFO
+	FILEVERSION 2,0,0,0
+	PRODUCTVERSION 0,0,0,0
+	FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+	FILEFLAGS VS_FF_DEBUG
+#else
+	FILEFLAGS 0x0L
+#endif
+	FILEOS VOS__WINDOWS32
+	FILETYPE VFT_DLL
+	FILESUBTYPE 0x0L
+	BEGIN
+		BLOCK "StringFileInfo"
+		BEGIN
+			BLOCK "040904b0"
+			BEGIN
+				VALUE "CompanyName", "Lotro: Legacy\0"
+				VALUE "FileDescription", "Lotro: Legacy rusification launcher\0"
+				VALUE "FileVersion", "2.0.0.0\0"
+				VALUE "LegalCopyright", "Endevir\0"
+				VALUE "OriginalFilename", "Legacy.exe\0"
+				VALUE "ProductName", "Legacy\0"
+				VALUE "ProductVersion", "2.0.0.0\0"
+			END
+		END
+		BLOCK "VarFileInfo"
+		BEGIN
+			VALUE "Translation", 0x0409, 1200
+		END
+	END
+/* End of Version info */
+

+ 26 - 0
src/Legacy/build_res.pri

@@ -0,0 +1,26 @@
+message(==========BUILDING EXTERNAL RES============)
+
+guiRes.target = BuildResources
+exists($$BIN_PATH/res) {
+    message("Directory $$BIN_PATH/res already exists")
+} else {
+    message("Directory $$BIN_PATH/res DOES NOT exist")
+    guiRes.commands += $(MKDIR) \"$$BIN_PATH/res\" $$escape_expand(\n\t)
+}
+
+EXT_RES =                                                                   \
+    "$$PWD/resources/backgrounds.qrc            -o $$BIN_PATH/data01.gtr"     \
+    "$$PWD/resources/common.qrc                 -o $$BIN_PATH/data02.gtr"     \
+
+for (RES, EXT_RES) {
+    win32 {
+        message(rcc.exe -binary $${RES})
+        guiRes.commands += rcc.exe -binary $${RES} $$escape_expand(\n\t)
+    }
+    unix {
+        guiRes.commands += rcc -binary $${RES} $$escape_expand(\n\t)
+    }
+}
+
+QMAKE_EXTRA_TARGETS += guiRes
+PRE_TARGETDEPS += BuildResources

+ 15 - 0
src/Legacy/gui/helpwidget.cpp

@@ -0,0 +1,15 @@
+#include "gui\helpwidget.h"
+#include "ui_helpwidget.h"
+
+HelpWidget::HelpWidget(LegacyApp *_app, QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::HelpWidget),
+    app(_app)
+{
+    ui->setupUi(this);
+}
+
+HelpWidget::~HelpWidget()
+{
+    delete ui;
+}

+ 25 - 0
src/Legacy/gui/helpwidget.h

@@ -0,0 +1,25 @@
+#ifndef HELPWIDGET_H
+#define HELPWIDGET_H
+
+#include <QWidget>
+
+class LegacyApp;
+
+namespace Ui {
+class HelpWidget;
+}
+
+class HelpWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit HelpWidget(LegacyApp *_app, QWidget *parent = 0);
+    ~HelpWidget();
+
+private:
+    Ui::HelpWidget *ui;
+    LegacyApp *app;
+};
+
+#endif // HELPWIDGET_H

+ 775 - 0
src/Legacy/gui/helpwidget.ui

@@ -0,0 +1,775 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>HelpWidget</class>
+ <widget class="QWidget" name="HelpWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>640</width>
+    <height>480</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="autoFillBackground">
+      <bool>false</bool>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QScrollArea{
+	background: transparent;
+}
+
+QScrollArea &gt; QWidget &gt; QWidget { background: transparent; }
+
+QScrollBar:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     width: 10px;
+     margin: 22px 0 22px 0;
+ }
+
+ QScrollBar::handle:vertical {
+	background-color: rgba(129, 129, 129, 150);	
+    min-height: 10px;
+	border-radius: 5px;
+ }
+ QScrollBar::add-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: bottom;
+     subcontrol-origin: margin;
+ }
+
+ QScrollBar::sub-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: top;
+     subcontrol-origin: margin;
+ }
+ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
+     border: 0px;
+     width: 3px;
+     height: 3px;
+     background: transparent;
+ }
+
+ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
+     background: none;
+ }</string>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <property name="horizontalScrollBarPolicy">
+      <enum>Qt::ScrollBarAlwaysOff</enum>
+     </property>
+     <property name="sizeAdjustPolicy">
+      <enum>QAbstractScrollArea::AdjustIgnored</enum>
+     </property>
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>608</width>
+        <height>589</height>
+       </rect>
+      </property>
+      <property name="autoFillBackground">
+       <bool>false</bool>
+      </property>
+      <layout class="QGridLayout" name="news_layout">
+       <property name="leftMargin">
+        <number>11</number>
+       </property>
+       <property name="topMargin">
+        <number>11</number>
+       </property>
+       <property name="rightMargin">
+        <number>11</number>
+       </property>
+       <property name="bottomMargin">
+        <number>11</number>
+       </property>
+       <property name="spacing">
+        <number>7</number>
+       </property>
+       <item row="5" column="0">
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="2" column="0">
+        <widget class="QWidget" name="backup_status_8" native="true">
+         <property name="styleSheet">
+          <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_7">
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_4_title_3">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+              <pointsize>8</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: #cfa644;  background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Основные тексты:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_5_common_6">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>a_AlgeriusNr</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true"> background-color:none;
+color: rgb(255, 255, 127);</string>
+            </property>
+            <property name="text">
+             <string>Скачивается: 56%</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QPushButton" name="pushButton_3">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>80</width>
+              <height>20</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QPushButton {
+	background-image: url(:/assets/buttons/gray_btn.png);
+	color: black;
+	border-radius: 5px;
+	border: 1px solid black;
+}
+ 
+QPushButton:pressed {
+	border: 2px solid black;
+}</string>
+            </property>
+            <property name="text">
+             <string>Выключить</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0" colspan="3">
+           <widget class="QLabel" name="label_common_14">
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(255, 255, 255); background-color: transparent;</string>
+            </property>
+            <property name="text">
+             <string>Краткое описание бла-бла-бла lorem ipsum dolor sit amet bla-bla-bla angus magnus petricus жил я как-то в хижине, деревянной, да потом сгорела она</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <property name="indent">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="3" column="0">
+        <widget class="QWidget" name="backup_status_14" native="true">
+         <property name="styleSheet">
+          <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_8">
+          <item row="0" column="2">
+           <widget class="QPushButton" name="pushButton_6">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>80</width>
+              <height>20</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QPushButton {
+	background-image: url(:/assets/buttons/gray_btn.png);
+	color: black;
+	border-radius: 5px;
+	border: 1px solid black;
+}
+ 
+QPushButton:pressed {
+	border: 2px solid black;
+}</string>
+            </property>
+            <property name="text">
+             <string>Выключить</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_5_common_15">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>a_AlgeriusNr</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true"> background-color:none;
+color: rgb(255, 255, 127);</string>
+            </property>
+            <property name="text">
+             <string>В очереди</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_4_title_6">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+              <pointsize>8</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: #cfa644;  background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Названия предметов:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0" colspan="3">
+           <widget class="QLabel" name="label_common_15">
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(255, 255, 255); background-color: transparent;</string>
+            </property>
+            <property name="text">
+             <string>Краткое описание бла-бла-бла lorem ipsum dolor sit amet bla-bla-bla angus magnus petricus жил я как-то в хижине, деревянной, да потом сгорела она</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <property name="indent">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="4" column="0">
+        <widget class="QWidget" name="backup_status_15" native="true">
+         <property name="styleSheet">
+          <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_9">
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_4_title_7">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+              <pointsize>8</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: #cfa644;  background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Названия эмоций:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_5_title_16">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>a_AlgeriusNr</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true"> background-color:none;
+color: rgb(255, 255, 127);</string>
+            </property>
+            <property name="text">
+             <string>В очереди</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QPushButton" name="pushButton_7">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QPushButton {
+	color: black;
+    border: 2px solid #8f8f91;
+    border-radius: 6px;
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #f6f7fa, stop: 1 #dadbde);
+    min-width: 80px;
+}
+ 
+QPushButton:pressed {
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #caccd3, stop: 1 #f6f7fa);
+}
+ 
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+ 
+QPushButton:default {
+    border-color: navy; /* make the default button prominent */
+}</string>
+            </property>
+            <property name="text">
+             <string>Выключить</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0" colspan="3">
+           <widget class="QLabel" name="label_common_10">
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(255, 255, 255); background-color: transparent;</string>
+            </property>
+            <property name="text">
+             <string>Краткое описание бла-бла-бла</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <property name="indent">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="1" column="0">
+        <widget class="QWidget" name="backup_status_16" native="true">
+         <property name="styleSheet">
+          <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_13">
+          <item row="0" column="2">
+           <widget class="QLabel" name="label_5_common_18">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>a_AlgeriusNr</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true"> background-color:none;
+color: rgb(255, 0, 0);</string>
+            </property>
+            <property name="text">
+             <string>Выключен</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="3">
+           <widget class="QPushButton" name="pushButton_9">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>80</width>
+              <height>20</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QPushButton {
+	background-image: url(:/assets/buttons/gray_btn.png);
+	color: black;
+	border-radius: 5px;
+	border: 1px solid black;
+}
+ 
+QPushButton:pressed {
+	border: 2px solid black;
+}</string>
+            </property>
+            <property name="text">
+             <string>Включить</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_4_title_9">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+              <pointsize>8</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: #cfa644;  background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Шрифты (старая версия):</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1" colspan="3">
+           <widget class="QLabel" name="label_common_13">
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(255, 255, 255); background-color: transparent;</string>
+            </property>
+            <property name="text">
+             <string>Краткое описание бла-бла-бла lorem ipsum dolor sit amet bla-bla-bla angus magnus petricus жил я как-то в хижине, деревянной, да потом сгорела она</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <property name="indent">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0" rowspan="2">
+           <widget class="QLabel" name="label_2">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>64</width>
+              <height>64</height>
+             </size>
+            </property>
+            <property name="maximumSize">
+             <size>
+              <width>64</width>
+              <height>64</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">border-image: url(:/assets/patch_icons/shrifty-photo-small.png);
+background: transparent; border-radius: 0px;</string>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="0" column="0">
+        <widget class="QWidget" name="backup_status_3" native="true">
+         <property name="styleSheet">
+          <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_2">
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_4_title">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+              <pointsize>8</pointsize>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: #cfa644;  background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Шрифты:</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QLabel" name="label_5_common">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>a_AlgeriusNr</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(0, 170, 0); background-color:none;</string>
+            </property>
+            <property name="text">
+             <string>Включен</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="3">
+           <widget class="QPushButton" name="pushButton">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>80</width>
+              <height>20</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QPushButton {
+	background-image: url(:/assets/buttons/gray_btn.png);
+	color: black;
+	border-radius: 5px;
+	border: 1px solid black;
+}
+ 
+QPushButton:pressed {
+	border: 2px solid black;
+}</string>
+            </property>
+            <property name="text">
+             <string>Выключить</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="1" colspan="3">
+           <widget class="QLabel" name="label_common_4">
+            <property name="font">
+             <font>
+              <family>Trajan Pro 3</family>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: rgb(255, 255, 255); background-color: transparent;</string>
+            </property>
+            <property name="text">
+             <string>Краткое описание бла-бла-бла lorem ipsum dolor sit amet bla-bla-bla angus magnus petricus жил я как-то в хижине, деревянной, да потом сгорела она</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <property name="indent">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0" rowspan="4">
+           <widget class="QLabel" name="label">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>64</width>
+              <height>64</height>
+             </size>
+            </property>
+            <property name="maximumSize">
+             <size>
+              <width>64</width>
+              <height>64</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">border-image: url(:/assets/patch_icons/shrifty-photo-small.png);
+background: transparent; border-radius: 0px;</string>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 286 - 0
src/Legacy/gui/mainwindow.cpp

@@ -0,0 +1,286 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "legacyapp.h"
+
+#include <QBitmap>
+#include <QPainter>
+#include <QPixmap>
+#include <QDebug>
+#include <QThread>
+#include <QMouseEvent>
+#include <QMessageBox>
+#include <QDesktopWidget>
+#include <QtConcurrent/QtConcurrent>
+
+MainWindow::MainWindow(LegacyApp *app, QWidget *parent) :
+    QMainWindow(parent, Qt::Window | Qt::FramelessWindowHint), app(app),
+    ui(new Ui::MainWindow), menuHoverWidget(nullptr), menuHoverWidgetAnimation(nullptr)
+{
+}
+
+void MainWindow::Init() {
+    ui->setupUi(this);
+
+    status_frame = new StatusWidget(app, this);
+    ui->content_layout->addWidget(status_frame);
+
+    rusification_frame = new RusificationWidget(app, this);
+    ui->content_layout->addWidget(rusification_frame);
+
+    settings_frame = new SettingsWidget(app, this);
+    ui->content_layout->addWidget(settings_frame);
+
+    news_frame = new NewsWidget(app, this);
+    ui->content_layout->addWidget(news_frame);
+
+    help_frame = new HelpWidget(app, this);
+    ui->content_layout->addWidget(help_frame);
+
+    hideAllContentWidgets();
+    status_frame->show();
+
+    changeFontSizeRecursive(100, this);
+
+    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
+    background = new QPixmap();
+    background->load(":/assets/backgrounds/bg" + QString::number(qrand() % MAX_PIXMAP_ID + 1) + ".png");
+    setupWindowBackgroundAndMask();
+    setupMenuHoverWidget();
+
+    updateGeometry();
+    repaint();
+
+    background_update_timer.setInterval(30 * 1000);
+    connect(&background_update_timer, &QTimer::timeout, this, &MainWindow::randomChangeBackground);
+    background_update_timer.start();
+    ui->centralWidget->setStyleSheet("");
+    show();
+}
+
+void MainWindow::mousePressEvent(QMouseEvent *event)
+{
+    if (event->button() == Qt::LeftButton) {
+        dragPosition = event->globalPos() - frameGeometry().topLeft();
+        event->accept();
+    }
+}
+
+void MainWindow::mouseMoveEvent(QMouseEvent *event)
+{
+    if (event->buttons() & Qt::LeftButton) {
+        move(event->globalPos() - dragPosition);
+        event->accept();
+    }
+}
+
+void MainWindow::resizeEvent(QResizeEvent * event)
+{
+    int width = event->size().width();
+    int height = event->size().height();
+
+    ui->menu_widget->move(width * 675 / 2000, height * 80 / 1296);
+    ui->menu_widget->resize(width * 1260 / 2000, height * 90 / 1296);
+
+    ui->content_area->move(width * 25 / 2000, height * 250 / 1296);
+    ui->content_area->resize(width * 1950 / 2000, height * 1000 / 1296);
+    setupWindowBackgroundAndMask();
+}
+
+void MainWindow::randomChangeBackground()
+{
+    if (!qApp)
+        return;
+
+    qDebug() << "Starting background update";
+
+    if (fade_animation_timer.isActive()) {
+        qDebug() << "MainWindow::startBackgroundUpdate() - cannot start, because update is still active";
+        return;
+    }
+
+    next_pixmap_opacity = 0;
+    int next_pixmap_id = qrand() % MAX_PIXMAP_ID + 1;
+
+    if (!next_pixmap)
+        next_pixmap = new QPixmap();
+
+    next_pixmap->load(":/assets/backgrounds/bg" + QString::number(next_pixmap_id) + ".png");
+    qDebug() << "Next pixmap id" << next_pixmap_id << "!";
+
+    if (next_pixmap->isNull()) {
+        qDebug() << "Incorrect pixmap id " << next_pixmap_id << "!";
+        return;
+    }
+
+    QtConcurrent::run([this](){
+        qDebug() << "Starting background update";
+        while (next_pixmap_opacity < 1 && qApp) {
+            if (!qApp)
+                return;
+
+            QPainter painter;
+            painter.begin(background);
+            painter.setOpacity(next_pixmap_opacity);
+            painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
+            painter.drawPixmap(0,0, *next_pixmap);
+            painter.end();
+
+            setupWindowBackgroundAndMask();
+            next_pixmap_opacity += 0.005;
+            QThread::msleep(50);
+        }
+        qDebug() << "Background update finished";
+    });
+}
+
+
+MainWindow::~MainWindow()
+{
+    delete ui;
+}
+
+void MainWindow::on_menuentry_1_common_clicked()
+{
+    hideAllContentWidgets();
+    status_frame->show();
+}
+
+void MainWindow::on_menuentry_2_common_clicked()
+{
+    hideAllContentWidgets();
+    settings_frame->show();
+}
+
+void MainWindow::on_menuentry_3_common_clicked()
+{
+    hideAllContentWidgets();
+    rusification_frame->show();
+}
+
+void MainWindow::on_menuentry_4_common_clicked()
+{
+    hideAllContentWidgets();
+    news_frame->show();
+}
+
+void MainWindow::on_menuentry_5_common_clicked()
+{
+    hideAllContentWidgets();
+    help_frame->show();
+}
+
+void MainWindow::onHoverMenuentry()
+{
+    moveMenuHoverWidget(MenuEntry::getHoverLabel());
+}
+
+void MainWindow::setupWindowBackgroundAndMask()
+{
+    current_bg = background->scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+    current_mask = current_bg.mask();
+    setMask(current_mask);
+
+    QPalette palette;
+    palette.setBrush(QPalette::Window, current_bg);
+    setPalette(palette);
+}
+
+void MainWindow::setupMenuHoverWidget()
+{
+    menuHoverWidget = new QWidget(ui->menu_widget);
+    menuHoverWidget->setStyleSheet("background-color: rgba(55, 37, 31, 250);");
+    menuHoverWidget->resize(0, 0);
+
+    connect(ui->menuentry_1_common, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_2_common, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_3_common, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_4_common, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_5_common, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+
+    MenuEntry::setActiveLabel(ui->menuentry_1_common);
+    menu_hover_checker_timer.setInterval(500);
+    connect(&menu_hover_checker_timer, &QTimer::timeout, this, &MainWindow::checkMenuIsHovered);
+    menu_hover_checker_timer.start();
+}
+
+void MainWindow::moveMenuHoverWidget(MenuEntry *target)
+{
+    if (menuHoverWidget->size() == QSize(0, 0)) {
+        menuHoverWidget->resize(target->size() + QSize(10, 0));
+        menuHoverWidget->move(target->pos() + QPoint(-5, 0));
+    } else {
+        if (menuHoverWidgetAnimation == nullptr)
+            menuHoverWidgetAnimation = new QPropertyAnimation(menuHoverWidget, "geometry");
+        else
+            menuHoverWidgetAnimation->stop();
+
+        menuHoverWidgetAnimation->setDuration(200);
+        menuHoverWidgetAnimation->setStartValue(QRect(menuHoverWidget->pos(), menuHoverWidget->size()));
+        menuHoverWidgetAnimation->setEndValue(QRect(target->pos() + QPoint(-5, 0), target->size() + QSize(10, 0)));
+        menuHoverWidgetAnimation->start();
+    }
+
+    ui->menuentry_1_common->raise();
+    ui->menuentry_2_common->raise();
+    ui->menuentry_3_common->raise();
+    ui->menuentry_4_common->raise();
+    ui->menuentry_5_common->raise();
+
+}
+
+void MainWindow::checkMenuIsHovered()
+{
+    QPoint pos = QCursor::pos();
+    QWidget *hovered = qApp->widgetAt(pos);
+    if (!hovered || hovered->objectName().size() < 4 ||
+            (hovered->objectName().left(9) != "menuentry" && hovered->objectName() != "menu_widget")) {
+        moveMenuHoverWidget(MenuEntry::getActiveLabel());
+        MenuEntry::setHoverLabel(nullptr);
+    }
+}
+
+void MainWindow::hideAllContentWidgets()
+{
+    status_frame->hide();
+    rusification_frame->hide();
+    settings_frame->hide();
+    news_frame->hide();
+    help_frame->hide();
+}
+
+void MainWindow::changeFontSizeRecursive(size_t percent, QWidget *widget)
+{
+    if (!widget)
+        return;
+    QFont widget_font = widget->font();
+    QString widget_name = widget->objectName();
+
+    if (widget_name.contains("_common"))
+        widget_font.setPixelSize(common_font_size * percent / 100);
+    if (widget_name.contains("_title"))
+        widget_font.setPixelSize(title_font_size * percent / 100);
+    if (widget_name.contains("_supertitle"))
+        widget_font.setPixelSize(supertitle_font_size * percent / 100);
+    if (widget_name.contains("_bigbutton"))
+        widget_font.setPixelSize(bigbutton_font_size * percent / 100);
+
+    widget->setFont(widget_font);
+
+    for (QObject* child : widget->children())
+        if (child->isWidgetType()) {
+            QWidget* w = qobject_cast<QWidget *>(child);
+            changeFontSizeRecursive(percent, w);
+            w->resize(w->sizeHint());
+        }
+}
+
+void MainWindow::on_closeButton_clicked()
+{
+    hide();
+    qApp->quit();
+}
+
+void MainWindow::on_minimizeButton_clicked()
+{
+    setWindowState(Qt::WindowMinimized);
+}

+ 107 - 0
src/Legacy/gui/mainwindow.h

@@ -0,0 +1,107 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QPropertyAnimation>
+#include <QTimer>
+#include <QPixmap>
+#include <QBitmap>
+
+#include "statuswidget.h"
+#include "rusificationwidget.h"
+#include "settingswidget.h"
+#include "newswidget.h"
+#include "helpwidget.h"
+
+namespace Ui {
+class MainWindow;
+}
+
+class MenuEntry;
+class LegacyApp;
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+    struct PixmapObertka{
+        QPixmap* pixmap;
+    };
+
+public:
+    explicit MainWindow(LegacyApp *app = 0, QWidget *parent = 0);
+    void Init();
+    void changeFontSizeRecursive(size_t percent, QWidget* widget);
+    ~MainWindow();
+
+protected:
+    void mouseMoveEvent(QMouseEvent *event) override;
+    void mousePressEvent(QMouseEvent *event) override;
+    void resizeEvent(QResizeEvent *event) override;
+
+private slots:
+    void randomChangeBackground();
+
+    void on_menuentry_1_common_clicked();
+
+    void on_menuentry_2_common_clicked();
+
+    void on_menuentry_3_common_clicked();
+
+    void on_menuentry_4_common_clicked();
+
+    void on_menuentry_5_common_clicked();
+
+    void onHoverMenuentry();
+
+    void on_closeButton_clicked();
+
+    void on_minimizeButton_clicked();
+
+private:
+    void setupWindowBackgroundAndMask();
+
+    void setupMenuHoverWidget();
+
+    void moveMenuHoverWidget(MenuEntry* target);
+
+    void checkMenuIsHovered();
+
+    void hideAllContentWidgets();
+
+private:
+    LegacyApp *app;
+
+    Ui::MainWindow *ui;
+
+    QWidget* menuHoverWidget;
+    QPropertyAnimation* menuHoverWidgetAnimation;
+    QPropertyAnimation* menuHoverWidgetScaleAnimation;
+    QTimer menu_hover_checker_timer;
+
+    QPoint dragPosition;
+
+    StatusWidget *status_frame;
+    RusificationWidget *rusification_frame;
+    SettingsWidget *settings_frame;
+    NewsWidget *news_frame;
+    HelpWidget *help_frame;
+
+    QPixmap *background;
+    QPixmap *next_pixmap {nullptr};
+
+    QPixmap current_bg;
+    QBitmap current_mask;
+
+    QTimer background_update_timer;
+    QTimer fade_animation_timer;
+    double next_pixmap_opacity;
+
+    const int MAX_PIXMAP_ID = 9;
+
+    const size_t common_font_size = 15;
+    const size_t title_font_size = 17;
+    const size_t supertitle_font_size = 32;
+    const size_t bigbutton_font_size = 22;
+};
+
+#endif // MAINWINDOW_H

+ 415 - 0
src/Legacy/gui/mainwindow.ui

@@ -0,0 +1,415 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>900</width>
+    <height>650</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>ВКО: Наследие</string>
+  </property>
+  <property name="autoFillBackground">
+   <bool>false</bool>
+  </property>
+  <property name="styleSheet">
+   <string notr="true"/>
+  </property>
+  <property name="animated">
+   <bool>false</bool>
+  </property>
+  <property name="tabShape">
+   <enum>QTabWidget::Triangular</enum>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="autoFillBackground">
+    <bool>false</bool>
+   </property>
+   <property name="styleSheet">
+    <string notr="true">border-image: url(:/assets/backgrounds/bg1.png);</string>
+   </property>
+   <widget class="QWidget" name="content_area" native="true">
+    <property name="geometry">
+     <rect>
+      <x>0</x>
+      <y>129</y>
+      <width>901</width>
+      <height>501</height>
+     </rect>
+    </property>
+    <property name="sizePolicy">
+     <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+      <horstretch>0</horstretch>
+      <verstretch>0</verstretch>
+     </sizepolicy>
+    </property>
+    <property name="autoFillBackground">
+     <bool>false</bool>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">border-image:none;</string>
+    </property>
+    <layout class="QGridLayout" name="gridLayout_3">
+     <property name="leftMargin">
+      <number>20</number>
+     </property>
+     <property name="topMargin">
+      <number>10</number>
+     </property>
+     <property name="rightMargin">
+      <number>20</number>
+     </property>
+     <property name="bottomMargin">
+      <number>10</number>
+     </property>
+     <item row="0" column="0">
+      <layout class="QGridLayout" name="content_layout"/>
+     </item>
+    </layout>
+   </widget>
+   <widget class="QWidget" name="menu_widget" native="true">
+    <property name="geometry">
+     <rect>
+      <x>300</x>
+      <y>40</y>
+      <width>571</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="sizePolicy">
+     <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+      <horstretch>0</horstretch>
+      <verstretch>0</verstretch>
+     </sizepolicy>
+    </property>
+    <property name="autoFillBackground">
+     <bool>false</bool>
+    </property>
+    <property name="styleSheet">
+     <string notr="true">border-image:transparent;</string>
+    </property>
+    <layout class="QHBoxLayout" name="horizontalLayout" stretch="6,7,13,7,6,0">
+     <property name="spacing">
+      <number>10</number>
+     </property>
+     <property name="sizeConstraint">
+      <enum>QLayout::SetDefaultConstraint</enum>
+     </property>
+     <property name="leftMargin">
+      <number>0</number>
+     </property>
+     <property name="topMargin">
+      <number>0</number>
+     </property>
+     <property name="rightMargin">
+      <number>0</number>
+     </property>
+     <property name="bottomMargin">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="MenuEntry" name="menuentry_1_common">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="baseSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>Constantia</family>
+         <pointsize>9</pointsize>
+         <weight>50</weight>
+         <bold>false</bold>
+        </font>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="layoutDirection">
+        <enum>Qt::LeftToRight</enum>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color:rgb(255, 255, 255);</string>
+       </property>
+       <property name="text">
+        <string>  СТАТУС  </string>
+       </property>
+       <property name="scaledContents">
+        <bool>true</bool>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="default" stdset="0">
+        <bool>false</bool>
+       </property>
+       <property name="flat" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MenuEntry" name="menuentry_2_common">
+       <property name="enabled">
+        <bool>true</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="font">
+        <font>
+         <family>Constantia</family>
+        </font>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color:rgb(255, 255, 255);</string>
+       </property>
+       <property name="text">
+        <string>  НАСТРОЙКИ  </string>
+       </property>
+       <property name="scaledContents">
+        <bool>true</bool>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="flat" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MenuEntry" name="menuentry_3_common">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>Constantia</family>
+        </font>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color:rgb(255, 255, 255)</string>
+       </property>
+       <property name="text">
+        <string notr="true">  РУСИФИКАЦИЯ  </string>
+       </property>
+       <property name="scaledContents">
+        <bool>true</bool>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="flat" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MenuEntry" name="menuentry_4_common">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>Constantia</family>
+        </font>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color:rgb(255, 255, 255);</string>
+       </property>
+       <property name="text">
+        <string> НОВОСТИ </string>
+       </property>
+       <property name="scaledContents">
+        <bool>true</bool>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="flat" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="MenuEntry" name="menuentry_5_common">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="font">
+        <font>
+         <family>Constantia</family>
+        </font>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="layoutDirection">
+        <enum>Qt::LeftToRight</enum>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">color:rgb(255, 255, 255);</string>
+       </property>
+       <property name="text">
+        <string>  ПОМОЩЬ  </string>
+       </property>
+       <property name="scaledContents">
+        <bool>true</bool>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="flat" stdset="0">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QWidget" name="widget" native="true">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <property name="spacing">
+         <number>5</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QPushButton" name="minimizeButton">
+          <property name="minimumSize">
+           <size>
+            <width>20</width>
+            <height>20</height>
+           </size>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QPushButton#minimizeButton {border-image: url(:/assets/buttons/minimize.png) 0 0 0 0 stretch stretch; border: 0px;}
+
+QPushButton#minimizeButton:hover {border-image: url(:/assets/buttons/minimize.png) 0 0 0 0 stretch stretch; border: 1px;}
+
+</string>
+          </property>
+          <property name="text">
+           <string>_</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="closeButton">
+          <property name="minimumSize">
+           <size>
+            <width>20</width>
+            <height>20</height>
+           </size>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QPushButton#closeButton { border-image: url(:/assets/buttons/close.png) 0 0 0 0 stretch stretch; }
+
+QPushButton#closeButton:hover { border-image: url(:/assets/buttons/close.png) 0 0 0 0 stretch stretch; border:1px;}</string>
+          </property>
+          <property name="text">
+           <string>Х</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+  <customwidget>
+   <class>MenuEntry</class>
+   <extends>QLabel</extends>
+   <header>menuentry.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>

+ 161 - 0
src/Legacy/gui/newswidget.cpp

@@ -0,0 +1,161 @@
+#include "gui\newswidget.h"
+#include "ui_newswidget.h"
+
+#include "networkdownloader.h"
+#include "legacyapp.h"
+#include <QtConcurrent/QtConcurrent>
+#include <QLabel>
+
+NewsWidget::NewsWidget(LegacyApp *_app, QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::NewsWidget),
+    app(_app), news_downloader(this)
+{
+    ui->setupUi(this);
+    ui->test_news_piece->hide();
+
+    news_downloader.targetBytearray = &news_data;
+    news_downloader.setUrl(QUrl("http://translate.lotros.ru/groupware/launcher_news"));
+
+    connect(&news_update_timer, &QTimer::timeout, &news_downloader, &NetworkDownloader::start);
+    connect(&news_downloader, &NetworkDownloader::downloadFinished, this, &NewsWidget::updateNews);
+    emit news_downloader.start();
+    news_update_timer.setInterval(1000 * 60); // 10 minutes;
+    news_update_timer.start();
+}
+
+NewsWidget::~NewsWidget()
+{
+    news_update_timer.stop();
+    delete ui;
+}
+
+void NewsWidget::updateNews()
+{
+    if (!qApp)
+        return;
+
+    if (news_data.size() == 0) {
+        constructNewsPiece(0, "Не могу загрузить новости", "Загрузка новостей не удалась. Чтобы просмотреть новости, перейдите на <a href='http://translate.lotros.ru/news'>http://translate.lotros.ru/news</a>", "http://translate.lotros.ru/news");
+        return;
+    }
+
+    QStringList news_list = QString(news_data).split(":::");
+    news_data.clear();
+
+    for (int i = 0; i < news_list.size(); i++) {
+        QStringList news_piece = news_list[i].split("|");
+
+        QString img_src = news_piece[0];
+        QString news_title = news_piece[1];
+        QString news_desrc = news_piece[2];
+        QString news_src = news_piece[3];
+
+        constructNewsPiece(i, news_title, news_desrc, news_src);
+
+        QtConcurrent::run([i, this, img_src](){
+            NetworkDownloader img_dwnld;
+            QByteArray img;
+            img_dwnld.setUrl(QUrl(img_src));
+            img_dwnld.targetBytearray = &img;
+            img_dwnld.start();
+            img_dwnld.waitForDownloaded();
+            QPixmap img_pixmap;
+            img_pixmap.loadFromData(img);
+            setImgToNewsPiece(i, img_pixmap);
+        });
+    }
+
+    QSpacerItem* verticalSpacer = new QSpacerItem(20, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
+    ui->news_layout->addItem(verticalSpacer, news_list.size(), 0);
+}
+
+void NewsWidget::constructNewsPiece(int piece_id, QString title, QString text, QString news_src)
+{
+    QWidget* old_piece = findChild<QWidget*>("news_piece_" + QString::number(piece_id));
+
+    if (old_piece) {
+        ui->news_layout->removeWidget(old_piece);
+        old_piece->deleteLater();
+    }
+
+    QWidget* news_piece = new QWidget(this);
+
+    news_piece->setObjectName(QStringLiteral("news_piece_") + QString::number(piece_id));
+    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+    sizePolicy.setHorizontalStretch(0);
+    sizePolicy.setVerticalStretch(0);
+    sizePolicy.setHeightForWidth(news_piece->sizePolicy().hasHeightForWidth());
+
+    news_piece->setSizePolicy(sizePolicy);
+    news_piece->setStyleSheet(QLatin1String("QWidget{\n"
+                                            "border-radius: 20px;\n"
+                                            "background-color: rgba(30, 0, 0, 100);\n"
+                                            "color: white;\n"
+                                            "}\n"
+                                            "\n"
+                                            "QLabel{\n"
+                                            "border-radius: 2px;\n"
+                                            "background-color:rgba(0,0,0,0);\n"
+                                            "}"));
+
+    QGridLayout* news_piece_layout = new QGridLayout(news_piece);
+    news_piece_layout->setObjectName(QStringLiteral("news_piece_layout"));
+    news_piece_layout->setContentsMargins(11, 11, 11, 11);
+    news_piece_layout->setSpacing(15);
+
+    QLabel* iconLabel = new QLabel(news_piece);
+    iconLabel->setObjectName(QStringLiteral("news_icon_") + QString::number(piece_id));
+    QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    sizePolicy1.setHorizontalStretch(0);
+    sizePolicy1.setVerticalStretch(0);
+    sizePolicy1.setHeightForWidth(iconLabel->sizePolicy().hasHeightForWidth());
+
+    iconLabel->setSizePolicy(sizePolicy1);
+    iconLabel->setMinimumSize(QSize(60, 60));
+    iconLabel->setMaximumSize(QSize(60, 60));
+    iconLabel->setPixmap(QPixmap(QString::fromUtf8(":/assets/appicon.ico")).scaled(60, 60));
+
+    iconLabel->setStyleSheet("border-radius: 10px;");
+
+    news_piece_layout->addWidget(iconLabel, 0, 0, 2, 1);
+
+    QLabel* titleLabel = new QLabel(news_piece);
+    titleLabel->setObjectName(QStringLiteral("titleLabel_title"));
+    sizePolicy.setHeightForWidth(titleLabel->sizePolicy().hasHeightForWidth());
+    titleLabel->setSizePolicy(sizePolicy);
+
+    QFont font;
+    font.setFamily(QStringLiteral("Trajan Pro 3"));
+    font.setPixelSize(12);
+    font.setBold(false);
+    font.setUnderline(false);
+
+    titleLabel->setFont(font);
+    titleLabel->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter);
+    titleLabel->setWordWrap(true);
+    titleLabel->setText("<a style=\"color: #cfa644; text-decoration:none;\" href = '" + news_src + "'>" + title + "</a>");
+    titleLabel->setOpenExternalLinks(true);
+
+    news_piece_layout->addWidget(titleLabel, 0, 1, 1, 1);
+
+    QLabel* contentLabel = new QLabel(news_piece);
+    contentLabel->setObjectName(QStringLiteral("contentLabel_common"));
+    contentLabel->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop);
+    contentLabel->setWordWrap(true);
+    contentLabel->setText(text);
+    contentLabel->setSizePolicy(sizePolicy);
+
+    news_piece_layout->addWidget(contentLabel, 1, 1, 1, 1);
+    app->window.changeFontSizeRecursive(app->properties.value("settings/ui_scale", 100).toInt(), news_piece);
+
+    ui->news_layout->addWidget(news_piece, piece_id, 0);
+}
+
+void NewsWidget::setImgToNewsPiece(int piece_id, QPixmap img)
+{
+    QLabel* old_piece = findChild<QLabel*>("news_icon_" + QString::number(piece_id));
+    if (!old_piece)
+        return;
+    old_piece->setPixmap(img.scaled(60, 60));
+}

+ 37 - 0
src/Legacy/gui/newswidget.h

@@ -0,0 +1,37 @@
+#ifndef NEWSWIDGET_H
+#define NEWSWIDGET_H
+
+#include <QWidget>
+#include <QTimer>
+#include "networkdownloader.h"
+
+namespace Ui {
+class NewsWidget;
+}
+
+class LegacyApp;
+
+class NewsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit NewsWidget(LegacyApp *_app, QWidget *parent = 0);
+    ~NewsWidget();
+
+public slots:
+    void updateNews();
+
+private:
+    void constructNewsPiece(int piece_id, QString title, QString text, QString news_src);
+    void setImgToNewsPiece(int piece_id, QPixmap img);
+
+private:
+    Ui::NewsWidget *ui;
+    LegacyApp *app;
+    QTimer news_update_timer;
+    QByteArray news_data;
+    NetworkDownloader news_downloader;
+};
+
+#endif // NEWSWIDGET_H

+ 261 - 0
src/Legacy/gui/newswidget.ui

@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NewsWidget</class>
+ <widget class="QWidget" name="NewsWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>860</width>
+    <height>491</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QScrollArea" name="scrollArea">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="autoFillBackground">
+      <bool>false</bool>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QScrollArea{
+	background: transparent;
+}
+
+QScrollArea &gt; QWidget &gt; QWidget { background: transparent; }
+
+QScrollBar:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     width: 10px;
+     margin: 22px 0 22px 0;
+ }
+
+ QScrollBar::handle:vertical {
+	background-color: rgba(129, 129, 129, 150);	
+    min-height: 10px;
+	border-radius: 5px;
+ }
+ QScrollBar::add-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: bottom;
+     subcontrol-origin: margin;
+ }
+
+ QScrollBar::sub-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: top;
+     subcontrol-origin: margin;
+ }
+ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
+     border: 0px;
+     width: 3px;
+     height: 3px;
+     background: transparent;
+ }
+
+ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
+     background: none;
+ }</string>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::NoFrame</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <property name="lineWidth">
+      <number>0</number>
+     </property>
+     <property name="horizontalScrollBarPolicy">
+      <enum>Qt::ScrollBarAlwaysOff</enum>
+     </property>
+     <property name="sizeAdjustPolicy">
+      <enum>QAbstractScrollArea::AdjustIgnored</enum>
+     </property>
+     <property name="widgetResizable">
+      <bool>true</bool>
+     </property>
+     <property name="alignment">
+      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+     </property>
+     <widget class="QWidget" name="scrollAreaWidgetContents">
+      <property name="geometry">
+       <rect>
+        <x>0</x>
+        <y>0</y>
+        <width>838</width>
+        <height>469</height>
+       </rect>
+      </property>
+      <property name="autoFillBackground">
+       <bool>false</bool>
+      </property>
+      <layout class="QGridLayout" name="news_layout">
+       <property name="leftMargin">
+        <number>11</number>
+       </property>
+       <property name="topMargin">
+        <number>11</number>
+       </property>
+       <property name="rightMargin">
+        <number>11</number>
+       </property>
+       <property name="bottomMargin">
+        <number>11</number>
+       </property>
+       <property name="spacing">
+        <number>7</number>
+       </property>
+       <item row="0" column="0">
+        <widget class="QWidget" name="test_news_piece" native="true">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="styleSheet">
+          <string notr="true">QWidget{
+border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);
+color: white;
+}
+
+QLabel{
+border-radius: 2px;
+background-color:rgba(0,0,0,0);
+}</string>
+         </property>
+         <layout class="QGridLayout" name="news_piece_layout">
+          <property name="leftMargin">
+           <number>11</number>
+          </property>
+          <property name="topMargin">
+           <number>11</number>
+          </property>
+          <property name="rightMargin">
+           <number>11</number>
+          </property>
+          <property name="bottomMargin">
+           <number>11</number>
+          </property>
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <item row="0" column="0" rowspan="2">
+           <widget class="QLabel" name="iconLabel">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>60</width>
+              <height>60</height>
+             </size>
+            </property>
+            <property name="maximumSize">
+             <size>
+              <width>60</width>
+              <height>60</height>
+             </size>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">QWidget{
+border-radius: 10px;
+}</string>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::NoFrame</enum>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+            <property name="pixmap">
+             <pixmap resource="../common.qrc">:/assets/buttons/question.png</pixmap>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="titleLabel_title">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <family>Trebuchet MS</family>
+              <pointsize>11</pointsize>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">color: white;
+text-decoration: none;</string>
+            </property>
+            <property name="text">
+             <string>Тестовая новость - Название</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QLabel" name="contentLabel">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="text">
+             <string>Контент контент контент контент контент контент контент контент контент контент контент контент</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="../common.qrc"/>
+ </resources>
+ <connections/>
+</ui>

+ 91 - 0
src/Legacy/gui/rusificationwidget.cpp

@@ -0,0 +1,91 @@
+#include "gui\rusificationwidget.h"
+#include "ui_rusificationwidget.h"
+#include "legacyapp.h"
+#include "rusificationtreeitem.h"
+
+void doStuffWithEveryItemInMyTree( QTreeWidgetItem *item )
+{
+    item->setCheckState(0, Qt::Checked);
+    for( int i = 0; i < item->childCount(); ++i )
+        doStuffWithEveryItemInMyTree( item->child(i) );
+}
+
+QTreeWidgetItem* findItemByName(QTreeWidgetItem* item, QString name) {
+    for (int i = 0; i < item->childCount(); i++) {
+        if (((RusificationTreeItem*)item->child(i))->name == name)
+            return item->child(i);
+
+        QTreeWidgetItem* found_item = findItemByName(item->child(i), name);
+        if (found_item)
+            return found_item;
+    }
+    return nullptr;
+}
+
+RusificationWidget::RusificationWidget(LegacyApp *_app, QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::RusificationWidget),
+    app(_app)
+{
+    ui->setupUi(this);
+    setupTreeWidget();
+
+    ui_update_timer.setInterval(500);
+    connect(&ui_update_timer, &QTimer::timeout, this, &RusificationWidget::updateUI);
+    ui_update_timer.start();
+}
+
+RusificationWidget::~RusificationWidget()
+{
+    delete ui;
+}
+
+void RusificationWidget::setupTreeWidget()
+{
+    connect(ui->treeWidget_title, &QTreeWidget::itemEntered, this, &RusificationWidget::onHoveredTreeItemChanged);
+
+    QSettings patch_list(qApp->applicationDirPath() + "/legacy_patches.ini", QSettings::IniFormat);
+    patch_list.setIniCodec("UTF-8");
+    ui->treeWidget_title->setMouseTracking(true);
+
+    foreach (const QString &group, patch_list.childGroups()) {
+        qDebug() << "Processing " << group << " patch item";
+
+        RusificationTreeItem* item = new RusificationTreeItem(group);
+        item->parseSettingsItem(patch_list);
+
+        QTreeWidgetItem* parent_item = findItemByName(ui->treeWidget_title->invisibleRootItem(), item->parent_name);
+        if (!parent_item)
+            parent_item = ui->treeWidget_title->invisibleRootItem();
+
+        parent_item->addChild(item);
+    }
+
+    ui->treeWidget_title->expandAll();
+    doStuffWithEveryItemInMyTree(ui->treeWidget_title->invisibleRootItem());
+}
+
+void RusificationWidget::onHoveredTreeItemChanged(QTreeWidgetItem *item, int column)
+{
+    RusificationTreeItem *tree_item = (RusificationTreeItem*)(item);
+    ui->patch_hint->setText("Патч: " + tree_item->title + "\nОписание: " + tree_item->description);
+}
+
+void RusificationWidget::updateUI()
+{
+    if (!qApp)
+        return;
+
+    QPoint pos = QCursor::pos();
+    QWidget *hovered = qApp->widgetAt(pos);
+    if (!hovered) {
+        ui->patch_hint->setText("No object!");
+    }
+
+    if (hovered) {
+        QWidget* parent = hovered->parentWidget();
+        if (parent && (hovered->objectName() != "qt_scrollarea_viewport"
+                       || parent->objectName() != "treeWidget_title"))
+            ui->patch_hint->setText(hovered->objectName() + "\n" + parent->objectName());
+    }
+}

+ 37 - 0
src/Legacy/gui/rusificationwidget.h

@@ -0,0 +1,37 @@
+#ifndef RUSIFICATIONWIDGET_H
+#define RUSIFICATIONWIDGET_H
+
+#include <QWidget>
+#include <QTimer>
+#include <QTreeWidgetItem>
+
+namespace Ui {
+class RusificationWidget;
+}
+
+class LegacyApp;
+
+class RusificationWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit RusificationWidget(LegacyApp *_app, QWidget *parent = 0);
+
+    ~RusificationWidget();
+
+private:
+    void setupTreeWidget();
+
+private slots:
+    void onHoveredTreeItemChanged(QTreeWidgetItem *item, int column);
+
+    void updateUI();
+
+private:
+    Ui::RusificationWidget *ui;
+    LegacyApp *app;
+    QTimer ui_update_timer;
+};
+
+#endif // RUSIFICATIONWIDGET_H

+ 345 - 0
src/Legacy/gui/rusificationwidget.ui

@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>RusificationWidget</class>
+ <widget class="QWidget" name="RusificationWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>860</width>
+    <height>491</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">QLabel, QRadioButton, QCheckBox {
+	color: white;
+}</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_4">
+   <item row="0" column="0">
+    <widget class="QWidget" name="left_column_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Ignored">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="minimumSize">
+      <size>
+       <width>350</width>
+       <height>0</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QTreeWidget" name="treeWidget_title">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="mouseTracking">
+         <bool>true</bool>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">QTreeWidget{
+border-radius: 20px;
+color: rgb(255, 255, 255);
+background-color: rgba(255, 255, 255, 0);
+}
+QScrollBar:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     width: 10px;
+     margin: 22px 0 22px 0;
+ }
+
+ QScrollBar::handle:vertical {
+	background-color: rgba(129, 129, 129, 150);	
+    min-height: 10px;
+	border-radius: 5px;
+ }
+ QScrollBar::add-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: bottom;
+     subcontrol-origin: margin;
+ }
+
+ QScrollBar::sub-line:vertical {
+     border: 0px solid grey;
+     background: transparent;
+     height: 1px;
+     subcontrol-position: top;
+     subcontrol-origin: margin;
+ }
+ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {
+     border: 0px;
+     width: 3px;
+     height: 3px;
+     background: transparent;
+ }
+
+ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {
+     background: none;
+ }
+
+QTreeView::branch:closed:has-children{
+	width: 16px;
+	height: 16px;
+	image: url(:/assets/buttons/right_plus.png);
+}
+
+QTreeView::branch:open:has-children{
+	width: 16px;
+	height: 16px;
+	image: url(:/assets/buttons/down_minus.png);
+}
+</string>
+        </property>
+        <property name="frameShape">
+         <enum>QFrame::NoFrame</enum>
+        </property>
+        <property name="verticalScrollBarPolicy">
+         <enum>Qt::ScrollBarAsNeeded</enum>
+        </property>
+        <property name="editTriggers">
+         <set>QAbstractItemView::EditKeyPressed</set>
+        </property>
+        <property name="showDropIndicator" stdset="0">
+         <bool>false</bool>
+        </property>
+        <property name="alternatingRowColors">
+         <bool>false</bool>
+        </property>
+        <property name="selectionMode">
+         <enum>QAbstractItemView::NoSelection</enum>
+        </property>
+        <property name="verticalScrollMode">
+         <enum>QAbstractItemView::ScrollPerItem</enum>
+        </property>
+        <property name="autoExpandDelay">
+         <number>0</number>
+        </property>
+        <property name="indentation">
+         <number>20</number>
+        </property>
+        <property name="rootIsDecorated">
+         <bool>false</bool>
+        </property>
+        <property name="uniformRowHeights">
+         <bool>false</bool>
+        </property>
+        <property name="itemsExpandable">
+         <bool>true</bool>
+        </property>
+        <property name="animated">
+         <bool>true</bool>
+        </property>
+        <property name="allColumnsShowFocus">
+         <bool>false</bool>
+        </property>
+        <property name="headerHidden">
+         <bool>true</bool>
+        </property>
+        <property name="expandsOnDoubleClick">
+         <bool>false</bool>
+        </property>
+        <attribute name="headerVisible">
+         <bool>false</bool>
+        </attribute>
+        <column>
+         <property name="text">
+          <string>Устанавливаемые элементы</string>
+         </property>
+         <property name="background">
+          <color alpha="0">
+           <red>0</red>
+           <green>0</green>
+           <blue>0</blue>
+          </color>
+         </property>
+         <property name="foreground">
+          <brush brushstyle="NoBrush">
+           <color alpha="0">
+            <red>0</red>
+            <green>0</green>
+            <blue>0</blue>
+           </color>
+          </brush>
+         </property>
+        </column>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QWidget" name="right_column_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="1" colspan="2">
+       <widget class="QWidget" name="widget_2" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">QWidget#widget_2 {
+border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);
+color:rgb(255,255,255);
+}</string>
+        </property>
+        <layout class="QGridLayout" name="gridLayout_3">
+         <item row="1" column="0">
+          <widget class="QLabel" name="label_3">
+           <property name="minimumSize">
+            <size>
+             <width>100</width>
+             <height>100</height>
+            </size>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">background-color:none;</string>
+           </property>
+           <property name="text">
+            <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;img src=&quot;:/assets/teksty-photo-normal.png&quot; width=&quot;100&quot; height=&quot;100&quot;/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QTextBrowser" name="patch_hint">
+           <property name="styleSheet">
+            <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 0);
+color:rgb(255,255,255);
+</string>
+           </property>
+           <property name="html">
+            <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Ставьте или убирайте галочки в пунктах меню слева, чтобы включить или отключить фрагмент русификации.&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Для включения некоторых фрагментов потребуется дополнительная загрузка данных&lt;/span&gt;&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:8pt;&quot;&gt;Чтобы применить изменения, нажмите кнопку &amp;quot;Применить&amp;quot;. &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+           </property>
+          </widget>
+         </item>
+         <item row="0" column="0" colspan="2">
+          <widget class="QLabel" name="label_2_title">
+           <property name="font">
+            <font>
+             <family>Times New Roman</family>
+             <pointsize>12</pointsize>
+             <weight>75</weight>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">background:none</string>
+           </property>
+           <property name="text">
+            <string>Подсказка</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item row="1" column="1" colspan="2">
+       <spacer name="verticalSpacer_2">
+        <property name="orientation">
+         <enum>Qt::Vertical</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>321</width>
+          <height>18</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="2" column="1" colspan="2">
+       <widget class="QWidget" name="widget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>132</width>
+             <height>57</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="pushButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>160</width>
+             <height>60</height>
+            </size>
+           </property>
+           <property name="text">
+            <string>ПРИМЕНИТЬ</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 166 - 0
src/Legacy/gui/settingswidget.cpp

@@ -0,0 +1,166 @@
+#include "gui\settingswidget.h"
+#include "ui_settingswidget.h"
+#include "legacyapp.h"
+#include "filesystem.h"
+
+#include <QDebug>
+#include <QFileDialog>
+#include <QMessageBox>
+
+
+SettingsWidget::SettingsWidget(LegacyApp *_app, QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::SettingsWidget),
+    app(_app)
+{
+    ui->setupUi(this);
+
+    ui_update_timer.setInterval(500);
+    connect(&ui_update_timer, &QTimer::timeout, this, &SettingsWidget::updateUI);
+    ui_update_timer.start();
+}
+
+SettingsWidget::~SettingsWidget()
+{
+    ui_update_timer.stop();
+    delete ui;
+}
+
+void SettingsWidget::updateUI()
+{
+    if (!qApp)
+        return;
+
+    QString path = app->properties.value("settings/lotro_folder", "(не выбрана)").toString();
+    ui->folder_value_common->setText(path);
+
+    ui->data_protection_checkbox_common->setChecked(app->properties.value("settings/data_protection", 1).toBool());
+    ui->restore_checkbox_common->setChecked(app->properties.value("settings/auto_restore", 1).toBool());
+    ui->download_updates_checkbox_common->setChecked(app->properties.value("settings/download_updates", 1).toBool());
+    ui->expert_tabs_checkbox_common->setChecked(app->properties.value("settings/expert_mode", 0).toBool());
+    ui->restrict_download_speed_checkbox_common->setChecked(app->properties.value("settings/limit_download_speed", 0).toBool());
+    ui->download_restrict_slider->setValue(app->properties.value("settings/download_speed", 64).toInt());
+
+    if (app->properties.value("settings/expert_mode", 0).toBool()) {
+        ui->management_widget->show();
+        ui->data_protection_checkbox_common->show();
+        ui->restore_checkbox_common->show();
+    } else {
+        ui->management_widget->hide();
+        ui->data_protection_checkbox_common->hide();
+        ui->restore_checkbox_common->hide();
+    }
+
+    int locale_index = 0;
+    QString value = app->properties.value("settings/locale", "English").toString();
+
+    if (value == "English")
+        locale_index = 0;
+    if (value == "DE")
+        locale_index = 1;
+    if (value == "FR")
+        locale_index = 2;
+
+    ui->lotro_patch_language_combobox_common->setCurrentIndex(locale_index);
+}
+
+void SettingsWidget::on_download_restrict_slider_valueChanged(int value)
+{
+    if (value >= 1024) {
+        double new_value = double(value) / 1024;
+        ui->download_speed_label_common->setText(QString::number(new_value, 'g', 2) + " Мб/с");
+    } else {
+        ui->download_speed_label_common->setText(QString::number(value) + " Кб/с");
+    }
+    app->properties.setValue("settings/download_speed", value);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_interface_scale_combobox_common_currentIndexChanged(const QString &arg1)
+{
+    int value = arg1.left(arg1.length() - 1).toInt();
+    app->window.changeFontSizeRecursive(value, &app->window);
+    app->window.resize(900 * value / 100, 650 * value / 100);
+    app->properties.setValue("settings/ui_scale", value);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_change_folder_button_clicked()
+{
+    QStringList known_paths = FileSystem::recognizeRegistryLotroPath();
+    QString template_path = known_paths.size() > 0 ? known_paths[0] : "";
+    QString str = QFileDialog::getOpenFileName(0, "Расположение игры", template_path, "LotroLauncher.exe");
+    QString path = str.replace("/LotroLauncher.exe", "").replace("\\", "/").replace("//", "/");
+
+    if (!FileSystem::fileExists(path + "/LotroLauncher.exe")) {
+        QMessageBox error_box("Ошибка!", "Похоже, указана неверная папка с игрой. Не могу найти файл LotroLauncher.exe",
+                              QMessageBox::Critical, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton);
+
+        return;
+    }
+
+    if (!FileSystem::fileExists(path + "/client_local_English.dat")) {
+        QMessageBox pmbx("Файл данных не найден",
+                         "Файл данных client_local_English.dat не обнаружен в папке с игрой. Запустить лаунчер игры с целью скачать недостающие данные?",
+                         QMessageBox::Warning,
+                         QMessageBox::Yes,
+                         QMessageBox::No,
+                         QMessageBox::NoButton);
+
+        if (pmbx.exec() == QMessageBox::Yes) {
+            // Start LotRO;
+            return;
+        } else {
+            // Set status Файл данных не найден
+        }
+    }
+
+    app->properties.setValue("settings/lotro_folder", path);
+    app->properties.sync();
+    ui->folder_value_common->setText(path);
+}
+
+void SettingsWidget::on_data_protection_checkbox_common_stateChanged(int arg1)
+{
+    app->properties.setValue("settings/data_protection", arg1);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_restore_checkbox_common_stateChanged(int arg1)
+{
+    app->properties.setValue("settings/auto_restore", arg1);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_download_updates_checkbox_common_stateChanged(int arg1)
+{
+    app->properties.setValue("settings/download_updates", arg1);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_expert_tabs_checkbox_common_stateChanged(int arg1)
+{
+    app->properties.setValue("settings/expert_mode", arg1);
+    app->properties.sync();
+}
+
+void SettingsWidget::on_restrict_download_speed_checkbox_common_stateChanged(int arg1)
+{
+    app->properties.setValue("settings/limit_download_speed", arg1);
+    app->properties.sync();
+}
+
+
+void SettingsWidget::on_lotro_patch_language_combobox_common_activated(int index)
+{
+    QString value = "";
+    if (index == 0)
+        value = "English";
+    if (index == 1)
+        value = "DE";
+    if (index == 2)
+        value = "FR";
+
+    app->properties.setValue("settings/locale", value);
+    app->properties.sync();
+}

+ 48 - 0
src/Legacy/gui/settingswidget.h

@@ -0,0 +1,48 @@
+#ifndef SETTINGSWIDGET_H
+#define SETTINGSWIDGET_H
+
+#include <QWidget>
+#include <QTimer>
+
+namespace Ui {
+class SettingsWidget;
+}
+
+class LegacyApp;
+
+class SettingsWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit SettingsWidget(LegacyApp *_app, QWidget *parent = 0);
+    ~SettingsWidget();
+
+private slots:
+    void updateUI();
+
+    void on_download_restrict_slider_valueChanged(int value);
+
+    void on_interface_scale_combobox_common_currentIndexChanged(const QString &arg1);
+
+    void on_change_folder_button_clicked();
+
+    void on_data_protection_checkbox_common_stateChanged(int arg1);
+
+    void on_restore_checkbox_common_stateChanged(int arg1);
+
+    void on_download_updates_checkbox_common_stateChanged(int arg1);
+
+    void on_expert_tabs_checkbox_common_stateChanged(int arg1);
+
+    void on_restrict_download_speed_checkbox_common_stateChanged(int arg1);
+
+    void on_lotro_patch_language_combobox_common_activated(int index);
+
+private:
+    Ui::SettingsWidget *ui;
+    LegacyApp *app;
+    QTimer ui_update_timer;
+};
+
+#endif // SETTINGSWIDGET_H

+ 660 - 0
src/Legacy/gui/settingswidget.ui

@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsWidget</class>
+ <widget class="QWidget" name="SettingsWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>860</width>
+    <height>491</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">color: white;</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <property name="horizontalSpacing">
+    <number>0</number>
+   </property>
+   <property name="verticalSpacing">
+    <number>10</number>
+   </property>
+   <item row="3" column="1">
+    <widget class="QWidget" name="standart_settings_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout">
+      <property name="spacing">
+       <number>11</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="main_settings_title">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Основные</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="data_protection_checkbox_common">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Включить защиту данных русификации при обновлении игры</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="restore_checkbox_common">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Включить авто-восстановление из резервной копии в случае поломки</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="download_updates_checkbox_common">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Включить авто-скачивание обновлений русификации</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QCheckBox" name="expert_tabs_checkbox_common">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Показывать дополнительные опции</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="widget_3" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>33</height>
+         </size>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QCheckBox" name="restrict_download_speed_checkbox_common">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">
+background-color: none;</string>
+           </property>
+           <property name="text">
+            <string>Ограничивать скорость скачивания</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QSlider" name="download_restrict_slider">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>200</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">
+background-color: none;</string>
+           </property>
+           <property name="minimum">
+            <number>64</number>
+           </property>
+           <property name="maximum">
+            <number>4096</number>
+           </property>
+           <property name="singleStep">
+            <number>64</number>
+           </property>
+           <property name="pageStep">
+            <number>64</number>
+           </property>
+           <property name="value">
+            <number>64</number>
+           </property>
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="download_speed_label_common">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">
+background-color: none;</string>
+           </property>
+           <property name="text">
+            <string>64 Кб/с</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QWidget" name="management_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_3">
+      <property name="spacing">
+       <number>11</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="management_title">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Управление</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="patch_all_button_common">
+        <property name="styleSheet">
+         <string notr="true">QPushButton {
+	color: black;
+    border: 2px solid #8f8f91;
+    border-radius: 6px;
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #f6f7fa, stop: 1 #dadbde);
+    min-width: 80px;
+}
+ 
+QPushButton:pressed {
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #caccd3, stop: 1 #f6f7fa);
+}
+ 
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+ 
+QPushButton:default {
+    border-color: navy; /* make the default button prominent */
+}</string>
+        </property>
+        <property name="text">
+         <string>Установить все патчи заново</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="restore_button_common">
+        <property name="autoFillBackground">
+         <bool>false</bool>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">QPushButton {
+	color: black;
+    border: 2px solid #8f8f91;
+    border-radius: 6px;
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #f6f7fa, stop: 1 #dadbde);
+    min-width: 80px;
+}
+ 
+QPushButton:pressed {
+    background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                      stop: 0 #caccd3, stop: 1 #f6f7fa);
+}
+ 
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+ 
+QPushButton:default {
+    border-color: navy; /* make the default button prominent */
+}</string>
+        </property>
+        <property name="text">
+         <string>Восстановить данные из резервной копии</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <widget class="QWidget" name="widget_2" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="interface_label_title">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Внешний вид:</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="widget_4" native="true">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="interface_scale_common">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Масштаб интерфейса:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="interface_scale_combobox_common">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>80</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">color: black;</string>
+           </property>
+           <property name="currentIndex">
+            <number>2</number>
+           </property>
+           <item>
+            <property name="text">
+             <string>50%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>75%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>100%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>125%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>150%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>175%</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>200%</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QWidget" name="game_folder_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">QWidget#game_folder_widget{
+	border-radius: 20px;
+	background-color: rgba(30, 0, 0, 100);
+}</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="folder_label_common">
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>Папка с данными игры:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="2">
+       <widget class="QPushButton" name="change_folder_button">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>36</width>
+          <height>32</height>
+         </size>
+        </property>
+        <property name="cursor">
+         <cursorShape>PointingHandCursor</cursorShape>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">border-image: url(:/assets/buttons/folder.png);
+
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLabel" name="folder_value_common">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">
+background-color: none;</string>
+        </property>
+        <property name="text">
+         <string>(не выбрана)</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0" colspan="3">
+       <widget class="QWidget" name="widget_5" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>30</height>
+         </size>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="label_common">
+           <property name="text">
+            <string>Какую версию игры локализовать?</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="lotro_patch_language_combobox_common">
+           <property name="styleSheet">
+            <string notr="true">color: black;</string>
+           </property>
+           <item>
+            <property name="text">
+             <string>Английскую</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Немецкую</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Французскую</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_4">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="5" column="1">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="1" column="0" rowspan="5">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Preferred</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>100</width>
+       <height>436</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="1" column="2" rowspan="5">
+    <spacer name="horizontalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Preferred</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>100</width>
+       <height>436</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 15 - 0
src/Legacy/gui/statuswidget.cpp

@@ -0,0 +1,15 @@
+#include "statuswidget.h"
+#include "ui_statuswidget.h"
+
+StatusWidget::StatusWidget(LegacyApp *_app, QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::StatusWidget),
+    app(_app)
+{
+    ui->setupUi(this);
+}
+
+StatusWidget::~StatusWidget()
+{
+    delete ui;
+}

+ 34 - 0
src/Legacy/gui/statuswidget.h

@@ -0,0 +1,34 @@
+#ifndef STATUSWIDGET_H
+#define STATUSWIDGET_H
+
+#include <QWidget>
+
+namespace Ui {
+class StatusWidget;
+}
+
+class LegacyApp;
+
+class StatusWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit StatusWidget(LegacyApp *_app, QWidget *parent = 0);
+    ~StatusWidget();
+
+private:
+    Ui::StatusWidget *ui;
+    LegacyApp *app;
+
+    const QColor inWorkColor = QColor(85, 170, 255);
+    const QColor readyColor = QColor(0, 170, 0);
+    const QColor errorColor = QColor(255, 85, 0);
+
+    const QString inWorkIconStyle = "image: url(:/assets/info.png);";
+    const QString readyIconStyle = "image: url(:/assets/ok.png);";
+    const QString criticalIconStyle = "image: url(:/assets/critical.png);";
+    const QString warningIconStyle = "image: url(:/assets/warning.png);";
+};
+
+#endif // STATUSWIDGET_H

+ 508 - 0
src/Legacy/gui/statuswidget.ui

@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StatusWidget</class>
+ <widget class="QWidget" name="StatusWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>860</width>
+    <height>491</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_3" rowstretch="1,0,4">
+   <item row="0" column="1">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Expanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="1">
+    <spacer name="verticalSpacer_2">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>20</width>
+       <height>40</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="0" column="2" rowspan="3">
+    <widget class="QWidget" name="right_column_widget" native="true">
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="1" column="0">
+       <spacer name="horizontalSpacer_3">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>219</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="0" column="0" colspan="2">
+       <widget class="QWidget" name="common_status_widget" native="true">
+        <property name="styleSheet">
+         <string notr="true"/>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <item>
+          <widget class="QWidget" name="backup_status" native="true">
+           <property name="styleSheet">
+            <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_4">
+            <item>
+             <widget class="QLabel" name="label_4_common">
+              <property name="font">
+               <font>
+                <family>Trajan Pro 3</family>
+                <pointsize>8</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>РЕЗЕРВНАЯ КОПИЯ:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_5_common">
+              <property name="font">
+               <font>
+                <family>Trebuchet MS</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(85, 170, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>Создание... 50%</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QWidget" name="backup_help" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>30</width>
+                <height>30</height>
+               </size>
+              </property>
+              <property name="mouseTracking">
+               <bool>true</bool>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">border-image: url(:/assets/question.png); color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QWidget" name="download_status" native="true">
+           <property name="styleSheet">
+            <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_5">
+            <item>
+             <widget class="QLabel" name="label_8_common">
+              <property name="font">
+               <font>
+                <family>Trajan Pro 3</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>ЗАГРУЗКА:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_9_common">
+              <property name="font">
+               <font>
+                <family>Trebuchet MS</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(0, 170, 0); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>Все данные загружены</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QWidget" name="download_help" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>30</width>
+                <height>30</height>
+               </size>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">border-image: url(:/assets/question.png); color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QWidget" name="rusification_status" native="true">
+           <property name="styleSheet">
+            <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_6">
+            <item>
+             <widget class="QLabel" name="label_2_common">
+              <property name="font">
+               <font>
+                <family>Trajan Pro 3</family>
+                <pointsize>8</pointsize>
+                <weight>50</weight>
+                <bold>false</bold>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>РУСИФИКАЦИЯ:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_3_common">
+              <property name="font">
+               <font>
+                <family>Trebuchet MS</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(85, 170, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>Установка... (1/5) 50%</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QWidget" name="rusification_help" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>30</width>
+                <height>30</height>
+               </size>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">border-image: url(:/assets/question.png); color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QWidget" name="protection_status" native="true">
+           <property name="styleSheet">
+            <string notr="true">border-radius: 20px;
+background-color: rgba(30, 0, 0, 100);</string>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_7">
+            <item>
+             <widget class="QLabel" name="label_6_common">
+              <property name="font">
+               <font>
+                <family>Trajan Pro 3</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>ЗАЩИТА ИГРОВЫХ ДАННЫХ:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_7_common">
+              <property name="font">
+               <font>
+                <family>Trebuchet MS</family>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">color: rgb(255, 85, 0); background-color:none;</string>
+              </property>
+              <property name="text">
+               <string>Выключена</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QWidget" name="protection_help" native="true">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="minimumSize">
+               <size>
+                <width>30</width>
+                <height>30</height>
+               </size>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">border-image: url(:/assets/question.png); color: rgb(255, 255, 255); background-color:none;</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QWidget" name="buttons_widget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>80</height>
+         </size>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">background-color: rgb(0, 0, 84);</string>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout" stretch="1">
+         <property name="spacing">
+          <number>1</number>
+         </property>
+         <property name="leftMargin">
+          <number>1</number>
+         </property>
+         <property name="topMargin">
+          <number>1</number>
+         </property>
+         <property name="rightMargin">
+          <number>1</number>
+         </property>
+         <property name="bottomMargin">
+          <number>1</number>
+         </property>
+         <item>
+          <widget class="QPushButton" name="game_button">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>150</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="maximumSize">
+            <size>
+             <width>180</width>
+             <height>16777215</height>
+            </size>
+           </property>
+           <property name="font">
+            <font>
+             <family>Times New Roman</family>
+             <pointsize>-1</pointsize>
+             <weight>75</weight>
+             <italic>false</italic>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="autoFillBackground">
+            <bool>false</bool>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">border-image: url(:/assets/buttons/gray-button-hi.png);
+color: rgb(85, 0, 0);
+font: 24px &quot;Times New Roman&quot;;
+font-weight: bold;</string>
+           </property>
+           <property name="text">
+            <string notr="true">    ИГРАТЬ    </string>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>0</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="default">
+            <bool>false</bool>
+           </property>
+           <property name="flat">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QWidget" name="left_column_widget" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <item>
+       <widget class="QWidget" name="status_image_widget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>200</width>
+          <height>200</height>
+         </size>
+        </property>
+        <property name="baseSize">
+         <size>
+          <width>200</width>
+          <height>200</height>
+         </size>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">image: url(:/assets/status/info.png);</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QWidget" name="status_label_widget" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>0</width>
+          <height>40</height>
+         </size>
+        </property>
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <widget class="QLabel" name="status_label_supertitle">
+           <property name="font">
+            <font>
+             <family>Times New Roman</family>
+             <pointsize>28</pointsize>
+             <weight>75</weight>
+             <italic>false</italic>
+             <bold>true</bold>
+            </font>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">color: rgb(85, 170, 255);
+</string>
+           </property>
+           <property name="text">
+            <string>В РАБОТЕ</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignHCenter|Qt::AlignTop</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <spacer name="horizontalSpacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::Fixed</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>40</width>
+       <height>20</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 14 - 0
src/Legacy/legacy_plugin_import.cpp

@@ -0,0 +1,14 @@
+// This file is autogenerated by qmake. It imports static plugin classes for
+// static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS.<plugin> variables.
+#include <QtPlugin>
+Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin)
+Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)
+Q_IMPORT_PLUGIN(QGifPlugin)
+Q_IMPORT_PLUGIN(QICNSPlugin)
+Q_IMPORT_PLUGIN(QICOPlugin)
+Q_IMPORT_PLUGIN(QJpegPlugin)
+Q_IMPORT_PLUGIN(QTgaPlugin)
+Q_IMPORT_PLUGIN(QTiffPlugin)
+Q_IMPORT_PLUGIN(QWbmpPlugin)
+Q_IMPORT_PLUGIN(QWebpPlugin)
+Q_IMPORT_PLUGIN(QGenericEnginePlugin)

+ 26 - 0
src/Legacy/object_script.Legacy.Debug

@@ -0,0 +1,26 @@
+INPUT(
+./..\..\build\debug\Legacy\rcc\qrc_backgrounds.o
+./..\..\build\debug\Legacy\rcc\qrc_common.o
+./..\..\build\debug\Legacy\obj\main.o
+./..\..\build\debug\Legacy\obj\mainwindow.o
+./..\..\build\debug\Legacy\obj\menuentry.o
+./..\..\build\debug\Legacy\obj\legacyapp.o
+./..\..\build\debug\Legacy\obj\filesystem.o
+./..\..\build\debug\Legacy\obj\statuswidget.o
+./..\..\build\debug\Legacy\obj\rusificationwidget.o
+./..\..\build\debug\Legacy\obj\settingswidget.o
+./..\..\build\debug\Legacy\obj\newswidget.o
+./..\..\build\debug\Legacy\obj\helpwidget.o
+./..\..\build\debug\Legacy\obj\networkdownloader.o
+./..\..\build\debug\Legacy\obj\rusificationtreeitem.o
+./..\..\build\debug\Legacy\obj\moc_mainwindow.o
+./..\..\build\debug\Legacy\obj\moc_menuentry.o
+./..\..\build\debug\Legacy\obj\moc_legacyapp.o
+./..\..\build\debug\Legacy\obj\moc_filesystem.o
+./..\..\build\debug\Legacy\obj\moc_statuswidget.o
+./..\..\build\debug\Legacy\obj\moc_rusificationwidget.o
+./..\..\build\debug\Legacy\obj\moc_settingswidget.o
+./..\..\build\debug\Legacy\obj\moc_newswidget.o
+./..\..\build\debug\Legacy\obj\moc_helpwidget.o
+./..\..\build\debug\Legacy\obj\moc_networkdownloader.o
+);

+ 24 - 0
src/Legacy/object_script.Legacy.Release

@@ -0,0 +1,24 @@
+INPUT(
+./..\..\build\release\Legacy\obj\main.o
+./..\..\build\release\Legacy\obj\mainwindow.o
+./..\..\build\release\Legacy\obj\menuentry.o
+./..\..\build\release\Legacy\obj\legacyapp.o
+./..\..\build\release\Legacy\obj\filesystem.o
+./..\..\build\release\Legacy\obj\statuswidget.o
+./..\..\build\release\Legacy\obj\rusificationwidget.o
+./..\..\build\release\Legacy\obj\settingswidget.o
+./..\..\build\release\Legacy\obj\newswidget.o
+./..\..\build\release\Legacy\obj\helpwidget.o
+./..\..\build\release\Legacy\obj\networkdownloader.o
+./..\..\build\release\Legacy\obj\rusificationtreeitem.o
+./..\..\build\release\Legacy\obj\moc_mainwindow.o
+./..\..\build\release\Legacy\obj\moc_menuentry.o
+./..\..\build\release\Legacy\obj\moc_legacyapp.o
+./..\..\build\release\Legacy\obj\moc_filesystem.o
+./..\..\build\release\Legacy\obj\moc_statuswidget.o
+./..\..\build\release\Legacy\obj\moc_rusificationwidget.o
+./..\..\build\release\Legacy\obj\moc_settingswidget.o
+./..\..\build\release\Legacy\obj\moc_newswidget.o
+./..\..\build\release\Legacy\obj\moc_helpwidget.o
+./..\..\build\release\Legacy\obj\moc_networkdownloader.o
+);

+ 80 - 0
src/Legacy/src/filesystem.cpp

@@ -0,0 +1,80 @@
+#include "filesystem.h"
+#include <QDebug>
+#include <QSettings>
+
+bool FileSystem::fileExists(QString path) {
+    QFileInfo check_file(path);
+    bool exists = check_file.exists() && check_file.isFile();
+    if (exists == false)
+        qWarning("%s:%i: %s%s", __FILE__, __LINE__, "Файл не найден: ", path.toStdString().c_str());
+    else
+        qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Файл найден: ", path.toStdString().c_str());
+    return exists;
+}
+
+QString FileSystem::fileHash(const QString &fileName, QCryptographicHash::Algorithm hashAlgorithm){
+    QFile file(fileName);
+    if (file.open(QIODevice::ReadOnly)) {
+        QByteArray fileData = file.readAll();
+        QByteArray hashData = QCryptographicHash::hash(fileData, hashAlgorithm);
+        return hashData.toHex();
+    }
+    return QByteArray();
+}
+
+void FileSystem::clearFolder(QDir &dir){
+    //Получаем список файлов
+    QStringList lstFiles = dir.entryList(QDir::Files);
+
+    //Удаляем файлы
+    foreach (QString entry, lstFiles){
+        QString entryAbsPath = dir.absolutePath() + "/" + entry;
+        //QFile::setPermissions(entryAbsPath, QFile::ReadOwner | QFile::WriteOwner);
+        qDebug() << dir.absolutePath();
+        QFile::remove(entryAbsPath);
+    }
+}
+
+QStringList FileSystem::recognizeRegistryLotroPath()
+{
+    QStringList paths;
+
+    #ifdef _WIN32
+        // Windows 8, 10
+        QSettings n("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\12bbe590-c890-11d9-9669-0800200c9a66_is1", QSettings::NativeFormat);
+        foreach (QString key, n.allKeys()) {
+            qDebug() << key;
+            if(key.contains("InstallLocation") || key.contains("installlocation")){
+                QString folder = n.value(key).toString()
+                        .replace("\\", "/")
+                        .replace("/TurbineLauncher.exe", "")
+                        .replace("/LotroLauncher.exe", "")
+                        .replace("\"", "");
+
+                if(FileSystem::fileExists(folder + "/LotroLauncher.exe"))
+                    paths.append(folder);
+            }
+        }
+
+
+        // Windows 7
+        QSettings m("HKEY_CLASSES_ROOT\\Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache", QSettings::NativeFormat);
+        foreach (QString key, m.allKeys()) {
+          if((key.contains("TurbineLauncher.exe") || key.contains("LotroLauncher.exe")) && FileSystem::fileExists(key)){
+              QString folder = n.value(key).toString()
+                      .replace("\\", "/")
+                      .replace("/TurbineLauncher.exe", "")
+                      .replace("/LotroLauncher.exe", "")
+                      .replace("\"", "");
+
+              if(FileSystem::fileExists(folder + "/LotroLauncher.exe"))
+                  paths.append(folder);
+          }
+        }
+    #else
+        // Реализация под Linux
+    #endif
+
+    return paths;
+
+}

+ 26 - 0
src/Legacy/src/filesystem.h

@@ -0,0 +1,26 @@
+#ifndef FILESYSTEM_H
+#define FILESYSTEM_H
+
+#include <QObject>
+#include <QFile>
+#include <QDir>
+#include <QFileInfo>
+#include <QCryptographicHash>
+
+class FileSystem : public QObject
+{
+    Q_OBJECT
+private:
+    explicit FileSystem(QObject *parent = nullptr);
+
+public:
+    static bool fileExists(QString path);
+    static QString fileHash(const QString &fileName, QCryptographicHash::Algorithm hashAlgorithm);
+    static void clearFolder(QDir &dir);
+    static QStringList recognizeRegistryLotroPath();
+signals:
+
+public slots:
+};
+
+#endif // FILESYSTEM_H

+ 47 - 0
src/Legacy/src/legacyapp.cpp

@@ -0,0 +1,47 @@
+#include "legacyapp.h"
+#include "filesystem.h"
+
+#include <QtConcurrent/QtConcurrent>
+#include <QFontDatabase>
+
+LegacyApp::LegacyApp(QObject *parent) : QObject(parent), window(this),
+    client_local_dat(), client_local_dat_busy(false),
+    properties(qApp->applicationDirPath() + "/legacy_v2.ini", QSettings::IniFormat)
+{
+    properties.setIniCodec("UTF-8");
+}
+
+void LegacyApp::Init()
+{
+    QResource::registerResource(QApplication::applicationDirPath() + "/data01.gtr");
+    QResource::registerResource(QApplication::applicationDirPath() + "/data02.gtr");
+
+    QFontDatabase::addApplicationFont(":/assets/fonts/trajan.ttf");
+    QFontDatabase::addApplicationFont(":/assets/fonts/viking.ttf");
+    QFontDatabase::addApplicationFont(":/assets/fonts/title.ttf");
+
+
+    window.Init();
+    StartDatFilesInitialisation();
+}
+
+void LegacyApp::StartDatFilesInitialisation()
+{
+    QString lotro_dir_path = properties.value("settings/lotro_folder", "none").toString();
+    QString locale = properties.value("lotro/locale", "English").toString();
+
+    qDebug() << "Initialising file " << lotro_dir_path + "/client_local_" + locale + ".dat";
+
+    QtConcurrent::run([this, lotro_dir_path, locale](){
+        if (client_local_dat_busy == false) {
+            client_local_dat_busy = true;
+            client_local_dat.Initialise((lotro_dir_path + "/client_local_" + locale + ".dat").toStdString(), 0);
+            client_local_dat_busy = false;
+        }
+    });
+}
+
+void LegacyApp::DownloadFinished()
+{
+    // TODO
+}

+ 47 - 0
src/Legacy/src/legacyapp.h

@@ -0,0 +1,47 @@
+#ifndef LEGACYAPP_H
+#define LEGACYAPP_H
+
+#include <QObject>
+#include <QSettings>
+#include <QApplication>
+
+#include <queue>
+
+#include "mainwindow.h"
+#include <LotroDat/LotroDat.h>
+
+class MainWindow;
+class NetworkDownloader;
+
+class LegacyApp : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit LegacyApp(QObject *parent = nullptr);
+
+    void Init();
+
+private:
+    void StartDatFilesInitialisation();
+
+signals:
+
+private slots:
+    void DownloadFinished();
+
+
+public:
+    MainWindow window;
+
+    LOTRO_DAT::DatFile client_local_dat;
+    std::queue<QString> patch_databases_queue;
+    bool client_local_dat_busy;
+
+    QSettings properties;
+
+    NetworkDownloader* dowloader;
+    std::queue<std::pair<QString, QString>> download_queue;
+};
+
+#endif // LEGACYAPP_H

+ 22 - 0
src/Legacy/src/main.cpp

@@ -0,0 +1,22 @@
+#include <QApplication>
+#include <QMessageBox>
+#include <QLockFile>
+#include <QDir>
+#include "legacyapp.h"
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    QLockFile lockFile(QDir::temp().absoluteFilePath("rulotro.lock"));
+    if(!lockFile.tryLock(1)){
+        QMessageBox msgBox;
+        msgBox.setIcon(QMessageBox::Warning);
+        msgBox.setText("Приложение уже запущено.\nРазрешено запускать только один экземпляр приложения.");
+        msgBox.exec();
+        return 1;
+    }
+
+    LegacyApp app;
+    app.Init();
+    return a.exec();
+}

+ 59 - 0
src/Legacy/src/menuentry.cpp

@@ -0,0 +1,59 @@
+#include "menuentry.h"
+#include <QApplication>
+#include <QTimer>
+
+MenuEntry *MenuEntry::active_label = nullptr;
+MenuEntry *MenuEntry::hover_label = nullptr;
+
+MenuEntry::MenuEntry(QWidget* parent, Qt::WindowFlags)
+    : QLabel(parent) {
+
+    connect(this, &MenuEntry::clicked, this, &MenuEntry::on_clicked);
+}
+
+MenuEntry::~MenuEntry() {}
+
+MenuEntry *MenuEntry::getActiveLabel()
+{
+    return active_label;
+}
+
+void MenuEntry::setActiveLabel(MenuEntry *label)
+{
+    active_label = label;
+}
+
+MenuEntry *MenuEntry::getHoverLabel()
+{
+    return hover_label;
+}
+
+void MenuEntry::setHoverLabel(MenuEntry *label)
+{
+    hover_label = label;
+}
+
+void MenuEntry::mousePressEvent(QMouseEvent* event) {
+    event->accept();
+    if (active_label != this) {
+        active_label = this;
+        emit active_label_changed();
+        emit clicked();
+    }
+}
+
+void MenuEntry::mouseMoveEvent(QMouseEvent *)
+{
+    if (hover_label != this) {
+        hover_label = this;
+        emit hover_label_changed();
+    }
+}
+
+void MenuEntry::on_clicked()
+{
+    setStyleSheet(active_stylesheet);
+    QTimer::singleShot(200, [this](){
+        setStyleSheet(default_stylesheet);
+    });
+}

+ 39 - 0
src/Legacy/src/menuentry.h

@@ -0,0 +1,39 @@
+#ifndef CLICKABLELABEL_H
+#define CLICKABLELABEL_H
+
+#include <QObject>
+#include <QWidget>
+#include <QLabel>
+#include <QMouseEvent>
+
+class MenuEntry : public QLabel {
+    Q_OBJECT
+
+public:
+    explicit MenuEntry(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
+    ~MenuEntry();
+    static MenuEntry *getActiveLabel();
+    static void setActiveLabel(MenuEntry *label);
+    static MenuEntry *getHoverLabel();
+    static void setHoverLabel(MenuEntry *label);
+
+signals:
+    void clicked();
+    void active_label_changed();
+    void hover_label_changed();
+
+protected:
+    void mousePressEvent(QMouseEvent* event);
+    void mouseMoveEvent(QMouseEvent *event) override;
+
+private slots:
+    void on_clicked();
+
+private:
+    static MenuEntry *active_label;
+    static MenuEntry *hover_label;
+    const QString default_stylesheet = "color:rgb(255, 255, 255);";
+    const QString active_stylesheet = "color:rgb(200, 200, 200);";
+};
+
+#endif // CLICKABLELABEL_H

+ 74 - 0
src/Legacy/src/networkdownloader.cpp

@@ -0,0 +1,74 @@
+#include "networkdownloader.h"
+#include <QEventLoop>
+#include <QApplication>
+
+NetworkDownloader::NetworkDownloader(QObject *parent) :QObject(parent), busy(false)
+{
+    connect(&m_WebCtrl, SIGNAL(finished(QNetworkReply*)), this, SLOT(onDownloadFinished(QNetworkReply*)));
+}
+
+NetworkDownloader::~NetworkDownloader() {
+}
+
+QUrl NetworkDownloader::getUrl()
+{
+    return url;
+}
+
+void NetworkDownloader::setUrl(const QUrl &_url)
+{
+    url = _url;
+}
+
+void NetworkDownloader::waitForDownloaded()
+{
+    QEventLoop loop;
+    connect(this, &NetworkDownloader::downloadFinished, &loop, &QEventLoop::quit);
+    loop.exec();
+}
+
+void NetworkDownloader::start()
+{
+    if (busy) {
+        qDebug() << "Cannot download " << url << ", downloader is busy!";
+        return;
+    }
+    qDebug() << "Starting download " << url;
+
+    busy = true;
+    QNetworkRequest request(url);
+    m_CurrentReply = m_WebCtrl.get(request);
+    m_CurrentReply->setReadBufferSize(download_speed_limit);
+    connect(m_CurrentReply, &QNetworkReply::readyRead, this, &NetworkDownloader::onReadyRead);
+    connect(m_CurrentReply, &QNetworkReply::downloadProgress, this, &NetworkDownloader::progressChanged);
+}
+
+void NetworkDownloader::updateDownloadSpeedLimit(int bytes_per_sec)
+{
+    download_speed_limit = bytes_per_sec;
+    if (m_CurrentReply)
+        m_CurrentReply->setReadBufferSize(bytes_per_sec);
+}
+
+void NetworkDownloader::stop()
+{
+    m_CurrentReply->abort();
+    busy = false;
+}
+
+void NetworkDownloader::onDownloadFinished(QNetworkReply*) {
+    if (m_CurrentReply)
+        m_CurrentReply->deleteLater();
+
+    busy = false;
+    emit downloadFinished();
+}
+
+void NetworkDownloader::onReadyRead()
+{
+    QByteArray readdata = m_CurrentReply->readAll();
+    if (targetFile && targetFile->isWritable())
+        targetFile->write(readdata);
+    if (targetBytearray)
+        targetBytearray->append(readdata);
+}

+ 49 - 0
src/Legacy/src/networkdownloader.h

@@ -0,0 +1,49 @@
+#ifndef INCLUDEILEDOWNLOADER_H
+#define INCLUDEILEDOWNLOADER_H
+
+#include <QObject>
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QFile>
+#include <QByteArray>
+
+class NetworkDownloader : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit NetworkDownloader(QObject *parent = 0);
+    virtual ~NetworkDownloader();
+
+    QUrl getUrl();
+    void setUrl(const QUrl& _url);
+    void waitForDownloaded();
+
+signals:
+    void downloadFinished();
+    void progressChanged(qint64 bytesReceived, qint64 bytesTotal);
+
+public slots:
+    void start();
+    void updateDownloadSpeedLimit(int bytes_per_sec);
+    void stop();
+
+private slots:
+    void onDownloadFinished(QNetworkReply* pReply);
+    void onReadyRead();
+
+public:
+    QFile* targetFile {nullptr};
+    QByteArray* targetBytearray {nullptr};
+
+private:
+    bool busy;
+    QUrl url;
+    QNetworkReply* m_CurrentReply {nullptr};
+    QNetworkAccessManager m_WebCtrl;
+
+    unsigned download_speed_limit {0};
+};
+
+#endif // INCLUDEILEDOWNLOADER_H

+ 42 - 0
src/Legacy/src/rusificationtreeitem.cpp

@@ -0,0 +1,42 @@
+#include "rusificationtreeitem.h"
+#include <QSettings>
+#include <QDebug>
+
+RusificationTreeItem::RusificationTreeItem(QString name): QTreeWidgetItem(1000), name(name)
+{
+}
+
+void RusificationTreeItem::parseSettingsItem(QSettings &patches_list)
+{
+    patches_list.beginGroup(name);
+    title = patches_list.value("title").toString();
+    description = patches_list.value("descr").toString();
+    patchname = patches_list.value("patchname").toString();
+    parent_name = patches_list.value("parent", "rusification").toString();
+
+    setText(0, title);
+
+    if (name.contains("patch")) {
+        QStringList categories_list = patches_list.value("id").toString().split('|');
+        for (QString category : categories_list)
+            categories.push_back(category.toInt());
+        setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
+    }
+
+    if (name.contains("group")) {
+        setFlags(Qt::ItemIsAutoTristate | Qt::ItemIsEnabled | Qt::ItemIsUserCheckable);
+        if (parent_name == "rusification") {
+            QFont font;
+            font.setFamily(QStringLiteral("Trajan Pro 3"));
+            font.setPixelSize(16);
+            font.setBold(false);
+            font.setUnderline(false);
+
+            setFont(0, font);
+            setTextColor(0, QColor(207, 166, 68));
+        }
+    }
+
+    qDebug() << title << description << parent_name;
+    patches_list.endGroup();
+}

+ 24 - 0
src/Legacy/src/rusificationtreeitem.h

@@ -0,0 +1,24 @@
+#ifndef INCLUDEUSIFICATIONTREEITEM_H
+#define INCLUDEUSIFICATIONTREEITEM_H
+
+#include <QTreeWidgetItem>
+#include <QSettings>
+
+struct RusificationTreeItem : public QTreeWidgetItem
+{
+
+public:
+    explicit RusificationTreeItem(QString name);
+    void parseSettingsItem(QSettings& patches_list);
+
+public:
+    QString name;
+    QString title;
+    QString description;
+    QString patchname;
+
+    QString parent_name;
+    std::vector<int> categories;
+};
+
+#endif // INCLUDEUSIFICATIONTREEITEM_H

+ 10 - 0
src/Legacy/uic_wrapper.bat

@@ -0,0 +1,10 @@
+@echo off
+SetLocal EnableDelayedExpansion
+(set PATH=D:\Programming\Qt\5.11.2\Src\qtbase\bin;!PATH!)
+if defined QT_PLUGIN_PATH (
+    set QT_PLUGIN_PATH=D:\Programming\Qt\5.11.2\Src-local\qtbase\plugins;!QT_PLUGIN_PATH!
+) else (
+    set QT_PLUGIN_PATH=D:\Programming\Qt\5.11.2\Src-local\qtbase\plugins
+)
+D:\Programming\Qt\5.11.2\Src\qtbase\bin\uic.exe %*
+EndLocal