Commit 608daefa authored by Bryant's avatar Bryant

Refactored QGC startup so that MainWindow::instance() is usable everywhere....

Refactored QGC startup so that MainWindow::instance() is usable everywhere. This was required to get the styling working properly for ChartPlot.
parent 8e05f821
......@@ -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();
}
/**
......
......@@ -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<LinkInterface*> 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();
}
......
......@@ -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,
......
......@@ -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)));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment