traintastic/client/src/mainwindow.hpp

168 Zeilen
4.9 KiB
C++

/**
* client/src/mainwindow.hpp
*
* This file is part of the traintastic source code.
*
* Copyright (C) 2019-2024 Reinder Feenstra
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef TRAINTASTIC_CLIENT_MAINWINDOW_HPP
#define TRAINTASTIC_CLIENT_MAINWINDOW_HPP
#include <QMainWindow>
#include <QMap>
#include "network/objectptr.hpp"
#include "subwindow/subwindowtype.hpp"
class MdiArea;
class MainWindowStatusBar;
class QMdiSubWindow;
class QSplitter;
class QActionGroup;
class QToolButton;
class SubWindow;
class Connection;
class AbstractProperty;
class ObjectEditSubWindow;
class HardwareListSubWindow;
class LuaScriptsSubWindow;
class ServerSettingsSubWindow;
class ServerLogWidget;
class NewWorldWizard;
class IntroductionWizard;
class AddInterfaceWizard;
class NewBoardWizard;
class WorldListDialog;
class BlockHighlight;
class MainWindow final : public QMainWindow
{
Q_OBJECT
protected:
std::shared_ptr<Connection> m_connection;
ObjectPtr m_world;
bool m_newWorldRequested = false;
std::unique_ptr<WorldListDialog> m_loadWorldDialog;
struct
{
std::unique_ptr<AddInterfaceWizard> addInterface;
std::unique_ptr<NewWorldWizard> newWorld;
} m_wizard;
int m_clockRequest;
ObjectPtr m_clock;
QSplitter* m_splitter;
MdiArea* m_mdiArea;
MainWindowStatusBar* m_statusBar;
ServerLogWidget* m_serverLog;
QMdiSubWindow* m_clockWindow = nullptr;
QMap<QString, SubWindow*> m_subWindows;
QMdiSubWindow* m_trainAndRailVehiclesSubWindow = nullptr;
BlockHighlight* m_blockHighlight;
// Main menu:
QAction* m_actionConnectToServer;
QAction* m_actionDisconnectFromServer;
QAction* m_actionNewWorld;
QAction* m_actionLoadWorld;
QAction* m_actionSaveWorld;
QAction* m_actionCloseWorld;
QAction* m_actionImportWorld;
QAction* m_actionExportWorld;
QMenu* m_menuWorld;
QMenu* m_menuConnection;
QAction* m_worldOnlineAction;
QAction* m_worldOfflineAction;
QMenu* m_menuPower;
QAction* m_worldPowerOnAction;
QAction* m_worldPowerOffAction;
QAction* m_worldStopAction;
QAction* m_worldRunAction;
QAction* m_clockAction;
QAction* m_worldMuteMenuAction;
QAction* m_worldNoSmokeMenuAction;
QAction* m_worldEditAction;
QAction* m_worldSimulationAction;
QMenu* m_menuObjects;
QAction* m_actionLuaScript;
QAction* m_actionFullScreen;
QAction* m_actionViewToolbar;
QAction* m_actionClock;
QMenu* m_menuServer;
QAction* m_actionServerSettings;
QAction* m_actionServerRestart;
QAction* m_actionServerShutdown;
QAction* m_actionServerLog;
QMenu* m_menuProgramming;
QAction* m_actionAddInterfaceWizard;
// Main toolbar:
QToolBar* m_toolbar;
QToolButton* m_worldOnlineOfflineToolButton;
QToolButton* m_worldPowerOnOffToolButton;
QAction* m_worldMuteToolbarAction;
QAction* m_worldNoSmokeToolbarAction;
QByteArray m_beforeFullScreenGeometry;
void closeEvent(QCloseEvent* event) final;
void changeEvent(QEvent* event) final;
void worldChanged();
void updateWindowTitle();
void addSubWindow(const QString& windowId, SubWindow* window);
protected slots:
void disconnectFromServer();
void loadWorld();
void toggleFullScreen();
void viewClockWindow(bool value);
void toggleServerLog();
void showAbout();
void connectionStateChanged();
void updateActions();
void worldStateChanged(int64_t value);
public:
inline static MainWindow* instance = nullptr;
MainWindow(QWidget *parent = nullptr);
~MainWindow() final;
BlockHighlight& blockHighlight()
{
return *m_blockHighlight;
}
const std::shared_ptr<Connection>& connection() { return m_connection; }
const ObjectPtr& world() const;
const ObjectPtr& worldClock() const { return m_clock; }
IntroductionWizard* showIntroductionWizard();
void showAddInterfaceWizard();
NewBoardWizard* showNewBoardWizard(const ObjectPtr& board);
void showLuaScriptsList();
public slots:
void connectToServer(const QString& url = QString());
void showObject(const ObjectPtr& object, SubWindowType flags = SubWindowType::Object);
void showObject(const QString& id, const QString& title = "", SubWindowType flags = SubWindowType::Object);
signals:
void worldClockChanged();
};
#endif