aluf/src/MainWindow.h

84 lines
2.2 KiB
C++

// src/MainWindow.h
#pragma once
#include <QMainWindow>
#include <QDockWidget>
#include <QListWidget>
#include <QStackedWidget>
#include <QTabWidget>
#include <QTimer>
#include <QThread>
#include <QPointer> // Required for QPointer
#include "AudioEngine.h"
#include "PlayerControls.h"
#include "CommonWidgets.h"
#include "Utils.h"
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QWidget* parent = nullptr);
~MainWindow();
void loadPath(const QString& path, bool recursive);
protected:
void closeEvent(QCloseEvent* event) override;
private slots:
void onOpenFile();
void onOpenFolder();
void initiatePermissionCheck();
void onPermissionsResult(bool granted);
void onTrackFinished();
void onTrackLoaded(bool success);
void onTrackDoubleClicked(QListWidgetItem* item);
void play();
void pause();
void nextTrack();
void prevTrack();
void seek(float pos);
void onDspChanged(int fft, int hop);
void onBinsChanged(int n);
void onToggleFullScreen();
void saveSettings();
void onMetadataLoaded(int index, const Utils::Metadata& meta);
// Visualizer Pull
void onSpectrumAvailable();
// Update Analyzer with new track data
void onTrackDataChanged(std::shared_ptr<TrackData> data);
private:
void initUi();
void loadIndex(int index);
void loadSettings();
QStackedWidget* m_stack;
WelcomeWidget* m_welcome;
PlayerPage* m_playerPage;
QDockWidget* m_dock;
QTabWidget* m_mobileTabs;
QListWidget* m_playlist;
// Audio System
AudioEngine* m_engine;
QThread* m_audioThread;
// Analysis System
AudioAnalyzer* m_analyzer;
QThread* m_analyzerThread;
struct TrackInfo {
QString path;
Utils::Metadata meta;
};
QVector<TrackInfo> m_tracks;
int m_currentIndex = -1;
enum class PendingAction { None, File, Folder };
PendingAction m_pendingAction = PendingAction::None;
QString m_settingsDir;
// FIX: Use QPointer for both loader and thread to prevent use-after-free
QPointer<Utils::MetadataLoader> m_metaLoader;
QPointer<QThread> m_metaThread;
bool m_visualizerUpdatePending = false;
};