Browse Source

Implemented design-concept of rusification widget

Ivan Arkhipov 5 năm trước cách đây
mục cha
commit
d9e42e2b5e

+ 0 - 1
src/Legacy/widgets/mainwindow.h

@@ -94,7 +94,6 @@ private:
 
     QWidget* menuHoverWidget;
     QPropertyAnimation* menuHoverWidgetAnimation;
-    QPropertyAnimation* menuHoverWidgetScaleAnimation;
     QTimer menu_hover_checker_timer;
 
     QPoint dragPosition;

+ 108 - 0
src/Legacy/widgets/rusificationwidget.cpp

@@ -1,12 +1,18 @@
 #include "widgets/rusificationwidget.h"
 #include "ui_rusificationwidget.h"
 #include <QDebug>
+#include <QScrollBar>
 
 RusificationWidget::RusificationWidget(QSettings* settings, PatchDownloader* patch_downloader, LotroDatManager* lotro_dat_manager, QWidget *parent) :
     QWidget(parent),
     ui(new Ui::RusificationWidget)
 {
     ui->setupUi(this);
+    currently_active_entry = ui->menuentry_1;
+
+//    moveMenuHoverWidget(ui->menuentry_1);
+    qDebug() << ui->hover_button_widget->geometry();
+    connect(ui->content_scroll_area->verticalScrollBar(), &QScrollBar::valueChanged, this, &RusificationWidget::handleContentScrolling);
 }
 
 RusificationWidget::~RusificationWidget()
@@ -14,3 +20,105 @@ RusificationWidget::~RusificationWidget()
     delete ui;
 }
 
+void RusificationWidget::handleContentScrolling(int value)
+{
+    if (scrollAreaContentsAnimation && scrollAreaContentsAnimation->state() == QAbstractAnimation::Running)
+        return;
+
+    qDebug() << "VALUE CHANGED: " << value << ui->content_scroll_area->verticalScrollBar()->maximum();
+    QPushButton* new_active_entry = ui->menuentry_2;
+    if (value >= ui->sub_entry_1->y() + ui->sub_entry_1->height() * 2 / 3)
+        new_active_entry = ui->menuentry_2;
+    if (value >= ui->sub_entry_2->y() + ui->sub_entry_2->height() * 2 / 3)
+        new_active_entry = ui->menuentry_3;
+    if (value >= ui->sub_entry_3->y() + ui->sub_entry_3->height() * 2 / 3)
+        new_active_entry = ui->menuentry_4;
+    if (value >= ui->sub_entry_4->y() + ui->sub_entry_4->height() * 2 / 3 || value == ui->content_scroll_area->verticalScrollBar()->maximum())
+        new_active_entry = ui->menuentry_5;
+    if (value == 0)
+        new_active_entry = ui->menuentry_1;
+
+    moveMenuHoverWidget(new_active_entry);
+}
+
+void RusificationWidget::moveMenuHoverWidget(QPushButton *target)
+{
+    if (ui->hover_button_widget->size() == QSize(0, 0)) {
+        ui->hover_button_widget->resize(target->size() + QSize(10, 0));
+        ui->hover_button_widget->move(ui->checkpoints_list->pos() + target->pos() + QPoint(-5, 0));
+    } else {
+        if (menuHoverWidgetAnimation == nullptr)
+            menuHoverWidgetAnimation = new QPropertyAnimation(ui->hover_button_widget, "geometry");
+        else
+            menuHoverWidgetAnimation->stop();
+
+        menuHoverWidgetAnimation->setDuration(200);
+        menuHoverWidgetAnimation->setStartValue(QRect(ui->hover_button_widget->pos(), ui->hover_button_widget->size()));
+        menuHoverWidgetAnimation->setEndValue(QRect(ui->checkpoints_list->pos() + target->pos() + QPoint(-5, 0), target->size() + QSize(10, 0)));
+        menuHoverWidgetAnimation->start();
+    }
+
+    ui->menuentry_1->raise();
+    ui->menuentry_2->raise();
+    ui->menuentry_3->raise();
+    ui->menuentry_4->raise();
+}
+
+void RusificationWidget::scrollContentToWidget(QWidget *widget)
+{
+    if (scrollAreaContentsAnimation == nullptr)
+        scrollAreaContentsAnimation = new QPropertyAnimation(ui->content_scroll_area->verticalScrollBar(), "value");
+    else
+        scrollAreaContentsAnimation->stop();
+
+    scrollAreaContentsAnimation->setDuration(200);
+    scrollAreaContentsAnimation->setStartValue(ui->content_scroll_area->verticalScrollBar()->value());
+    scrollAreaContentsAnimation->setEndValue(widget->y());
+    scrollAreaContentsAnimation->start();
+}
+
+
+void RusificationWidget::on_menuentry_1_clicked()
+{
+    if (currently_active_entry != ui->menuentry_1) {
+        currently_active_entry = ui->menuentry_1;
+        moveMenuHoverWidget(ui->menuentry_1);
+    }
+    scrollContentToWidget(ui->sub_entry_1);
+}
+
+void RusificationWidget::on_menuentry_2_clicked()
+{
+    if (currently_active_entry != ui->menuentry_2) {
+        currently_active_entry = ui->menuentry_2;
+        moveMenuHoverWidget(ui->menuentry_2);
+    }
+    scrollContentToWidget(ui->sub_entry_2);
+}
+
+void RusificationWidget::on_menuentry_3_clicked()
+{
+    if (currently_active_entry != ui->menuentry_3) {
+        currently_active_entry = ui->menuentry_3;
+        moveMenuHoverWidget(ui->menuentry_3);
+    }
+    scrollContentToWidget(ui->sub_entry_3);
+}
+
+void RusificationWidget::on_menuentry_4_clicked()
+{
+    if (currently_active_entry != ui->menuentry_4) {
+        currently_active_entry = ui->menuentry_4;
+        moveMenuHoverWidget(ui->menuentry_4);
+    }
+    scrollContentToWidget(ui->sub_entry_4);
+}
+
+void RusificationWidget::on_menuentry_5_clicked()
+{
+    if (currently_active_entry != ui->menuentry_5) {
+        currently_active_entry = ui->menuentry_5;
+        moveMenuHoverWidget(ui->menuentry_5);
+    }
+    scrollContentToWidget(ui->sub_entry_5);
+}

+ 23 - 0
src/Legacy/widgets/rusificationwidget.h

@@ -4,6 +4,8 @@
 #include <QWidget>
 #include <QTimer>
 #include <QSettings>
+#include <QPropertyAnimation>
+#include <QPushButton>
 
 namespace Ui {
 class RusificationWidget;
@@ -22,11 +24,32 @@ public:
     ~RusificationWidget();
 
 
+private slots:
+    void handleContentScrolling(int value);
+
+    void moveMenuHoverWidget(QPushButton* target);
+
+    void scrollContentToWidget(QWidget* widget);
+
+    void on_menuentry_1_clicked();
+
+    void on_menuentry_2_clicked();
+
+    void on_menuentry_3_clicked();
+
+    void on_menuentry_4_clicked();
+
+    void on_menuentry_5_clicked();
+
 private:
     QSettings* app_settings;
     PatchDownloader* patch_updater;
     LotroDatManager* lotro_manager;
 
+    QPushButton* currently_active_entry = nullptr;
+    QPropertyAnimation* menuHoverWidgetAnimation = nullptr;
+    QPropertyAnimation* scrollAreaContentsAnimation = nullptr;
+
     Ui::RusificationWidget *ui;
 };
 

+ 167 - 42
src/Legacy/widgets/rusificationwidget.ui

@@ -58,95 +58,220 @@
      <number>7</number>
     </property>
     <item>
-     <widget class="QLabel" name="label">
+     <widget class="QPushButton" name="menuentry_1">
       <property name="font">
        <font>
         <family>Trajan Pro 3</family>
         <pointsize>9</pointsize>
        </font>
       </property>
+      <property name="cursor">
+       <cursorShape>PointingHandCursor</cursorShape>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">QPushButton {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;
+	border-radius: 5px;
+	margin: 7px;
+}
+
+QPushButton:pressed {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;}
+
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+	background-color: transparent;
+}</string>
+      </property>
       <property name="text">
        <string>♦ Настройка клиента игры</string>
       </property>
-      <property name="wordWrap">
+      <property name="flat">
        <bool>true</bool>
       </property>
-      <property name="margin">
-       <number>6</number>
-      </property>
      </widget>
     </item>
     <item>
-     <widget class="QLabel" name="label_2">
+     <widget class="QPushButton" name="menuentry_2">
       <property name="font">
        <font>
         <family>Trajan Pro 3</family>
         <pointsize>9</pointsize>
        </font>
       </property>
+      <property name="cursor">
+       <cursorShape>PointingHandCursor</cursorShape>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">QPushButton {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;
+	border-radius: 5px;
+	margin: 7px;
+}
+
+QPushButton:pressed {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;}
+
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+	background-color: transparent;
+}</string>
+      </property>
       <property name="text">
-       <string>♦ Настройка резервной копии</string>
+       <string>♦ Настройка резервной
+копии</string>
       </property>
-      <property name="wordWrap">
+      <property name="flat">
        <bool>true</bool>
       </property>
-      <property name="margin">
-       <number>6</number>
-      </property>
      </widget>
     </item>
     <item>
-     <widget class="QLabel" name="label_3">
+     <widget class="QPushButton" name="menuentry_3">
       <property name="font">
        <font>
         <family>Trajan Pro 3</family>
         <pointsize>9</pointsize>
        </font>
       </property>
+      <property name="cursor">
+       <cursorShape>PointingHandCursor</cursorShape>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">QPushButton {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;
+	border-radius: 5px;
+	margin: 7px;
+}
+
+QPushButton:pressed {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;}
+
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+	background-color: transparent;
+}</string>
+      </property>
       <property name="text">
-       <string>♦ Выбор компонентов русификации</string>
+       <string>♦ Выбор компонентов
+русификации</string>
       </property>
-      <property name="wordWrap">
+      <property name="flat">
        <bool>true</bool>
       </property>
-      <property name="margin">
-       <number>6</number>
-      </property>
      </widget>
     </item>
     <item>
-     <widget class="QLabel" name="label_4">
+     <widget class="QPushButton" name="menuentry_4">
       <property name="font">
        <font>
         <family>Trajan Pro 3</family>
         <pointsize>9</pointsize>
        </font>
       </property>
+      <property name="cursor">
+       <cursorShape>PointingHandCursor</cursorShape>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">QPushButton {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;
+	border-radius: 5px;
+	margin: 7px;
+}
+
+QPushButton:pressed {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;}
+
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+	background-color: transparent;
+}</string>
+      </property>
       <property name="text">
        <string>♦ Настройка обновлений</string>
       </property>
-      <property name="margin">
-       <number>6</number>
+      <property name="flat">
+       <bool>true</bool>
       </property>
      </widget>
     </item>
     <item>
-     <widget class="QLabel" name="label_5">
+     <widget class="QPushButton" name="menuentry_5">
       <property name="font">
        <font>
         <family>Trajan Pro 3</family>
         <pointsize>9</pointsize>
        </font>
       </property>
+      <property name="cursor">
+       <cursorShape>PointingHandCursor</cursorShape>
+      </property>
+      <property name="styleSheet">
+       <string notr="true">QPushButton {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;
+	border-radius: 5px;
+	margin: 7px;
+}
+
+QPushButton:pressed {
+	color: white; 
+	text-align: left;
+	background-color: transparent;
+	alternate-background-color: transparent;}
+
+QPushButton:flat {
+    border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+	background-color: transparent;
+}</string>
+      </property>
       <property name="text">
        <string>♦ Применить!</string>
       </property>
-      <property name="wordWrap">
+      <property name="flat">
        <bool>true</bool>
       </property>
-      <property name="margin">
-       <number>6</number>
-      </property>
      </widget>
     </item>
     <item>
@@ -167,7 +292,7 @@
   <widget class="QProgressBar" name="progressBar">
    <property name="geometry">
     <rect>
-     <x>330</x>
+     <x>310</x>
      <y>480</y>
      <width>501</width>
      <height>40</height>
@@ -213,7 +338,7 @@ margin-bottom:7px;
   <widget class="QLabel" name="progress_label">
    <property name="geometry">
     <rect>
-     <x>330</x>
+     <x>310</x>
      <y>450</y>
      <width>501</width>
      <height>31</height>
@@ -246,7 +371,7 @@ margin-bottom:7px;
   <widget class="QPushButton" name="game_button">
    <property name="geometry">
     <rect>
-     <x>840</x>
+     <x>830</x>
      <y>460</y>
      <width>150</width>
      <height>60</height>
@@ -389,7 +514,7 @@ border-radius: 0px;
     </property>
     <layout class="QVBoxLayout" name="verticalLayout_2">
      <item>
-      <widget class="QWidget" name="widget" native="true">
+      <widget class="QWidget" name="sub_entry_1" native="true">
        <layout class="QGridLayout" name="gridLayout">
         <item row="0" column="0">
          <widget class="QLabel" name="label_6">
@@ -400,7 +525,7 @@ border-radius: 0px;
            </font>
           </property>
           <property name="text">
-           <string>Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
+           <string>SUB_ENTRY_1 Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -411,7 +536,7 @@ border-radius: 0px;
       </widget>
      </item>
      <item>
-      <widget class="QWidget" name="widget_5" native="true">
+      <widget class="QWidget" name="sub_entry_2" native="true">
        <layout class="QGridLayout" name="gridLayout_5">
         <item row="0" column="0">
          <widget class="QLabel" name="label_7">
@@ -422,7 +547,7 @@ border-radius: 0px;
            </font>
           </property>
           <property name="text">
-           <string>Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
+           <string>SUB_ENTRY_2 Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -433,7 +558,7 @@ border-radius: 0px;
       </widget>
      </item>
      <item>
-      <widget class="QWidget" name="widget_2" native="true">
+      <widget class="QWidget" name="sub_entry_3" native="true">
        <layout class="QGridLayout" name="gridLayout_2">
         <item row="0" column="0">
          <widget class="QLabel" name="label_8">
@@ -444,7 +569,7 @@ border-radius: 0px;
            </font>
           </property>
           <property name="text">
-           <string>Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;SUB_ENTRY_3 Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -455,7 +580,7 @@ border-radius: 0px;
       </widget>
      </item>
      <item>
-      <widget class="QWidget" name="widget_4" native="true">
+      <widget class="QWidget" name="sub_entry_4" native="true">
        <layout class="QGridLayout" name="gridLayout_4">
         <item row="0" column="0">
          <widget class="QLabel" name="label_9">
@@ -466,7 +591,7 @@ border-radius: 0px;
            </font>
           </property>
           <property name="text">
-           <string>Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;SUB_ENTRY_4 Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -477,7 +602,7 @@ border-radius: 0px;
       </widget>
      </item>
      <item>
-      <widget class="QWidget" name="widget_3" native="true">
+      <widget class="QWidget" name="sub_entry_5" native="true">
        <layout class="QGridLayout" name="gridLayout_3">
         <item row="0" column="0">
          <widget class="QLabel" name="label_10">
@@ -488,7 +613,7 @@ border-radius: 0px;
            </font>
           </property>
           <property name="text">
-           <string>Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.</string>
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;SUB_ENTRY_5 Товарищи! реализация намеченных плановых заданий позволяет выполнять важные задания по разработке системы обучения кадров, соответствует насущным потребностям. Равным образом постоянное информационно-пропагандистское обеспечение нашей деятельности требуют определения и уточнения дальнейших направлений развития. Значимость этих проблем настолько очевидна, что сложившаяся структура организации способствует подготовки и реализации соответствующий условий активизации.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
           </property>
           <property name="wordWrap">
            <bool>true</bool>
@@ -504,10 +629,10 @@ border-radius: 0px;
   <widget class="QWidget" name="hover_button_widget" native="true">
    <property name="geometry">
     <rect>
-     <x>21</x>
-     <y>74</y>
-     <width>261</width>
-     <height>41</height>
+     <x>31</x>
+     <y>81</y>
+     <width>260</width>
+     <height>36</height>
     </rect>
    </property>
    <property name="styleSheet">

+ 3 - 3
src/Legacy/widgets/statuswidget.ui

@@ -394,7 +394,7 @@ border-image: url(:/characters/galadriel_with_text.png);
   <widget class="QPushButton" name="game_button">
    <property name="geometry">
     <rect>
-     <x>840</x>
+     <x>820</x>
      <y>460</y>
      <width>150</width>
      <height>60</height>
@@ -455,7 +455,7 @@ QPushButton#game_button:pressed {
   <widget class="QLabel" name="progress_label">
    <property name="geometry">
     <rect>
-     <x>330</x>
+     <x>300</x>
      <y>450</y>
      <width>501</width>
      <height>31</height>
@@ -488,7 +488,7 @@ QPushButton#game_button:pressed {
   <widget class="QProgressBar" name="progressBar">
    <property name="geometry">
     <rect>
-     <x>330</x>
+     <x>300</x>
      <y>480</y>
      <width>501</width>
      <height>40</height>