// src/PlayerControls.h #pragma once #include "CommonWidgets.h" #include "VisualizerWidget.h" #include #include #include #include #include #include class PlaybackWidget : public QWidget { Q_OBJECT public: PlaybackWidget(QWidget *parent = nullptr); void setPlaying(bool playing); void updateSeek(float pos); signals: void playClicked(); void pauseClicked(); void nextClicked(); void prevClicked(); void seekChanged(float pos); void settingsClicked(); private slots: void onSeekPressed(); void onSeekReleased(); void onPlayToggle(); private: QSlider *m_seekSlider; bool m_seeking = false; bool m_isPlaying = false; QPushButton *m_btnPlay; }; class SettingsWidget : public QWidget { Q_OBJECT public: SettingsWidget(QWidget *parent = nullptr); bool isGlass() const { return m_checkGlass->isChecked(); } bool isFocus() const { return m_checkFocus->isChecked(); } bool isAlbumColors() const { return m_checkAlbumColors->isChecked(); } bool isMirrored() const { return m_checkMirrored->isChecked(); } int getBins() const { return m_sliderBins->value(); } int getFps() const { return m_sliderFps->value(); } float getBrightness() const { return m_brightness; } int getGranularity() const { return m_sliderGranularity->value(); } int getDetail() const { return m_sliderDetail->value(); } float getStrength() const { return m_strength; } // Returns the multiplier (e.g., 1.0 for 1/4, 0.5 for 1/2) float getBpmScale() const; int getBpmScaleIndex() const; void setParams(bool glass, bool focus, bool albumColors, bool mirrored, int bins, int fps, float brightness, int granularity, int detail, float strength, int bpmScaleIndex); signals: void paramsChanged(bool glass, bool focus, bool albumColors, bool mirrored, float hue, float contrast, float brightness, int granularity, int detail, float strength); void fpsChanged(int fps); void dspParamsChanged(int fft, int hop); void binsChanged(int n); void bpmScaleChanged(float scale); void closeClicked(); private slots: void emitParams(); void onDspPadChanged(float x, float y); void onColorPadChanged(float x, float y); void onBinsChanged(int val); void onBrightnessChanged(int val); void onSmoothingChanged(int val); void onBpmScaleChanged(int index); private: QCheckBox *m_checkGlass; QCheckBox *m_checkFocus; QCheckBox *m_checkAlbumColors; QCheckBox *m_checkMirrored; XYPad *m_padDsp; XYPad *m_padColor; QSlider *m_sliderBins; QLabel *m_lblBins; QSlider *m_sliderFps; QLabel *m_lblFps; QSlider *m_sliderBrightness; QLabel *m_lblBrightness; QSlider *m_sliderGranularity; QLabel *m_lblGranularity; QSlider *m_sliderDetail; QLabel *m_lblDetail; QSlider *m_sliderStrength; QLabel *m_lblStrength; QComboBox *m_comboBpmScale; float m_hue = 0.9f; float m_contrast = 1.0f; float m_brightness = 1.0f; int m_granularity = 33; int m_detail = 50; float m_strength = 0.0f; int m_fft = 4096; int m_hop = 1024; int m_bins = 26; }; class PlayerPage : public QWidget { Q_OBJECT public: PlayerPage(QWidget *parent = nullptr); VisualizerWidget *visualizer() { return m_visualizer; } PlaybackWidget *playback() { return m_playback; } SettingsWidget *settings() { return m_settings; } void setFullScreen(bool fs); signals: void toggleFullScreen(); protected: void resizeEvent(QResizeEvent *event) override; private slots: void toggleOverlay(); void closeOverlay(); private: VisualizerWidget *m_visualizer; PlaybackWidget *m_playback; SettingsWidget *m_settings; OverlayWidget *m_overlay; };