qtrocket/QtRocket.cpp
2023-04-22 17:37:41 -06:00

106 lines
2.0 KiB
C++

/// \cond
// C headers
// C++ headers
#include <thread>
// 3rd party headers
#include <QApplication>
#include <QLocale>
#include <QTranslator>
/// \endcond
// qtrocket headers
#include "QtRocket.h"
#include "gui/MainWindow.h"
#include "sim/ConstantAtmosphere.h"
#include "sim/ConstantGravityModel.h"
// Initialize static member data
QtRocket* QtRocket::instance = nullptr;
std::mutex QtRocket::mtx;
bool QtRocket::initialized = false;
// The gui worker thread
void guiWorker(int argc, char* argv[], int& ret)
{
QApplication a(argc, argv);
a.setWindowIcon(QIcon(":/qtrocket.png"));
// Start translation component.
// TODO: Only support US English at the moment. Anyone want to help translate?
QTranslator translator;
const QStringList uiLanguages = QLocale::system().uiLanguages();
for (const QString &locale : uiLanguages)
{
const QString baseName = "qtrocket_" + QLocale(locale).name();
if (translator.load(":/i18n/" + baseName))
{
a.installTranslator(&translator);
break;
}
}
// Go!
MainWindow w(QtRocket::getInstance());
w.show();
ret = a.exec();
}
QtRocket* QtRocket::getInstance()
{
if(!initialized)
{
init();
}
return instance;
}
void QtRocket::init()
{
std::lock_guard<std::mutex> lck(mtx);
if(!initialized)
{
instance = new QtRocket();
initialized = true;
}
}
QtRocket::QtRocket()
{
logger = utils::Logger::getInstance();
running = false;
atmosphere =
std::make_shared<sim::ConstantAtmosphere>();
gravity =
std::make_shared<sim::ConstantGravityModel>();
}
int QtRocket::run(int argc, char* argv[])
{
// Really should only start this thread once
if(!running)
{
running = true;
int ret = 0;
std::thread guiThread(guiWorker, argc, argv, std::ref(ret));
guiThread.join();
return ret;
}
return 0;
}
void QtRocket::addMotorModels(std::vector<model::MotorModel>& m)
{
for(const auto& i : m)
{
motorModels.push_back(i);
}
// TODO: Now clear any duplicates?
}