#pragma once #include #include #include #include #include class FramelessWidget : public QWidget { Q_OBJECT public: // Window attributes enum LUI_WINDOW_ATTRIBUTES { LUI_WINDOW_NO_ATTRIBUTES = 0, LUI_WINDOW_DISABLE_CLOSE = 1 << 0, LUI_WINDOW_DISABLE_MAXIMIZE = 1 << 1, LUI_WINDOW_DISABLE_MINIMIZE = 1 << 2, LUI_WINDOW_DISABLE_RESIZE = 1 << 3 }; public: FramelessWidget(QWidget* parent = 0); FramelessWidget(int cornerRadius, QWidget* parent = 0); FramelessWidget(unsigned int attributes, QWidget* parent = 0); FramelessWidget(int cornerRadius, unsigned int attributes, QWidget* parent = 0); ~FramelessWidget(); private: // UI control variables const int _cornerRadius = 0; const QColor _backgroundColor = QColor(251, 251, 251); const QColor _borderColor = QColor(104, 104, 104); // Window initialize bool _initialized = false; // prevent double initialization when restore from minimized state void initializeWindowUI(); virtual void showEvent(QShowEvent* event) override; // Widget list QVBoxLayout* _stretchLayout = nullptr; QWidget* _windowWidget = nullptr; QWidget* _windowBorder = nullptr; QGraphicsDropShadowEffect* _windowShadow = nullptr; QWidget* _windowBtnWidget = nullptr; QHBoxLayout* _windowBtnLayout = nullptr; QPushButton* _minimizeBtn = nullptr; QPushButton* _maximizeBtn = nullptr; QPushButton* _closeBtn = nullptr; // Window size control LUI_WINDOW_ATTRIBUTES _attributes = LUI_WINDOW_NO_ATTRIBUTES; bool _maximized = false; QRect _lastWindowGeometry; virtual void resizeEvent(QResizeEvent* event) override; void controlWindowScale(); // User interaction control enum MOUSE_STATE { MOUSE_STATE_NONE = 0, MOUSE_STATE_RESIZE_LEFT = 1 << 0, MOUSE_STATE_RESIZE_TOP = 1 << 1, MOUSE_STATE_RESIZE_RIGHT = 1 << 2, MOUSE_STATE_RESIZE_BOTTOM = 1 << 3 }; bool _mousePressed = false; int _mouseState = MOUSE_STATE_NONE; QPointF _lastMousePosition; void updateMouseState(QMouseEvent* event); virtual void mousePressEvent(QMouseEvent* event) override; virtual void mouseReleaseEvent(QMouseEvent* event) override; virtual void mouseMoveEvent(QMouseEvent* event) override; public: QWidget* windowWidget() const { return _windowWidget; } LUI_WINDOW_ATTRIBUTES getWindowAttributes(); void setWindowAttributes(unsigned int attributes); };