// src/PlayerControls.h #pragma once #include #include #include #include #include #include #include "VisualizerWidget.h" #include "CommonWidgets.h" 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 isTrails() const { return m_checkTrails->isChecked(); } bool isAlbumColors() const { return m_checkAlbumColors->isChecked(); } bool isShadow() const { return m_checkShadow->isChecked(); } bool isMirrored() const { return m_checkMirrored->isChecked(); } int getBins() const { return m_sliderBins->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 trails, bool albumColors, bool shadow, bool mirrored, int bins, float brightness, int granularity, int detail, float strength, int bpmScaleIndex); signals: void paramsChanged(bool glass, bool focus, bool trails, bool albumColors, bool shadow, bool mirrored, float hue, float contrast, float brightness, int granularity, int detail, float strength); 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_checkTrails; QCheckBox* m_checkAlbumColors; QCheckBox* m_checkShadow; QCheckBox* m_checkMirrored; XYPad* m_padDsp; XYPad* m_padColor; QSlider* m_sliderBins; QLabel* m_lblBins; 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; };