Browse Source

Completed general part (background & menu)

Renamed ClickableLabel class to MenuEntry, added some hover features
Refactored MainWindow constructor
Ivan Arkhipov 5 years ago
parent
commit
766281c44a
9 changed files with 270 additions and 120 deletions
  1. 2 2
      Legacy_v2.pro
  2. 0 31
      clickablelabel.cpp
  3. 0 29
      clickablelabel.h
  4. 70 31
      mainwindow.cpp
  5. 15 1
      mainwindow.h
  6. 83 26
      mainwindow.ui
  7. 59 0
      menuentry.cpp
  8. 39 0
      menuentry.h
  9. 2 0
      res.qrc

+ 2 - 2
Legacy_v2.pro

@@ -28,11 +28,11 @@ DEFINES += QT_DEPRECATED_WARNINGS
 SOURCES += \
         main.cpp \
         mainwindow.cpp \
-    clickablelabel.cpp
+        menuentry.cpp
 
 HEADERS += \
         mainwindow.h \
-    clickablelabel.h
+        menuentry.h
 
 FORMS += \
         mainwindow.ui

+ 0 - 31
clickablelabel.cpp

@@ -1,31 +0,0 @@
-#include "clickablelabel.h"
-#include <QDebug>
-
-ClickableLabel *ClickableLabel::active_label = nullptr;
-
-ClickableLabel::ClickableLabel(QWidget* parent, Qt::WindowFlags)
-    : QLabel(parent) {
-
-}
-
-ClickableLabel::~ClickableLabel() {}
-
-ClickableLabel *ClickableLabel::getActiveLabel()
-{
-    return active_label;
-}
-
-void ClickableLabel::mousePressEvent(QMouseEvent* event) {
-    event->accept();
-    emit clicked();
-}
-
-void ClickableLabel::mouseMoveEvent(QMouseEvent *)
-{
-    if (active_label != this) {
-        qDebug() << "Entered " << objectName() << "\n";
-        active_label = this;
-        qDebug() << size();
-        emit active_label_changed();
-    }
-}

+ 0 - 29
clickablelabel.h

@@ -1,29 +0,0 @@
-#ifndef CLICKABLELABEL_H
-#define CLICKABLELABEL_H
-
-#include <QObject>
-#include <QWidget>
-#include <QLabel>
-#include <QMouseEvent>
-
-class ClickableLabel : public QLabel {
-    Q_OBJECT
-
-public:
-    explicit ClickableLabel(QWidget* parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags());
-    ~ClickableLabel();
-    static ClickableLabel *getActiveLabel();
-
-signals:
-    void clicked();
-    void active_label_changed();
-
-protected:
-    void mousePressEvent(QMouseEvent* event);
-    void mouseMoveEvent(QMouseEvent *event) override;
-
-private:
-    static ClickableLabel *active_label;
-};
-
-#endif // CLICKABLELABEL_H

+ 70 - 31
mainwindow.cpp

@@ -5,28 +5,14 @@
 #include <QMouseEvent>
 #include <QMessageBox>
 #include <QDesktopWidget>
-#include <QDebug>
 
 MainWindow::MainWindow(QWidget *parent) :
     QMainWindow(parent, Qt::Window | Qt::FramelessWindowHint),
     ui(new Ui::MainWindow), menuHoverWidget(nullptr), menuHoverWidgetAnimation(nullptr)
 {
     ui->setupUi(this);
-
-    QPixmap maskPix;
-    maskPix.fill(":/assets/bg1.png");
-    maskPix = maskPix.scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-    setMask(maskPix.mask());
-    menuHoverWidget = new QWidget(ui->menu_widget);
-    menuHoverWidget->setStyleSheet("background-color: rgba(55, 37, 31, 250);");
-    menuHoverWidget->resize(0, 0);
-
-    connect(ui->menuentry_1, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
-    connect(ui->menuentry_2, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
-    connect(ui->menuentry_3, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
-    connect(ui->menuentry_4, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
-    connect(ui->menuentry_5, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
-    connect(ui->menuentry_6, &ClickableLabel::active_label_changed, this, &MainWindow::on_active_menuentry_changed);
+    setupWindowBackgroundAndMask(1);
+    setupMenuHoverWidget();
 }
 
 void MainWindow::mousePressEvent(QMouseEvent *event)
@@ -48,7 +34,7 @@ void MainWindow::mouseMoveEvent(QMouseEvent *event)
 void MainWindow::resizeEvent(QResizeEvent * /* event */)
 {
     QPixmap maskPix(":/assets/bg1.png");
-    maskPix = maskPix.scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+    maskPix = maskPix.scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::FastTransformation);
     setMask(maskPix.mask());
 }
 
@@ -105,24 +91,56 @@ void MainWindow::on_menuentry_6_clicked()
     msgBox.exec();
 }
 
-void MainWindow::on_active_menuentry_changed()
+void MainWindow::onHoverMenuentry()
+{
+    moveMenuHoverWidget(MenuEntry::getHoverLabel());
+}
+
+
+void MainWindow::setupWindowBackgroundAndMask(int bg_id)
 {
-    ClickableLabel* active_label = ClickableLabel::getActiveLabel();
+    QPixmap maskPix(":/assets/bg" + QString::number(bg_id) + ".png");
+    maskPix = maskPix.scaled(width(), height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+    setMask(maskPix.mask());
+    ui->centralWidget->setStyleSheet("border-image: url(:/assets/bg" + QString::number(bg_id) + ".png)");
+}
 
-    if (menuHoverWidget->size() == QSize(0, 0)) {
-        menuHoverWidget->resize(active_label->size() + QSize(10, 0));
-        menuHoverWidget->move(active_label->pos() + QPoint(-5, 0));
-    }
 
-    if (menuHoverWidgetAnimation == nullptr)
-        menuHoverWidgetAnimation = new QPropertyAnimation(menuHoverWidget, "geometry");
-    else
-        menuHoverWidgetAnimation->stop();
+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, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_2, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_3, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_4, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_5, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+    connect(ui->menuentry_6, &MenuEntry::hover_label_changed, this, &MainWindow::onHoverMenuentry);
+
+    MenuEntry::setActiveLabel(ui->menuentry_1);
+    menu_hover_checker_timer.setInterval(700);
+    connect(&menu_hover_checker_timer, &QTimer::timeout, this, &MainWindow::checkMenuIsHovered);
+    menu_hover_checker_timer.start();
+}
 
-    menuHoverWidgetAnimation->setDuration(200);
-    menuHoverWidgetAnimation->setStartValue(QRect(menuHoverWidget->pos(), menuHoverWidget->size()));
-    menuHoverWidgetAnimation->setEndValue(QRect(active_label->pos() + QPoint(-5, 0), active_label->size() + QSize(10, 0)));
-    menuHoverWidgetAnimation->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->raise();
     ui->menuentry_2->raise();
@@ -131,3 +149,24 @@ void MainWindow::on_active_menuentry_changed()
     ui->menuentry_5->raise();
     ui->menuentry_6->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::on_closeButton_clicked()
+{
+    qApp->quit();
+}
+
+void MainWindow::on_minimizeButton_clicked()
+{
+    setWindowState(Qt::WindowMinimized);
+}

+ 15 - 1
mainwindow.h

@@ -3,11 +3,14 @@
 
 #include <QMainWindow>
 #include <QPropertyAnimation>
+#include <QTimer>
 
 namespace Ui {
 class MainWindow;
 }
 
+class MenuEntry;
+
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
@@ -34,7 +37,17 @@ private slots:
 
     void on_menuentry_6_clicked();
 
-    void on_active_menuentry_changed();
+    void onHoverMenuentry();
+
+    void on_closeButton_clicked();
+
+    void on_minimizeButton_clicked();
+
+private:
+    void setupWindowBackgroundAndMask(int bg_id);
+    void setupMenuHoverWidget();
+    void moveMenuHoverWidget(MenuEntry* target);
+    void checkMenuIsHovered();
 
 private:
     Ui::MainWindow *ui;
@@ -42,6 +55,7 @@ private:
     QWidget* menuHoverWidget;
     QPropertyAnimation* menuHoverWidgetAnimation;
     QPropertyAnimation* menuHoverWidgetScaleAnimation;
+    QTimer menu_hover_checker_timer;
 
     QPoint dragPosition;
 };

+ 83 - 26
mainwindow.ui

@@ -23,7 +23,7 @@
    </size>
   </property>
   <property name="windowTitle">
-   <string>MainWindow</string>
+   <string>ВКО: Наследие</string>
   </property>
   <property name="autoFillBackground">
    <bool>false</bool>
@@ -52,7 +52,7 @@
 
 </string>
    </property>
-   <layout class="QGridLayout" name="gridLayout" rowstretch="1,4" columnstretch="1,2">
+   <layout class="QGridLayout" name="gridLayout" rowstretch="1,4,0" columnstretch="1,2">
     <property name="sizeConstraint">
      <enum>QLayout::SetDefaultConstraint</enum>
     </property>
@@ -85,9 +85,6 @@
         <height>120</height>
        </size>
       </property>
-      <property name="autoFillBackground">
-       <bool>false</bool>
-      </property>
       <property name="styleSheet">
        <string notr="true">border-image:none;</string>
       </property>
@@ -161,9 +158,9 @@
            <number>0</number>
           </property>
           <item>
-           <widget class="ClickableLabel" name="menuentry_1">
+           <widget class="MenuEntry" name="menuentry_1">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -187,6 +184,12 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             <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>
@@ -196,12 +199,12 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
            </widget>
           </item>
           <item>
-           <widget class="ClickableLabel" name="menuentry_2">
+           <widget class="MenuEntry" name="menuentry_2">
             <property name="enabled">
              <bool>true</bool>
             </property>
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -216,15 +219,21 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             <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="ClickableLabel" name="menuentry_3">
+           <widget class="MenuEntry" name="menuentry_3">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Maximum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -239,21 +248,27 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
              <bool>true</bool>
             </property>
             <property name="styleSheet">
-             <string notr="true">color:rgb(255, 255, 255);
-font: 15px &quot;Trebuchet MS&quot;;</string>
+             <string notr="true">color:rgb(255, 255, 255); font: 15px &quot;Trebuchet MS&quot;;
+</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="ClickableLabel" name="menuentry_4">
+           <widget class="MenuEntry" name="menuentry_4">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -274,15 +289,21 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             <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="ClickableLabel" name="menuentry_5">
+           <widget class="MenuEntry" name="menuentry_5">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -306,15 +327,21 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             <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="ClickableLabel" name="menuentry_6">
+           <widget class="MenuEntry" name="menuentry_6">
             <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+             <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
               <horstretch>0</horstretch>
               <verstretch>0</verstretch>
              </sizepolicy>
@@ -347,6 +374,12 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             <property name="text">
              <string>О НАС</string>
             </property>
+            <property name="scaledContents">
+             <bool>true</bool>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignCenter</set>
+            </property>
             <property name="autoDefault" stdset="0">
              <bool>false</bool>
             </property>
@@ -383,20 +416,44 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
               <number>0</number>
              </property>
              <property name="rightMargin">
-              <number>30</number>
+              <number>0</number>
              </property>
              <property name="bottomMargin">
               <number>0</number>
              </property>
              <item>
-              <widget class="QPushButton" name="pushButton_2">
+              <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/minimize.png) 0 0 0 0 stretch stretch; border: 0px;}
+
+QPushButton#minimizeButton:hover {border-image: url(:/assets/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="pushButton">
+              <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/close.png) 0 0 0 0 stretch stretch; }
+
+QPushButton#closeButton:hover { border-image: url(:/assets/close.png) 0 0 0 0 stretch stretch; border:1px;}</string>
+               </property>
                <property name="text">
                 <string>Х</string>
                </property>
@@ -412,7 +469,7 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
             </property>
             <property name="sizeHint" stdset="0">
              <size>
-              <width>40</width>
+              <width>100</width>
               <height>20</height>
              </size>
             </property>
@@ -437,7 +494,7 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
       </layout>
      </widget>
     </item>
-    <item row="1" column="0" colspan="2">
+    <item row="1" column="1">
      <widget class="QWidget" name="content_area" native="true">
       <property name="autoFillBackground">
        <bool>false</bool>
@@ -453,9 +510,9 @@ font: 15px &quot;Trebuchet MS&quot;;</string>
  <layoutdefault spacing="6" margin="11"/>
  <customwidgets>
   <customwidget>
-   <class>ClickableLabel</class>
+   <class>MenuEntry</class>
    <extends>QLabel</extends>
-   <header>clickablelabel.h</header>
+   <header>menuentry.h</header>
   </customwidget>
  </customwidgets>
  <resources/>

+ 59 - 0
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
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);\nfont: 15px \"Trebuchet MS\";";
+    const QString active_stylesheet = "color:rgb(200, 200, 200);\nfont: 15px \"Trebuchet MS\";";
+};
+
+#endif // CLICKABLELABEL_H

+ 2 - 0
res.qrc

@@ -1,5 +1,7 @@
 <RCC>
     <qresource prefix="/">
         <file>assets/bg1.png</file>
+        <file>assets/close.png</file>
+        <file>assets/minimize.png</file>
     </qresource>
 </RCC>