sysmainwindow.h 5.96 KB
Newer Older
‘oliver.hui’'s avatar
‘oliver.hui’ committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
#ifndef SYSMAINWINDOW_H
#define SYSMAINWINDOW_H

#include <QStackedWidget>
#include <topcore/topclassabs.h>
#include <QSystemTrayIcon>

class QHBoxLayout;
class QLabel;
class QPropertyAnimation;
class QStackedWidget;
class QTabBar;
class QDateTime;
class QVBoxLayout;
class TFramelessWindowBar;
class TPanelMenu;
class TopMessageController;
class TopQuickToolBar;
class TopQuickButton;
class TToolButton;
class QSplitter;

struct NaviData;

class StretchFrame: public QFrame {
    Q_OBJECT
public:
    StretchFrame(QWidget* iParent = nullptr);
    void setWidget(QWidget *iWidget);
    void setStretchWidgetVisible(bool iVisible);

protected:
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *);
    bool event(QEvent *event);
    void showEvent(QShowEvent *event);

private:
    bool mLeftButtonPressed = false;
    QPoint mDragPosition;
    qreal mStretchWidgetWidth = 1;
    bool mMouseAnchor = false;
    QWidget *mWidget = nullptr;
    QFrame *mStretchWidget = nullptr;
    QHBoxLayout *mLayout = nullptr;
};

class StackedWidget : public QStackedWidget {
    Q_OBJECT
public:
    StackedWidget(QWidget *iParent = nullptr);
    void setBackground(const QString &iBackground);
protected:
    void paintEvent(QPaintEvent *iEvent);
private:
    QString mBackground;
};

class SysMainWindow final : public TopClassAbs
{
    Q_OBJECT
public:
    enum class RouteType {
        None,
        Module,
        Menu,
        Action,
        Url,
        ModuleBar
    };

public:
    explicit SysMainWindow(const QString &iModuleNameStr = QString(""),
                           const QVariantMap &iUrlPars = QVariantMap(),
                           QWidget *iParent = nullptr);
    ~SysMainWindow();

public slots:
    void openModule(const QString &iUrl, const QVariant &iConfig = QVariant());
    void showPasswordModificationDialog(bool iPwdStrengthCheck = true, int iPwdLengthLimit = 8, int iPwdTypeCount = 3, const QStringList &iNonPasswordLst = QStringList());
    void showAboutDialog();
    void showModuleVersionDialog();
    void showVersionDetailDialog(QWidget *iParent, const QVariant &iDetail);
    void openModuleUpgrade();
    void setIsPinned(bool iIsPinned, bool iForce = false);
    bool hide2SystemTrayState();
    void saveHide2SystemTrayState(bool iState);
    bool hide2SystemTrayTipState();
    void saveHide2SystemTrayTipState(bool iState);
    bool isSystemTrayIconShow();
    void showLicenseInfo();
    QVariantMap getLicenseInfo();
    void forAuthorization();

protected:
    bool nativeEvent(const QByteArray &iEventTypeLst,
                     void *iMsgPtr,
                     long *oResultI64Ptr) override;
    void closeEvent(QCloseEvent *iEvent) override;

private slots:
    void onOperateTimer();
    void onQuickBtnClicked();
    void onTabBarCurrentChanged(int iIndexInt);
    void onTabBarCloseRequested(int iIndexInt);
    void onNaviButtonClicked();
    void onPinButtonClicked();
    void onPanelMenuClicked(const QVariant &iDataVar);
    void onNotification(const QString &iKeyStr, const QVariant &iDataVar, const QString &iUuid);
    void onModuleWindowTitleChanged();
    void onSysTrayIconActived(QSystemTrayIcon::ActivationReason reason);

private:
    void initIsPinned();
    void initNaviToolBar();
    void initMainWidget();
    void initDefaultRoute();
    void updateTabBar(const QString &iUrl, const QVariant &iConfigVar = QVariant());
    void updateTabBarWhenRemoveTab(int iIndexInt);
    void updatePopupWidget(TopQuickButton *iBtn, const QVariantMap &iConfigVar, RouteType type);
    void movePanelMenuWidget();
    void initSysTrayIcon();
    RouteType str2RouteType(const QString &iTypeStr);
    void routeUrl(const QString &iUrlAddressStr, const QVariantMap &iConfigVar);
    void routeModule(const QString &iUrlAddressStr, const QVariantMap &iConfigVar);
    void routeAction(const QString &iUrlAddressStr);
    void route(TopQuickButton *iBtn, NaviData *iData, const QVariantMap &iConfigVar);
    void buildPanelMenuData(QVariantList &oMenuDataLst);
    QVariantMap searchDefaultRoute(const QVariantList &iNaviLst);
    void showCloseDialog();

private:
    //拼版特殊设置,超过六小时未操作,提示重新登录
    QDateTime *mPreOperateTime = nullptr;
    QPointF mPreMousePos;
    QPointF mNowMousePos;
    bool mPreWindowHideState = false;
    bool mNowWindowHideState = false;
    bool mPreWindowActiveState = false;
    bool mNowWindowActiveState = false;
    QTimer *mOperateTimeOutTimer = nullptr;

    TopQuickToolBar *mNaviToolBar = nullptr;
    TFramelessWindowBar *mWindowTitleBar = nullptr;
    QTabBar *mTabBar = nullptr;
    StackedWidget *mStackedWidget = nullptr;
    QStackedWidget *mModuleBarStackedWidget = nullptr;
    QMap<QString, TopClassAbs *> mModuleBarUrlAddressMap;
    QMap<TopQuickButton *, NaviData *> mNaviDataMap;
    TopQuickButton *mCurrentActiveQuickBtn = nullptr;

    QLabel *mPanelMenuTitleLabel = nullptr;
    TToolButton *mPinButton = nullptr;
    TPanelMenu *mPanelMenu = nullptr;
    StretchFrame *mPopupWidget = nullptr;
    QSplitter *mCenterWidget = nullptr;
    QWidget *mMainWidget = nullptr;

    QHBoxLayout *mMainLayout = nullptr;

    QMap<QString, QWidget *> mUrlAddressWidgetMap;   // urlAddress:QWidget
    QMap<QString, QVariantMap> mUrlAddressConfigMap; // urlAddress:Config

    bool mIsPinned = false;

    QLabel *mMessageLabel = nullptr;
    QPropertyAnimation *mMessageAnimation = nullptr;

    TopMessageController *mMessageController = nullptr;

    bool mIsRoutingModule = false;
    // 托盘图标
    QSystemTrayIcon *mSysTrayIcon = nullptr;
    bool mSysTrayIconShow = false; // 是否显示托盘图标
    bool mHidetoSysTray = false; // 关闭时是否隐藏程序到托盘
    bool mHidetoSysTrayFlag = false; // 注册表中是否有mHidetoSysTray标记,是否显示确认弹窗
    QString mHidetoTrayRegName;
    QString mSysTrayTitle;
    bool mModuleVersionDialogFinished = true; // 模组版本对话框是否已关闭,避免打开多个窗口
    QVariantMap mLicenseInfo;
};

#endif // SYSMAINWINDOW_H