diff --git a/src/QGCCore.cc b/src/QGCCore.cc index bee9f20268017887ced9878ca848bcc1414b71a0..221071d4c7312b2135be2461e6a25c1863a43bb9 100644 --- a/src/QGCCore.cc +++ b/src/QGCCore.cc @@ -129,25 +129,24 @@ QGCCore::QGCCore(int &argc, char* argv[]) : QApplication(argc, argv) // setFont(fontDatabase.font(fontFamilyName, "Roman", 12)); // Start the comm link manager - splashScreen->showMessage(tr("Starting Communication Links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); + splashScreen->showMessage(tr("Starting communication links"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); startLinkManager(); // Start the UAS Manager - splashScreen->showMessage(tr("Starting UAS Manager"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); + splashScreen->showMessage(tr("Starting UAS manager"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); startUASManager(); // Start the user interface - splashScreen->showMessage(tr("Starting User Interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); - // Start UI + splashScreen->showMessage(tr("Starting user interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); + + // The first call to instance() creates the MainWindow, so make sure it's passed the splashScreen. + mainWindow = MainWindow::instance(splashScreen); // Connect links // to make sure that all components are initialized when the // first messages arrive UDPLink* udpLink = new UDPLink(QHostAddress::Any, 14550); MainWindow::instance()->addLink(udpLink); - // Listen on Multicast-Address 239.255.77.77, Port 14550 - //QHostAddress * multicast_udp = new QHostAddress("239.255.77.77"); - //UDPLink* udpLink = new UDPLink(*multicast_udp, 14550); #ifdef OPAL_RT // Add OpalRT Link, but do not connect @@ -157,8 +156,6 @@ QGCCore::QGCCore(int &argc, char* argv[]) : QApplication(argc, argv) MAVLinkSimulationLink* simulationLink = new MAVLinkSimulationLink(":/demo-log.txt"); simulationLink->disconnect(); - mainWindow = MainWindow::instance(splashScreen); - // Remove splash screen splashScreen->finish(mainWindow); @@ -211,7 +208,7 @@ QGCCore::~QGCCore() // then links delete LinkManager::instance(); // Finally the main window - delete MainWindow::instance(); + delete MainWindow::instance(); } /** diff --git a/src/ui/MainWindow.cc b/src/ui/MainWindow.cc index 025760f6c975daca7335b10ead6f3221c0809a2c..c29a4c62b47bad1d7d92fb6ae38778b96854e166 100644 --- a/src/ui/MainWindow.cc +++ b/src/ui/MainWindow.cc @@ -79,14 +79,15 @@ const QString MainWindow::defaultLightStyle = ":files/styles/style-light.css"; MainWindow* MainWindow::instance(QSplashScreen* screen) { static MainWindow* _instance = 0; - if(_instance == 0) + if (_instance == 0) { _instance = new MainWindow(); - if (screen) connect(_instance, SIGNAL(initStatusChanged(QString)), screen, SLOT(showMessage(QString))); - - /* Set the application as parent to ensure that this object - * will be destroyed when the main application exits */ - //_instance->setParent(qApp); + if (screen) + { + connect(_instance, SIGNAL(initStatusChanged(QString,int,QColor)), + screen, SLOT(showMessage(QString,int,QColor))); + } + _instance->init(); } return _instance; } @@ -108,15 +109,19 @@ MainWindow::MainWindow(QWidget *parent): darkStyleFileName(defaultDarkStyle), lightStyleFileName(defaultLightStyle), autoReconnect(false), - lowPowerMode(false) + lowPowerMode(false), + dockWidgetTitleBarEnabled(true), + isAdvancedMode(false) { hide(); - dockWidgetTitleBarEnabled = true; - isAdvancedMode = false; - emit initStatusChanged("Loading UI Settings.."); +} + +void MainWindow::init() +{ + emit initStatusChanged(tr("Loading settings"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); loadSettings(); - emit initStatusChanged("Loading Style."); + emit initStatusChanged(tr("Loading style"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); qApp->setStyle("plastique"); if (currentStyle == QGC_MAINWINDOW_STYLE_LIGHT) { @@ -151,8 +156,7 @@ MainWindow::MainWindow(QWidget *parent): } settings.sync(); - - emit initStatusChanged("Setting up user interface."); + emit initStatusChanged(tr("Setting up user interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); // Setup user interface ui.setupUi(this); @@ -196,18 +200,18 @@ MainWindow::MainWindow(QWidget *parent): setStatusBar(customStatusBar); statusBar()->setSizeGripEnabled(true); - emit initStatusChanged("Building common widgets."); + emit initStatusChanged(tr("Building common widgets"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); buildCommonWidgets(); connectCommonWidgets(); - emit initStatusChanged("Building common actions."); + emit initStatusChanged(tr("Building common actions"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); // Create actions connectCommonActions(); // Populate link menu - emit initStatusChanged("Populating link menu"); + emit initStatusChanged(tr("Populating link menu"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); QList links = LinkManager::instance()->getLinks(); foreach(LinkInterface* link, links) { @@ -217,19 +221,19 @@ MainWindow::MainWindow(QWidget *parent): connect(LinkManager::instance(), SIGNAL(newLink(LinkInterface*)), this, SLOT(addLink(LinkInterface*))); // Connect user interface devices - emit initStatusChanged("Initializing joystick interface."); + emit initStatusChanged(tr("Initializing joystick interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); joystickWidget = 0; joystick = new JoystickInput(); #ifdef MOUSE_ENABLED_WIN - emit initStatusChanged("Initializing 3D mouse interface."); + emit initStatusChanged(tr("Initializing 3D mouse interface", Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); mouseInput = new Mouse3DInput(this); mouse = new Mouse6dofInput(mouseInput); #endif //MOUSE_ENABLED_WIN #if MOUSE_ENABLED_LINUX - emit initStatusChanged("Initializing 3D mouse interface."); + emit initStatusChanged(tr("Initializing 3D mouse interface"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); mouse = new Mouse6dofInput(this); connect(this, SIGNAL(x11EventOccured(XEvent*)), mouse, SLOT(handleX11Event(XEvent*))); @@ -251,12 +255,12 @@ MainWindow::MainWindow(QWidget *parent): // Initialize window state windowStateVal = windowState(); - emit initStatusChanged("Restoring last view state."); + emit initStatusChanged(tr("Restoring last view state"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); // Restore the window setup loadViewState(); - emit initStatusChanged("Restoring last window size."); + emit initStatusChanged(tr("Restoring last window size"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); // Restore the window position and size if (settings.contains(getWindowGeometryKey())) { @@ -285,7 +289,7 @@ MainWindow::MainWindow(QWidget *parent): connect(&windowNameUpdateTimer, SIGNAL(timeout()), this, SLOT(configureWindowName())); windowNameUpdateTimer.start(15000); - emit initStatusChanged("Done."); + emit initStatusChanged(tr("Done"), Qt::AlignLeft | Qt::AlignBottom, QColor(62, 93, 141)); show(); } diff --git a/src/ui/MainWindow.h b/src/ui/MainWindow.h index 91197a619a1e427b9de791689ad244dd855f5644..3b5a63562852aa57ee3b3078b336f4b6b6cacf38 100644 --- a/src/ui/MainWindow.h +++ b/src/ui/MainWindow.h @@ -97,15 +97,38 @@ class MainWindow : public QMainWindow Q_OBJECT public: + /** + * A static function for obtaining the sole instance of the MainWindow. The screen + * argument is only important on the FIRST call to this function. The provided splash + * screen is updated with some status messages that are emitted during init(). This + * function cannot be used within the MainWindow constructor! + */ static MainWindow* instance(QSplashScreen* screen = 0); + + /** + * Initializes the MainWindow. Some variables are initialized and the widget is hidden. + * Initialization of the MainWindow class really occurs in init(), which loads the UI + * and does everything important. The constructor is split in two like this so that + * the instance() is available for all classes. + */ + MainWindow(QWidget *parent = NULL); ~MainWindow(); + /** + * This function actually performs the non-trivial initialization of the MainWindow + * class. This is separate from the constructor because instance() won't work within + * code executed in the MainWindow constructor. + */ + void init(); + enum QGC_MAINWINDOW_STYLE { QGC_MAINWINDOW_STYLE_DARK, QGC_MAINWINDOW_STYLE_LIGHT }; + // Declare default dark and light stylesheets. These should be file-resource + // paths. static const QString defaultDarkStyle; static const QString defaultLightStyle; @@ -115,13 +138,13 @@ public: return currentStyle; } - /** @brief Get current light visual stylesheet */ + /** @brief Get current light visual stylesheet */ QString getLightStyleSheet() { return lightStyleFileName; } - /** @brief Get current dark visual stylesheet */ + /** @brief Get current dark visual stylesheet */ QString getDarkStyleSheet() { return darkStyleFileName; @@ -257,7 +280,7 @@ public slots: signals: void styleChanged(MainWindow::QGC_MAINWINDOW_STYLE newTheme); - void initStatusChanged(const QString& message); + void initStatusChanged(const QString& message, int alignment, const QColor &color); #ifdef MOUSE_ENABLED_LINUX /** @brief Forward X11Event to catch 3DMouse inputs */ void x11EventOccured(XEvent *event); @@ -276,8 +299,6 @@ public: protected: - MainWindow(QWidget *parent = 0); - typedef enum _VIEW_SECTIONS { VIEW_ENGINEER, diff --git a/src/ui/linechart/ChartPlot.cc b/src/ui/linechart/ChartPlot.cc index 1c6ab0793ea3cddb6cadd9ed5cda59401ba48635..49eddebf1b00dca883c06d2ffa79566fbaa442b7 100644 --- a/src/ui/linechart/ChartPlot.cc +++ b/src/ui/linechart/ChartPlot.cc @@ -53,10 +53,10 @@ ChartPlot::ChartPlot(QWidget *parent): } // Now that all objects have been initialized, color everything. - applyColorScheme(((MainWindow*)parent)->getStyle()); + applyColorScheme(MainWindow::instance()->getStyle()); // And make sure we're listening for future style changes - connect(parent, SIGNAL(styleChanged(MainWindow::QGC_MAINWINDOW_STYLE)), + connect(MainWindow::instance(), SIGNAL(styleChanged(MainWindow::QGC_MAINWINDOW_STYLE)), this, SLOT(applyColorScheme(MainWindow::QGC_MAINWINDOW_STYLE))); }