You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Kernel/FITKAppFramework/FITKAppFramework.cpp

313 lines
8.3 KiB
C++

#include "FITKAppFramework.h"
#include "FITKGlobalData.h"
#include "FITKComponents.h"
#include "FITKAbstractMainWinGenerator.h"
#include "FITKAbstractGlobalDataFactory.h"
#include "FITKAbstractAutoSaver.h"
#include "FITKComponentFactory.h"
#include "FITKSignalTransfer.h"
#include "FITKGlobalEventFilter.h"
#include "FITKAppSettings.h"
#include "FITKCommandLineHandler.h"
#include "FITKAbstractPythonRegister.h"
#include "FITKMessage.h"
#include "FITKCopyrightDialog.h"
#include "FITKProgramTaskManager.h"
#include "FITKWorkBenchHandler.h"
#include "FITKAbstractSysChecker.h"
#include "FITK_Kernel/FITKCore/FITKThreadPool.h"
#include "FITK_Kernel/FITKCore/FITKDataRepo.h"
#include <QWidget>
#include <QMessageBox>
namespace AppFrame
{
FITKApplication::FITKApplication(int &argc, char **argv)
:QApplication(argc, argv)
{
//创建golbalData
_golbalData = new FITKGlobalData;
_components = new FITKCmponents;
_signalTransfer = new FITKSignalTransfer(this);
_programTaskManager = new FITKProgramTaskManeger;
Core::FITKThreadPool::getInstance()->init(_signalTransfer);
//全局事件捕获添加
_globalEvent = new FITKGlobalEventFilter();
this->installEventFilter(_globalEvent);
this->applicationDirPath();
}
FITKApplication::~FITKApplication()
{
Core::FITKThreadPool::getInstance()->wait();
if (_programTaskManager) delete _programTaskManager;
if (_signalTransfer) delete _signalTransfer;
if (_golbalData) delete _golbalData;
if (_components) delete _components;
if (_gDataFactory) delete _gDataFactory;
if (_componentsFactory) delete _componentsFactory;
if (_mwGenerator) delete _mwGenerator;
if (_globalEvent)delete _globalEvent;
if (_commandLineHandler) delete _commandLineHandler;
if (_workbenchHandler) delete _workbenchHandler;
if (_settings) delete _settings;
if (_pyReg) delete _pyReg;
if (_autoSaver) delete _autoSaver;
}
void FITKApplication::checkSystem(FITKAbstractSysChecker* checker)
{
if (checker == nullptr) return;
QStringList error = checker->check();
_passSystemCheck = error.isEmpty();
delete checker;
//弹出对话框
if(!_passSystemCheck)
QMessageBox::critical(nullptr, "Error", error.join("\n"));
}
int FITKApplication::exec()
{
if (!_passSystemCheck) return -2;
//开始事件循环
if (!init())
return -1;
int e = 0;
//无界面
if (_commandLineHandler && _commandLineHandler->isNoGUI())
{
e = -1;
}
//有界面
else
{
#ifndef QT_DEBUG
// this->showCopyrightDlg();
#endif
//启动自动保存
if (_autoSaver) _autoSaver->start();
e = QApplication::exec();
}
//停止自动保存
if (_autoSaver)
{
_autoSaver->stop();
_autoSaver->finalize();
}
//写出配置文件读取在init函数实现
if (_settings)
_settings->write();
//workbench保存文件
if (_workbenchHandler && _workbenchHandler->workingInWorkBench())
_workbenchHandler->execOutput();
//尝试释放主界面
if (_golbalData && _golbalData->getMainWindow())
{
QWidget* mw = _golbalData->getMainWindow();
delete mw;
}
return e;
}
void FITKApplication::regMainWindowGenerator(FITKAbstractMainwindowGenerator* generator)
{
//注册主界面生成器
_mwGenerator = generator;
}
void FITKApplication::regGlobalDataFactory(FITKAbstractGlobalDataFactory* fac)
{
_gDataFactory = fac;
}
void FITKApplication::regCommandLineHandler(FITKCommandLineHandler* handler)
{
_commandLineHandler = handler;
}
AppFrame::FITKCommandLineHandler* FITKApplication::getCommandLineHandler()
{
return _commandLineHandler;
}
void FITKApplication::regAppSettings(FITKAppSettings* settings)
{
_settings = settings;
}
FITKAppSettings* FITKApplication::getAppSettings()
{
return _settings;
}
FITKGlobalData* FITKApplication::getGlobalData()
{
return _golbalData;
}
void FITKApplication::regComponentsFactory(FITKComponentFactory* fac)
{
_componentsFactory = fac;
}
void FITKApplication::regPythonRegister(FITKAbstractPythonRegister* pyreg)
{
if (pyreg == nullptr) return;
//已经存在则先删除
if (_pyReg != nullptr) delete _pyReg;
_pyReg = pyreg;
}
FITKCmponents* FITKApplication::getComponents()
{
return _components;
}
FITKSignalTransfer* FITKApplication::getSignalTransfer()
{
return _signalTransfer;
}
FITKProgramTaskManeger* FITKApplication::getProgramTaskManager()
{
return _programTaskManager;
}
void FITKApplication::addGolbalSignalProcesser(QObject* obj)
{
if (_signalTransfer == nullptr) return;
_signalTransfer->addSignalProcesser(obj);
}
void FITKApplication::addEventFilter(FITKAbstractEventFilter* filter)
{
if (_globalEvent)
_globalEvent->addEventFilter(filter);
}
void FITKApplication::regAutoSaver(FITKAbstractAutoSaver* saver)
{
_autoSaver = saver;
}
AppFrame::FITKAbstractAutoSaver* FITKApplication::getAutoSaver()
{
return _autoSaver;
}
bool FITKApplication::init()
{
if (!_passSystemCheck) return false;
static bool Inited = false;
if (Inited) return true;
//读取配置文件
if (_settings)
_settings->read();
//错误判断
if (!_golbalData || !_gDataFactory ||!_componentsFactory)
return false;
//生成全局数据
_gDataFactory->createData(_golbalData);
//加载qss
if (_mwGenerator)
{
_mwGenerator->loadQssStyle();
_mwGenerator->loadTranslatorQmFiles();
}
//加载全部组件
_componentsFactory->create();
//无界面
if (_commandLineHandler && _commandLineHandler->isNoGUI())
{
this->execCommand();
return true;
}
//有界面显示
if (!_mwGenerator) return false;
//加载qss
//bool loadqss = _mwGenerator->loadQssStyle();
//生成主界面
QWidget* w = _mwGenerator->genMainWindow();
if (!w) return false;
//最大化窗口
if (_mwGenerator->showMaximize())
w->showMaximized();
else
w->showNormal();
//存储主界面
_golbalData->setMainWindow(w);
//注册Python接口
if (_pyReg) _pyReg->registWapper();
//执行命令行处理
this->execCommand();
Inited = true;
return true;
}
AppFrame::FITKGlobalEventFilter* FITKApplication::getGlobalEventFilter()
{
return _globalEvent;
}
void FITKApplication::showCopyrightDlg()
{
FITKCopyRightDialog* dlg = new FITKCopyRightDialog(_golbalData->getMainWindow());
dlg->show();
}
void FITKApplication::resetDataObjects(const QList<int>& savedIDs)
{
if (_golbalData == nullptr) return;
QList<int> ids = _golbalData->getGlobalDataIDs();
ids.append(savedIDs);
FITKDATAREPO->resetRepo(ids);
}
bool FITKApplication::workingInWorkBench()
{
return _workbenchHandler == nullptr? false: _workbenchHandler->workingInWorkBench();
}
void FITKApplication::regWorkBenchHandler(FITKWorkBenchHandler* handler)
{
_workbenchHandler = handler;
}
AppFrame::FITKWorkBenchHandler* FITKApplication::getWorkBenchHandler()
{
return _workbenchHandler;
}
void FITKApplication::execCommand()
{
//输出提示
QString appname = QCoreApplication::applicationName();
AppFrame::FITKMessageNormal(appname + " initialized !");
//执行命令行命令
if(_commandLineHandler)
_commandLineHandler->exec();
if (_workbenchHandler && _workbenchHandler->workingInWorkBench())
_workbenchHandler->execHandler();
}
}