#pragma once #include class QDoubleSpinBox; class QSlider; class QSpinBox; namespace gui { class Float01ParamControl final : public QWidget { Q_OBJECT public: explicit Float01ParamControl(QWidget* parent = nullptr); void setValue01(double v); double value01() const; void setEnabled(bool on); signals: void valueChanged01(double v); private: void syncFromSlider(); void syncFromSpin(); QSlider* m_slider = nullptr; QDoubleSpinBox* m_spin = nullptr; bool m_block = false; }; class Vec2ParamControl final : public QWidget { Q_OBJECT public: explicit Vec2ParamControl(QWidget* parent = nullptr); void setValue(int x, int y); [[nodiscard]] int x() const; [[nodiscard]] int y() const; [[nodiscard]] bool isActivelyEditing() const; void setEnabled(bool on); signals: void valueChanged(int x, int y); private: void emitIfChanged(); QSpinBox* m_sx = nullptr; QSpinBox* m_sy = nullptr; bool m_block = false; int m_lastX = 0; int m_lastY = 0; }; /// 世界坐标等:可直接键盘输入小数,带宽幅 class Vec2DoubleParamControl final : public QWidget { Q_OBJECT public: explicit Vec2DoubleParamControl(QWidget* parent = nullptr); void setValue(double x, double y); [[nodiscard]] double x() const; [[nodiscard]] double y() const; [[nodiscard]] bool isActivelyEditing() const; void setEnabled(bool on); signals: void valueChanged(double x, double y); private: void emitIfChanged(); QDoubleSpinBox* m_sx = nullptr; QDoubleSpinBox* m_sy = nullptr; bool m_block = false; double m_lastX = 0.0; double m_lastY = 0.0; }; } // namespace gui