text: #pragma once
  
  #ifndef TESTCUSTOMTAB_H
  #define TESTCUSTOMTAB_H
  
  #include "tfilepath.h"
  #include "toonzqt/menubarcommand.h"
  
  #if QT_VERSION >= 0x050000
  #include <QtWidgets/QMainWindow>
  #else
  #include <QtGui/QMainWindow>
  #endif
  #include <map>
  #include <QAction>
  #include <QString>
  
  #include "../toonzqt/tdockwindows.h"
  
  class QStackedWidget;
  class TPanel;
  class UpdateChecker;
  class ComboViewerPanel;
  class TopBar;
  //-----------------------------------------------------------------------------
  
  class Room final : public TMainWindow {
    Q_OBJECT
  
    TFilePath m_path;
    QString m_name;
  
  public:
  #if QT_VERSION >= 0x050500
    Room(QWidget *parent = 0, Qt::WindowFlags flags = 0)
  #else
    Room(QWidget *parent = 0, Qt::WFlags flags = 0)
  #endif
        : TMainWindow(parent, flags) {
    }
  
    ~Room() {}
  
    TFilePath getPath() const { return m_path; }
    void setPath(TFilePath path) { m_path = path; }
  
    QString getName() const { return m_name; }
    void setName(QString name) { m_name = name; }
  
    void save();
    void load(const TFilePath &fp);
  };
  
  //-----------------------------------------------------------------------------
  
  class MainWindow final : public QMainWindow {
    Q_OBJECT
  
    bool m_saveSettingsOnQuit;
    bool m_startupPopupShown = false;
    int m_oldRoomIndex;
    QString m_currentRoomsChoice;
    UpdateChecker *m_updateChecker;
  
    TopBar *m_topBar;
  
    QActionGroup *m_toolsActionGroup;
  
    QStackedWidget *m_stackedWidget;
  
    /*-- show layout name in the title bar --*/
    QString m_layoutName;
  
  public:
  #if QT_VERSION >= 0x050500
    MainWindow(const QString &argumentLayoutFileName, QWidget *parent = 0,
               Qt::WindowFlags flags = 0);
  #else
    MainWindow(const QString &argumentLayoutFileName, QWidget *parent = 0,
               Qt::WFlags flags = 0);
  #endif
    ~MainWindow();
  
    void startupFloatingPanels();
  
    void onQuit();
    void onUndo();
    void onRedo();
    void onNewScene();
    void onLoadScene();
    void onLoadSubScene();
    void resetRoomsLayout();
    void maximizePanel();
    void fullScreenWindow();
    void autofillToggle();
    void onUpgradeTabPro();
    void onAbout();
    void onOpenOnlineManual();
    void onOpenWhatsNew();
    void onOpenCommunityForum();
    void onOpenReportABug();
    void checkForUpdates();
    int getRoomCount() const;
    Room *getRoom(int index) const;
    Room *getRoomByName(QString &roomName);
  
    Room *getCurrentRoom() const;
    void refreshWriteSettings();
  
    void onNewVectorLevelButtonPressed();
    void onNewToonzRasterLevelButtonPressed();
    void onNewRasterLevelButtonPressed();
    void clearCacheFolder();
  
    QString getLayoutName() { return m_layoutName; }
  
  protected:
    void showEvent(QShowEvent *) override;
    void closeEvent(QCloseEvent *) override;
    void readSettings(const QString &layoutFileName);
    void writeSettings();
  
  private:
    /*!Must be call before readSettings().*/
    void defineActions();
    /*
    Room *createPaintRoom();
    Room *createAnimationRoom();
    Room *createBrowserRoom();
    Room *createPltEditRoom();
    Room *createFarmRoom();
    */
    Room *createCleanupRoom();
    Room *createPltEditRoom();
    Room *createInknPaintRoom();
    Room *createXsheetRoom();
    Room *createBatchesRoom();
    Room *createBrowserRoom();
  
    QAction *createAction(const char *id, const char *name,
                          const QString &defaultShortcut,
                          CommandType type        = MenuFileCommandType,
                          const char *iconSVGName = "");
    QAction *createRightClickMenuAction(const char *id, const char *name,
                                        const QString &defaultShortcut,
                                        const char *iconSVGName = "");
    QAction *createMenuFileAction(const char *id, const char *name,
                                  const QString &defaultShortcut,
                                  const char *iconSVGName = "");
    QAction *createMenuEditAction(const char *id, const char *name,
                                  const QString &defaultShortcut,
                                  const char *iconSVGName = "");
    QAction *createMenuScanCleanupAction(const char *id, const char *name,
                                         const QString &defaultShortcut,
                                         const char *iconSVGName = "");
    QAction *createMenuLevelAction(const char *id, const char *name,
                                   const QString &defaultShortcut,
                                   const char *iconSVGName = "");
    QAction *createMenuXsheetAction(const char *id, const char *name,
                                    const QString &defaultShortcut,
                                    const char *iconSVGName = "");
    QAction *createMenuCellsAction(const char *id, const char *name,
                                   const QString &defaultShortcut,
                                   const char *iconSVGName = "");
    QAction *createMenuViewAction(const char *id, const char *name,
                                  const QString &defaultShortcut,
                                  const char *iconSVGName = "");
    QAction *createMenuWindowsAction(const char *id, const char *name,
                                     const QString &defaultShortcut,
                                     const char *iconSVGName = "");
  
    QAction *createMenuPlayAction(const char *id, const char *name,
                                  const QString &defaultShortcut,
                                  const char *iconSVGName = "");
    QAction *createMenuRenderAction(const char *id, const char *name,
                                    const QString &defaultShortcut,
                                    const char *iconSVGName = "");
    QAction *createMenuHelpAction(const char *id, const char *name,
                                  const QString &defaultShortcut,
                                  const char *iconSVGName = "");
    QAction *createRGBAAction(const char *id, const char *name,
                              const QString &defaultShortcut,
                              const char *iconSVGName = "");
    QAction *createFillAction(const char *id, const char *name,
                              const QString &defaultShortcut,
                              const char *iconSVGName = "");
    QAction *createMenuAction(const char *id, const char *name,
                              QList<QString> list);
    QAction *createToggle(const char *id, const char *name,
                          const QString &defaultShortcut, bool startStatus,
                          CommandType type, const char *iconSVGName = "");
    QAction *createToolAction(const char *id, const char *iconName,
                              const char *name, const QString &defaultShortcut);
    QAction *createViewerAction(const char *id, const char *name,
                                const QString &defaultShortcut,
                                const char *iconSVGName = "");
    // For command bar, no shortcut keys
    QAction *createVisualizationButtonAction(const char *id, const char *name,
                                             const char *iconSVGName = "");
  
    QAction *createMiscAction(const char *id, const char *name,
                              const char *defaultShortcut);
    QAction *createToolOptionsAction(const char *id, const char *name,
                                     const QString &defaultShortcut);
    QAction *createStopMotionAction(const char *id, const char *name,
                                    const QString &defaultShortcut,
                                    const char *iconSVGName = "");
  
  protected slots:
    void onCurrentRoomChanged(int newRoomIndex);
    void onIndexSwapped(int firstIndex, int secondIndex);
    void insertNewRoom();
    void deleteRoom(int index);
    void renameRoom(int index, const QString name);
    void onMenuCheckboxChanged();
  
    // make InkCheck and Ink#1Check exclusive.
    void onInkCheckTriggered(bool on);
    void onInk1CheckTriggered(bool on);
  
    void onUpdateCheckerDone(bool);
  
  public slots:
    /*--- タイトルにシーン名を入れる ---*/
    void changeWindowTitle();
    /*--- FlipモジュールでタイトルバーにロードしたLevel名を表示 ---*/
    /*--- Cleanupモジュールでタイトルバーに進捗を表示 ---*/
    void changeWindowTitle(QString &);
  
  signals:
    void exit(bool &);
  };
  
  class RecentFiles {
    friend class StartupPopup;
    QList<QString> m_recentScenes;
    QList<QString> m_recentSceneProjects;
    QList<QString> m_recentLevels;
    QList<QString> m_recentFlipbookImages;
  
    RecentFiles();
  
  public:
    enum FileType { Scene, Level, Flip, None };
  
    static RecentFiles *instance();
    ~RecentFiles();
  
    void addFilePath(QString path, FileType fileType, QString projectName = 0);
    void moveFilePath(int fromIndex, int toIndex, FileType fileType);
    void removeFilePath(int fromIndex, FileType fileType);
    QString getFilePath(int index, FileType fileType) const;
    QString getFileProject(QString fileName) const;
    QString getFileProject(int index) const;
    void clearRecentFilesList(FileType fileType);
    void loadRecentFiles();
    void saveRecentFiles();
  
  protected:
    void refreshRecentFilesMenu(FileType fileType);
    QList<QString> getFilesNameList(FileType fileType);
  };
  
  #endif  // TESTCUSTOMTAB_H
  