瀏覽代碼

Added and implemented tooltips in StatusWidget

Ivan Arkhipov 6 年之前
父節點
當前提交
5584d1e8de

+ 6 - 3
src/Legacy/Legacy.pro

@@ -32,7 +32,8 @@ SOURCES += \
     widgets/serverstatuswidget.cpp \
     models/selfupdater.cpp \
     widgets/eventslistwidget.cpp \
-    widgets/chooseversiondialog.cpp
+    widgets/chooseversiondialog.cpp \
+    widgets/tooltiplabel.cpp
 
 HEADERS += \
     models/downloader.h \
@@ -52,7 +53,8 @@ HEADERS += \
     widgets/serverstatuswidget.h \
     models/selfupdater.h \
     widgets/eventslistwidget.h \
-    widgets/chooseversiondialog.h
+    widgets/chooseversiondialog.h \
+    widgets/tooltiplabel.h
 
 FORMS += \
     widgets/helpwidget.ui \
@@ -62,7 +64,8 @@ FORMS += \
     widgets/statuswidget.ui \
     widgets/newspiece.ui \
     widgets/serverstatuswidget.ui \
-    widgets/chooseversiondialog.ui
+    widgets/chooseversiondialog.ui \
+    widgets/tooltiplabel.ui
 
 win32:RC_ICONS = $${PROJECT_ROOT_PATH}/resources/appicon.ico
 

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

@@ -20,6 +20,7 @@ INPUT(
 ./..\..\build\debug\Legacy\obj\selfupdater.o
 ./..\..\build\debug\Legacy\obj\eventslistwidget.o
 ./..\..\build\debug\Legacy\obj\chooseversiondialog.o
+./..\..\build\debug\Legacy\obj\tooltiplabel.o
 ./..\..\build\debug\Legacy\obj\legacy_plugin_import.o
 ./..\..\build\debug\Legacy\obj\moc_downloader.o
 ./..\..\build\debug\Legacy\obj\moc_filesystem.o
@@ -39,4 +40,5 @@ INPUT(
 ./..\..\build\debug\Legacy\obj\moc_selfupdater.o
 ./..\..\build\debug\Legacy\obj\moc_eventslistwidget.o
 ./..\..\build\debug\Legacy\obj\moc_chooseversiondialog.o
+./..\..\build\debug\Legacy\obj\moc_tooltiplabel.o
 );

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

@@ -18,6 +18,7 @@ INPUT(
 ./..\..\build\release\Legacy\obj\selfupdater.o
 ./..\..\build\release\Legacy\obj\eventslistwidget.o
 ./..\..\build\release\Legacy\obj\chooseversiondialog.o
+./..\..\build\release\Legacy\obj\tooltiplabel.o
 ./..\..\build\release\Legacy\obj\legacy_plugin_import.o
 ./..\..\build\release\Legacy\obj\moc_downloader.o
 ./..\..\build\release\Legacy\obj\moc_filesystem.o
@@ -37,4 +38,5 @@ INPUT(
 ./..\..\build\release\Legacy\obj\moc_selfupdater.o
 ./..\..\build\release\Legacy\obj\moc_eventslistwidget.o
 ./..\..\build\release\Legacy\obj\moc_chooseversiondialog.o
+./..\..\build\release\Legacy\obj\moc_tooltiplabel.o
 );

+ 1 - 1
src/Legacy/widgets/mainwindow.cpp

@@ -44,7 +44,7 @@ MainWindow::MainWindow(QWidget *parent) :
     qDebug() << "Starting installation for patch updates...";
     QMetaObject::invokeMethod(lotro_manager, "installUpdates", Qt::QueuedConnection);
 
-    status_widget = new StatusWidget(settings, patch_updater, lotro_manager, this);
+    status_widget = new StatusWidget(settings, patch_updater, lotro_manager, this);    
     rusification_widget = new RusificationWidget(settings, patch_updater, lotro_manager, this);
     settings_widget = new SettingsWidget(settings, patch_updater, lotro_manager, this);
     help_widget = new HelpWidget(settings, patch_updater, lotro_manager, this);

+ 2 - 0
src/Legacy/widgets/statusflagwidget.cpp

@@ -68,6 +68,7 @@ void StatusFlagWidget::enterEvent(QEvent * event)
     changeImageSrcAnimated(current_flag_hover_src);
     QWidget::enterEvent(event);
     event->ignore();
+    emit mouseEntered("Нажмите, чтобы переключиться между новостями/текущими событиями и статусом серверов.");
 }
 
 void StatusFlagWidget::paintEvent(QPaintEvent *event)
@@ -85,6 +86,7 @@ void StatusFlagWidget::leaveEvent(QEvent * event)
     changeImageSrcAnimated(current_flag_src);
     QWidget::leaveEvent(event);
     event->ignore();
+    emit mouseLeaved();
 }
 
 void StatusFlagWidget::mousePressEvent(QMouseEvent *ev)

+ 2 - 0
src/Legacy/widgets/statusflagwidget.h

@@ -17,7 +17,9 @@ protected:
     virtual void mousePressEvent(QMouseEvent *ev) override;
 
 signals:
+    void mouseEntered(QString tooltip);
     void flagIdChanged(int flag_id);
+    void mouseLeaved();
 
 public slots:
     void changeImageSrcAnimated(const QString& src);

+ 17 - 0
src/Legacy/widgets/statuswidget.cpp

@@ -24,6 +24,12 @@ StatusWidget::StatusWidget(QSettings* settings, PatchDownloader* patch_downloade
     connect(patch_updater, &PatchDownloader::progressChanged, this, &StatusWidget::onPatchDownloaderProgressChanged, Qt::QueuedConnection);
     connect(patch_updater, &PatchDownloader::downloadCompleted, this, &StatusWidget::onPatchDownloaderFinished, Qt::QueuedConnection);
     ui->bottom_widget->hide();
+    ui->tooltip->hide();
+
+    connect(ui->weekly_code, &WeeklyCodeWidget::mouseEntered, this, &StatusWidget::showTooltip);
+    connect(ui->weekly_code, &WeeklyCodeWidget::mouseLeaved, this, &StatusWidget::hideTooltip);
+    connect(ui->server_status_flag, &StatusFlagWidget::mouseEntered, this, &StatusWidget::showTooltip);
+    connect(ui->server_status_flag, &StatusFlagWidget::mouseLeaved, this, &StatusWidget::hideTooltip);
 }
 
 StatusWidget::~StatusWidget()
@@ -31,6 +37,17 @@ StatusWidget::~StatusWidget()
     delete ui;
 }
 
+void StatusWidget::showTooltip(QString text)
+{
+    ui->tooltip->updateText(text);
+    ui->tooltip->show();
+}
+
+void StatusWidget::hideTooltip()
+{
+    ui->tooltip->hide();
+}
+
 void StatusWidget::onPatchDownloaderStarted()
 {
     qDebug() << "Status widget received DownloadStarted signal!";

+ 4 - 0
src/Legacy/widgets/statuswidget.h

@@ -19,6 +19,10 @@ public:
     explicit StatusWidget(QSettings* settings, PatchDownloader* patch_downloader, LotroDatManager* lotro_dat_manager, QWidget *parent = 0);
     ~StatusWidget();
 
+public slots:
+    void showTooltip(QString text);
+    void hideTooltip();
+
 private slots:
     void onPatchDownloaderStarted();
     void onPatchDownloaderFinished();

+ 29 - 0
src/Legacy/widgets/statuswidget.ui

@@ -515,6 +515,29 @@ color: white;
         </property>
        </spacer>
       </item>
+      <item>
+       <widget class="TooltipLabel" name="tooltip" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="verticalSpacer_4">
+        <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>
        <widget class="QPushButton" name="game_button">
         <property name="sizePolicy">
@@ -1042,6 +1065,12 @@ margin-bottom:7px;
    <header>widgets/eventslistwidget.h</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>TooltipLabel</class>
+   <extends>QWidget</extends>
+   <header>widgets/tooltiplabel.h</header>
+   <container>1</container>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>

+ 62 - 0
src/Legacy/widgets/tooltiplabel.cpp

@@ -0,0 +1,62 @@
+#include "tooltiplabel.h"
+#include "ui_tooltiplabel.h"
+
+#include <QtConcurrent/QtConcurrent>
+
+TooltipLabel::TooltipLabel(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::TooltipLabel)
+{
+    ui->setupUi(this);
+    effect.setOpacity(0);
+    setGraphicsEffect(&effect);
+    QWidget::show();
+    isHidden = true;
+}
+
+TooltipLabel::~TooltipLabel()
+{
+    delete ui;
+}
+
+void TooltipLabel::show()
+{
+    isHidden = false;
+    QtConcurrent::run([this](){
+        const int iterations_num = 20;
+        const int iteration_sleep = 10;
+
+        for (int i = 0; i < iterations_num && qApp && !isHidden; ++i) {
+            qreal opacity = double(i) / 20.0;
+            effect.setOpacity(opacity);
+            QMetaObject::invokeMethod(this, "updateOpacity", Qt::QueuedConnection, Q_ARG(qreal, opacity));
+            QThread::msleep(iteration_sleep);
+        }
+    });
+}
+
+void TooltipLabel::hide()
+{
+    isHidden = true;
+    QtConcurrent::run([this](){
+        const int iterations_num = 20;
+        const int iteration_sleep = 10;
+
+        for (int i = iterations_num - 1; i >= 0 && qApp && isHidden; --i) {
+            qreal opacity = double(i) / 20.0;
+            QMetaObject::invokeMethod(this, "updateOpacity", Qt::QueuedConnection, Q_ARG(qreal, opacity));
+            QThread::msleep(iteration_sleep);
+        }
+    });
+}
+
+void TooltipLabel::updateText(QString text)
+{
+    ui->label_small->setText(text);
+}
+
+void TooltipLabel::updateOpacity(double opacity)
+{
+    effect.setOpacity(opacity);
+    setGraphicsEffect(&effect);
+}

+ 31 - 0
src/Legacy/widgets/tooltiplabel.h

@@ -0,0 +1,31 @@
+#ifndef TOOLTIPLABEL_H
+#define TOOLTIPLABEL_H
+
+#include <QWidget>
+#include <QGraphicsOpacityEffect>
+
+namespace Ui {
+class TooltipLabel;
+}
+
+class TooltipLabel : public QWidget
+{
+    Q_OBJECT
+
+public:
+    explicit TooltipLabel(QWidget *parent = 0);
+    ~TooltipLabel();
+
+public slots:
+    void show();
+    void updateText(QString text);
+    void updateOpacity(double opacity);
+    void hide();
+
+private:
+    Ui::TooltipLabel *ui;
+    QGraphicsOpacityEffect effect;
+    bool isHidden;
+};
+
+#endif // TOOLTIPLABEL_H

+ 176 - 0
src/Legacy/widgets/tooltiplabel.ui

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>TooltipLabel</class>
+ <widget class="QWidget" name="TooltipLabel">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>499</width>
+    <height>396</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</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="spacing">
+    <number>0</number>
+   </property>
+   <item row="0" column="0">
+    <widget class="QWidget" name="widget" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-topleft.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QWidget" name="widget_4" native="true">
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-top.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="2">
+    <widget class="QWidget" name="widget_8" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-topright.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0">
+    <widget class="QWidget" name="widget_2" native="true">
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-left.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="1">
+    <widget class="QWidget" name="content" native="true">
+     <property name="styleSheet">
+      <string notr="true">QWidget#content{
+border-image: url(:/backgrounds/translucent54-background.png);
+}</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_small">
+        <property name="styleSheet">
+         <string notr="true">color:white;</string>
+        </property>
+        <property name="text">
+         <string>TextLabel</string>
+        </property>
+        <property name="alignment">
+         <set>Qt::AlignCenter</set>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+        <property name="openExternalLinks">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item row="1" column="2">
+    <widget class="QWidget" name="widget_9" native="true">
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-right.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0">
+    <widget class="QWidget" name="widget_3" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-botleft.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QWidget" name="widget_6" native="true">
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-bottom.png);</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QWidget" name="widget_7" native="true">
+     <property name="minimumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>8</width>
+       <height>8</height>
+      </size>
+     </property>
+     <property name="styleSheet">
+      <string notr="true">border-image: url(:/backgrounds/translucent54-border-botright.png);</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>

+ 2 - 0
src/Legacy/widgets/weeklycodewidget.cpp

@@ -64,6 +64,7 @@ void WeeklyCodeWidget::enterEvent(QEvent * event)
     changeImageSrc(":/buttons/lotr_circle_hover.png");
     QWidget::enterEvent(event);
     event->ignore();
+    emit mouseEntered("<a href='http://www.lotro-mindon.ru/content/kak-poluchit-ezhenedelnyy-podarok'>Код недели.</a>\nНажмите, чтобы скопировать в буфер обмена");
 }
 
 void WeeklyCodeWidget::paintEvent(QPaintEvent *event)
@@ -103,5 +104,6 @@ void WeeklyCodeWidget::leaveEvent(QEvent * event)
 {
     qDebug() << Q_FUNC_INFO << this->objectName();
     changeImageSrc(":/buttons/lotr_circle.png");
+    emit mouseLeaved();
 }
 

+ 3 - 0
src/Legacy/widgets/weeklycodewidget.h

@@ -19,7 +19,10 @@ protected:
     virtual void paintEvent(QPaintEvent *event) override;
     virtual void mousePressEvent(QMouseEvent *ev) override;
     virtual void mouseReleaseEvent(QMouseEvent *ev) override;
+
 signals:
+    void mouseEntered(QString tooltip);
+    void mouseLeaved();
 
 public slots:
     void updateCode();