#pragma once #include #include #include "uisocket.h" #include "data/project.h" #include "ui/patterneditormodel.h" class QUndoStack; namespace Ui { class MainWindow; } namespace Xybrid { namespace Data { class Node; } class MainWindow : public QMainWindow { friend class Data::Graph; Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr, const QString& fileName = QString()); ~MainWindow() override; static std::unordered_set openWindows; static MainWindow* projectWindow(const QString& fileName); private: Ui::MainWindow* ui; UISocket* socket; std::shared_ptr project; std::shared_ptr editingPattern; std::shared_ptr editingSample; QUndoStack* undoStack; std::vector recentFileActions; void openProject(const QString& fileName, bool failSilent = false); void openRecentProject(size_t idx); bool promptSave(); void onNewProjectLoaded(); void updatePatternLists(); bool selectPatternForEditing(Data::Pattern*); void selectSampleForEditing(std::shared_ptr); void openGraph(const std::shared_ptr&); void openNodeUI(const std::shared_ptr&); void openPatternProperties(const std::shared_ptr&); void updateTitle(); void updateFont(); void setSongInfoPaneExpanded(bool); void setFloater(QWidget* = nullptr); void render(); public: const std::shared_ptr& getProject() const { return project; } int patternSelection(int = -100); int sequenceSelection(int = -100); void playbackPosition(int seq, int row); inline UISocket* uiSocket() { return socket; } protected: void resizeEvent(QResizeEvent*) override; void closeEvent(QCloseEvent*) override; bool eventFilter(QObject *obj, QEvent *event) override; public slots: void tryFocus(); void menuFileNew(); void menuFileOpen(); void menuFileSave(); void menuFileSaveAs(); void menuFileExport(); void menuFileExportAs(); void menuFileNewWindow(); void menuSettings(); void menuQuit(); signals: void projectLoaded(); }; }