#ifndef BaseWidgetMenu_H #define BaseWidgetMenu_H #include "YSGraphic_Core/base/Node.hpp" #include "YSGraphic_Core/base/RollObject.h" #include "YSGraphic_Core/export.h" #include #include #include class QHBoxLayout; class QVBoxLayout; class AbstractTextButton; class AbstractMenuButton; class BaseWidgetMenu : public QWidget, public YSG::Node { Q_OBJECT public: explicit BaseWidgetMenu(QWidget* parent); QVBoxLayout *mMainLayout; QHBoxLayout *mFirstLayout; QHBoxLayout *mSecondLayout; AbstractMenuButton *parentBtn{}; YSG::RollObject mRollObject; BaseWidgetMenu* createSubWidgetMenu(AbstractMenuButton * btn); void esc(BaseWidgetMenu* menu); void confirm(); void addMenuButtonOnLayout1(const QVector& buttons, int stretch); void addMenuButtonOnLayout2(const QVector& buttons, int stretch); void addMenuButtonOnLayout1(const QVector& buttons); void addMenuButtonOnLayout2(const QVector& buttons); signals: void showThat(); void hideThat(); protected: void paintEvent(QPaintEvent *event) override; void keyPressEvent(QKeyEvent *event) override; void showEvent(QShowEvent *event) override; void hideEvent(QHideEvent *event) override; }; class AbstractMenuButton : public QPushButton { public: AbstractMenuButton() = default; BaseWidgetMenu *mParentMenu{}; BaseWidgetMenu *mOwnMenu{}; bool mClickHide = true; void init(int fontSize){ setFocusPolicy(Qt::NoFocus); setFlat(true); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setCheckable(true); setChecked(false); QFont font; font.setPixelSize(fontSize); setFont(font); } void mousePressEvent(QMouseEvent *e) override { mParentMenu->mRollObject.setCur(this); mParentMenu->confirm(); } void hideRoot(); }; class MenuButton : public AbstractMenuButton{ public: std::function mClick = nullptr; MenuButton(const QString &text, int fontSize, const std::function &click){ mClick = click; setText(text); init(fontSize); connect(this, &AbstractMenuButton::clicked, [this](){ mClick(); }); } }; class DoubleTextMenuButton : public AbstractMenuButton{ public: std::function mSwitchClick = nullptr; QString mText1, mText2; bool mIsText1 = false; DoubleTextMenuButton(const QString &text1, const QString &text2, int fontSize, const std::function &click){ mClickHide = false; mText1 = text1; mText2 = text2; mSwitchClick = click; setText(text1); init(fontSize); connect(this, &AbstractMenuButton::clicked, [this](){ mIsText1 = !mIsText1; mSwitchClick(mIsText1); if(mIsText1){ setText(mText2); } else { setText(mText1); } }); } }; class ValueMenuButton : public AbstractMenuButton{ public: double mValue{}; QString mText; std::function mValueChanged; void setValue(double value){ mValue = value; setText(mText.arg(mValue)); } ValueMenuButton(const QString &text, int fontSize, const std::function &valueChanged, double firstValue) { mText = text; init(fontSize); mValueChanged = valueChanged; setValue(firstValue); } }; // class ValueMenuButton : public AbstractMenuButton{ // public: // std::function mHandleUp = nullptr; // std::function mHandleDown = nullptr; // QString mText; // double mValue{}; // ValueMenuButton(const QString &text, int fontSize, // const std::function &handleUp, // const std::function &handleDown){ // mClickHide = false; // mText = text; // mHandleUp = handleUp; // mHandleDown = handleDown; // setValue(mValue); // init(fontSize); // } // void setValue(double value){ // mValue = value; // setText(mText.arg(mValue)); // } // }; #endif