##// END OF EJS Templates
Closed
Pull request !136 Created on Mon, 05 Jun 2017 15:38:32, by
- Remove unused gcov link
- Add the coverage target whith the test. make coverage will call the code
Pull request versions not available.
ver Time Author Commit Description
latest r45:569ae9410a6b
Remove unused gcov link
latest r44:31b8fb9583a3
Add the coverage target whith the test. make coverage will call the code coverage for every test of the core module.
@@ -0,0 +1,1
1 TODO
@@ -0,0 +1,103
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the QLop Software
3 -- Copyright (C) 2015, Plasma Physics Laboratory - CNRS
4 --
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
7 -- the Free Software Foundation; either version 2 of the License, or
8 -- (at your option) any later version.
9 --
10 -- This program is distributed in the hope that it will be useful,
11 -- but WITHOUT ANY WARRANTY; without even the implied warranty of
12 -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 -- GNU General Public License for more details.
14 --
15 -- You should have received a copy of the GNU General Public License
16 -- along with this program; if not, write to the Free Software
17 -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 -------------------------------------------------------------------------------*/
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
22 #include "mainwindow.h"
23 #include "ui_mainwindow.h"
24 #include <QAction>
25 #include <QDate>
26 #include <QDateTime>
27 #include <QDir>
28 #include <QFileDialog>
29 //#include <omp.h>
30 //#include <network/filedownloader.h>
31 //#include <qlopdatabase.h>
32 //#include <qlopsettings.h>
33 //#include <qlopgui.h>
34 //#include <spacedata.h>
35 //#include "qlopcore.h"
36 //#include "qlopcodecmanager.h"
37 //#include "cdfcodec.h"
38 //#include "amdatxtcodec.h"
39 //#include <qlopplotmanager.h>
40
41 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
42 {
43 ui->setupUi(this);
44 /* QLopGUI::registerMenuBar(menuBar());
45 this->setWindowIcon(QIcon(":/sciqlopLOGO.svg"));
46 this->m_progressWidget = new QWidget();
47 this->m_progressLayout = new QVBoxLayout(this->m_progressWidget);
48 this->m_progressWidget->setLayout(this->m_progressLayout);
49 this->m_progressWidget->setWindowModality(Qt::WindowModal);
50 m_progressThreadIds = (int*) malloc(OMP_THREADS*sizeof(int));
51 for(int i=0;i<OMP_THREADS;i++)
52 {
53 this->m_progress.append(new QProgressBar(this->m_progressWidget));
54 this->m_progress.last()->setMinimum(0);
55 this->m_progress.last()->setMaximum(100);
56 this->m_progressLayout->addWidget(this->m_progress.last());
57 this->m_progressWidget->hide();
58 this->m_progressThreadIds[i] = -1;
59 }
60 this->m_progressWidget->setWindowTitle("Loading File");
61 const QList<QLopService*>ServicesToLoad=QList<QLopService*>()
62 << QLopCore::self()
63 << QLopPlotManager::self()
64 << QLopCodecManager::self()
65 << FileDownloader::self()
66 << QLopDataBase::self()
67 << SpaceData::self();
68
69 CDFCodec::registerToManager();
70 AMDATXTCodec::registerToManager();
71
72
73 for(int i=0;i<ServicesToLoad.count();i++)
74 {
75 qDebug()<<ServicesToLoad.at(i)->serviceName();
76 ServicesToLoad.at(i)->initialize(); //must be called before getGUI
77 QDockWidget* wdgt=ServicesToLoad.at(i)->getGUI();
78 if(wdgt)
79 {
80 wdgt->setAllowedAreas(Qt::AllDockWidgetAreas);
81 this->addDockWidget(Qt::TopDockWidgetArea,wdgt);
82 }
83 PythonQt::self()->getMainModule().addObject(ServicesToLoad.at(i)->serviceName(),(QObject*)ServicesToLoad.at(i));
84 }*/
85 }
86
87 MainWindow::~MainWindow()
88 {
89 delete ui;
90 }
91
92
93 void MainWindow::changeEvent(QEvent *e)
94 {
95 QMainWindow::changeEvent(e);
96 switch (e->type()) {
97 case QEvent::LanguageChange:
98 ui->retranslateUi(this);
99 break;
100 default:
101 break;
102 }
103 }
@@ -0,0 +1,56
1 <?xml version="1.0" encoding="UTF-8"?>
2 <ui version="4.0">
3 <class>MainWindow</class>
4 <widget class="QMainWindow" name="MainWindow">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>800</width>
10 <height>600</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>QLop</string>
15 </property>
16 <property name="dockNestingEnabled">
17 <bool>true</bool>
18 </property>
19 <widget class="QWidget" name="centralWidget">
20 <property name="enabled">
21 <bool>true</bool>
22 </property>
23 <property name="sizePolicy">
24 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
25 <horstretch>0</horstretch>
26 <verstretch>0</verstretch>
27 </sizepolicy>
28 </property>
29 <property name="maximumSize">
30 <size>
31 <width>16777215</width>
32 <height>16777215</height>
33 </size>
34 </property>
35 </widget>
36 <widget class="QMenuBar" name="menuBar">
37 <property name="geometry">
38 <rect>
39 <x>0</x>
40 <y>0</y>
41 <width>800</width>
42 <height>45</height>
43 </rect>
44 </property>
45 </widget>
46 <widget class="QStatusBar" name="statusBar"/>
47 <action name="actionIndex_Viewer">
48 <property name="text">
49 <string>Index Viewer</string>
50 </property>
51 </action>
52 </widget>
53 <layoutdefault spacing="6" margin="11"/>
54 <resources/>
55 <connections/>
56 </ui>
@@ -1,31 +1,1
1 ![](gui/resources/icones/sciqlop2PNG_1024.png){:.some-css-class style="width: 20%"}
1 TODO No newline at end of file
2
3
4 # Overview
5
6 ** SciQLOP ** (**SCI**entific **Q**t application for **L**earning from **O**bservations of **P**lasmas) aims to be an ergonomic
7 and powerful tool enabling visualization and analysis of in-situ space plasma data. This goal rises some
8 challenges either technical and in the conception and the design.
9 The time resolution allowed by nowadays measurements imply the ability to plot millions of points just for
10 one sensor with no compromise on interactivity. Plots may stay responsive even with millions of points.
11 Being able to scroll, zoom, move and export the plots with the mouse are the minimal interactions expected by the user.
12 SciQLOP may also abstract the manipulation of physic data while providing contextual features such as
13 coordinate transform, physical quantity extraction from data.
14 That said increasing graphical features usually lead to slower software and more complex GUI. Keeping
15 SciQLOP lightweight and intuitive is one of the priorities to make it usable and competitive.
16
17
18 ## How to build
19
20 ```
21 git clone https://hephaistos.lpp.polytechnique.fr/rhodecode/HG_REPOSITORIES/LPP/SciQLOP_Repos/SciQLop
22 cd SciQLop
23 mkdir build && cd build
24 cmake ../
25 make
26
27 ```
28
29 ## How to contribute
30
31 Contact sciqlop@lpp.polytechnique.fr
@@ -3,7 +3,6 echo Setting up environment for Qt usage...
3
3
4 set QT_QMAKE_PATH=C:\Qt\5.8\mingw53_32\bin
4 set QT_QMAKE_PATH=C:\Qt\5.8\mingw53_32\bin
5 set QT_MINGW_PATH=C:\Qt\Tools\mingw530_32\bin
5 set QT_MINGW_PATH=C:\Qt\Tools\mingw530_32\bin
6 set NSIS_PATH=C:\Appli\NSIS
7 set LLVM_PATH=C:\Appli\LLVM\bin
6 set LLVM_PATH=C:\Appli\LLVM\bin
8 set CMAKE_PATH=C:\Appli\CMake\bin
7 set CMAKE_PATH=C:\Appli\CMake\bin
9 set NINJA_PATH=C:\Appli\Ninja
8 set NINJA_PATH=C:\Appli\Ninja
@@ -14,5 +13,5 set PYTHON_PATH=C:\Appli\Python\Python36-32
14 set SCAN_BUILD_PATH=C:\Dev\CNRS-DEV\cfe\tools\scan-build\bin
13 set SCAN_BUILD_PATH=C:\Dev\CNRS-DEV\cfe\tools\scan-build\bin
15
14
16
15
17 set PATH=%QT_QMAKE_PATH%;%QT_MINGW_PATH%;%PERL_SITE_PATH%;%PERL_PATH%;%PYTHON_PATH%;%NSIS_PATH%;%SCAN_BUILD_PATH%;%LLVM_PATH%;%CMAKE_PATH%;%NINJA_PATH%;%PATH%
16 set PATH=%QT_QMAKE_PATH%;%QT_MINGW_PATH%;%PERL_SITE_PATH%;%PERL_PATH%;%PYTHON_PATH%;%SCAN_BUILD_PATH%;%LLVM_PATH%;%CMAKE_PATH%;%NINJA_PATH%;%PATH%
18 cd /D C:\Dev\CNRS-DEV\SciQlopInit
17 cd /D C:\Dev\CNRS-DEV\SciQlopInit
@@ -1,20 +1,15
1
1
2 ## sciqlop - CMakeLists.txt
2 ## sciqlop - CMakeLists.txt
3 SET(EXECUTABLE_NAME "sciqlop")
3 SET(EXECUTABLE_NAME "sciqlop")
4 SCIQLOP_SET_TO_PARENT_SCOPE(EXECUTABLE_NAME)
5 SET(SOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/)
4 SET(SOURCES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src/)
6 SET(INCLUDES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include")
5 SET(INCLUDE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/include)
7 SET(UI_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/ui)
6 SET(UI_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/src)
8 SET(RES_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/resources)
7 SET(RES_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/resources)
9
8
10 # Include gui directory
11 include_directories("${INCLUDES_DIR}")
12
13 #
9 #
14 # Find Qt modules
10 # Find Qt modules
15 #
11 #
16 SCIQLOP_FIND_QT(Core Widgets)
12 SCIQLOP_FIND_QT(Core Widgets)
17
18
13
19 #
14 #
20 # Find dependent libraries
15 # Find dependent libraries
@@ -39,19 +34,24 list(APPEND SHARED_LIBRARIES ${SQPCORE_SHARED_LIBRARIES})
39 #get_property(sqpcoreLocation TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY LOCATION)
34 #get_property(sqpcoreLocation TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY LOCATION)
40 list(APPEND SHARED_LIBRARIES_FROM_TARGETS ${sqpcoreLocation})
35 list(APPEND SHARED_LIBRARIES_FROM_TARGETS ${sqpcoreLocation})
41
36
42 # Ui files
43 FILE (GLOB_RECURSE PROJECT_FORMS ${UI_FOLDER}/*.ui)
44
45 #
37 #
46 # Compile the application
38 # Compile the application
47 #
39 #
48 FILE (GLOB_RECURSE APPLICATION_SOURCES
40 FILE (GLOB_RECURSE APPLICATION_SOURCES
49 ${INCLUDES_DIR}/*.h
41 ${SOURCES_DIR}/*.c
50 ${SOURCES_DIR}/*.c
42 ${SOURCES_DIR}/*.cpp
51 ${SOURCES_DIR}/*.cpp
43 ${SOURCES_DIR}/*.h)
52 ${SOURCES_DIR}/*.h
44
53 ${PROJECT_FORMS})
45 # Headers files (.h)
46 FILE (GLOB_RECURSE PROJECT_HEADERS ${INCLUDE_FOLDER}/*.h)
47
48 # Ui files
49 FILE (GLOB_RECURSE PROJECT_FORMS ${UI_FOLDER}/*.ui)
54
50
51 # Resources files
52 FILE (GLOB_RECURSE PROJECT_RESOURCES ${RES_FOLDER}/*.qrc)
53
54 # Retrieve resources files
55 FILE (GLOB_RECURSE APPLICATION_RESOURCES ${RES_FOLDER}/*.qrc)
55 FILE (GLOB_RECURSE APPLICATION_RESOURCES ${RES_FOLDER}/*.qrc)
56
56
57 QT5_ADD_RESOURCES(RCC_HDRS ${APPLICATION_RESOURCES} )
57 QT5_ADD_RESOURCES(RCC_HDRS ${APPLICATION_RESOURCES} )
@@ -66,18 +66,9 set_property(TARGET ${EXECUTABLE_NAME} PROPERTY CXX_STANDARD 14)
66 set_property(TARGET ${EXECUTABLE_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
66 set_property(TARGET ${EXECUTABLE_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
67 target_link_libraries(${EXECUTABLE_NAME}
67 target_link_libraries(${EXECUTABLE_NAME}
68 ${LIBRARIES})
68 ${LIBRARIES})
69
69
70 INSTALL(TARGETS ${EXECUTABLE_NAME}
71 RUNTIME DESTINATION ${INSTALL_BINARY_DIR}
72 LIBRARY DESTINATION ${INSTALL_BINARY_DIR}
73 ARCHIVE DESTINATION ${INSTALL_BINARY_DIR}
74 )
75 # Link with Qt5 modules
70 # Link with Qt5 modules
76 qt5_use_modules(${EXECUTABLE_NAME} Core Widgets)
71 qt5_use_modules(${EXECUTABLE_NAME} Core Widgets)
77
78
79 add_dependencies(${EXECUTABLE_NAME} ${SQPGUI_LIBRARY_NAME} ${SQPCORE_LIBRARY_NAME})
80
81
72
82
73
83 # Add the files to the list of files to be analyzed
74 # Add the files to the list of files to be analyzed
@@ -19,26 +19,12
19 /*-- Author : Alexis Jeandet
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #include "MainWindow.h"
22 #include "mainwindow.h"
23 #include <QProcessEnvironment>
23 #include <QProcessEnvironment>
24 #include <QThread>
24 #include <QThread>
25 #include <SqpApplication.h>
25 #include <SqpApplication.h>
26 #include <qglobal.h>
26 #include <qglobal.h>
27
27
28 #include <Plugin/PluginManager.h>
29 #include <QDir>
30
31 #include <QLoggingCategory>
32
33 Q_LOGGING_CATEGORY(LOG_Main, "Main")
34
35 namespace {
36
37 const auto PLUGIN_DIRECTORY_NAME = QStringLiteral("plugins");
38
39
40 } // namespace
41
42 int main(int argc, char *argv[])
28 int main(int argc, char *argv[])
43 {
29 {
44 SqpApplication a{argc, argv};
30 SqpApplication a{argc, argv};
@@ -48,33 +34,5 int main(int argc, char *argv[])
48 MainWindow w;
34 MainWindow w;
49 w.show();
35 w.show();
50
36
51 // Loads plugins
52 auto pluginDir = QDir{a.applicationDirPath()};
53 auto pluginLookupPath = {
54 a.applicationDirPath(),
55 a.applicationDirPath() + "/" + PLUGIN_DIRECTORY_NAME,
56 a.applicationDirPath() + "/../lib64/SciQlop",
57 a.applicationDirPath() + "/../lib64/sciqlop",
58 a.applicationDirPath() + "/../lib/SciQlop",
59 a.applicationDirPath() + "/../lib/sciqlop",
60 a.applicationDirPath() + "/../plugins",
61 };
62
63 #if _WIN32 || _WIN64
64 pluginDir.mkdir(PLUGIN_DIRECTORY_NAME);
65 pluginDir.cd(PLUGIN_DIRECTORY_NAME);
66 #endif
67
68 PluginManager pluginManager{};
69
70 for (auto &&path : pluginLookupPath) {
71 QDir directory{path};
72 if (directory.exists()) {
73 qCDebug(LOG_Main())
74 << QObject::tr("Plugin directory: %1").arg(directory.absolutePath());
75 pluginManager.loadPlugins(directory);
76 }
77 }
78
79 return a.exec();
37 return a.exec();
80 }
38 }
@@ -1,6 +1,6
1 /*------------------------------------------------------------------------------
1 /*------------------------------------------------------------------------------
2 -- This file is a part of the SciQLop Software
2 -- This file is a part of the QLop Software
3 -- Copyright (C) 2017, Plasma Physics Laboratory - CNRS
3 -- Copyright (C) 2015, Plasma Physics Laboratory - CNRS
4 --
4 --
5 -- This program is free software; you can redistribute it and/or modify
5 -- This program is free software; you can redistribute it and/or modify
6 -- it under the terms of the GNU General Public License as published by
6 -- it under the terms of the GNU General Public License as published by
@@ -19,47 +19,42
19 /*-- Author : Alexis Jeandet
19 /*-- Author : Alexis Jeandet
20 -- Mail : alexis.jeandet@member.fsf.org
20 -- Mail : alexis.jeandet@member.fsf.org
21 ----------------------------------------------------------------------------*/
21 ----------------------------------------------------------------------------*/
22 #ifndef SCIQLOP_MAINWINDOW_H
22 #ifndef MAINWINDOW_H
23 #define SCIQLOP_MAINWINDOW_H
23 #define MAINWINDOW_H
24
24
25 #include <QListWidgetItem>
25 #include <QListWidgetItem>
26 #include <QLoggingCategory>
27 #include <QMainWindow>
26 #include <QMainWindow>
28 #include <QProgressBar>
27 #include <QProgressBar>
29 #include <QProgressDialog>
28 #include <QProgressDialog>
30 #include <QThread>
29 #include <QThread>
31 #include <QVBoxLayout>
30 #include <QVBoxLayout>
32 #include <QWidget>
31 #include <QWidget>
32 //#include "../Core/qlopservice.h"
33 //#include "../Core/qlopgui.h"
33
34
34 #include <Common/spimpl.h>
35
36 #include <memory>
37
38 Q_DECLARE_LOGGING_CATEGORY(LOG_MainWindow)
39
35
40 namespace Ui {
36 namespace Ui {
41 class MainWindow;
37 class MainWindow;
42 } // namespace Ui
38 }
43
44
39
45 class MainWindow : public QMainWindow {
40 class MainWindow : public QMainWindow {
46 Q_OBJECT
41 Q_OBJECT
47
42
48 public:
43 public:
49 explicit MainWindow(QWidget *parent = 0);
44 explicit MainWindow(QWidget *parent = 0);
50 virtual ~MainWindow();
45 ~MainWindow();
51 public slots:
46 public slots:
52
47
53 protected:
48 protected:
54 void changeEvent(QEvent *e);
49 void changeEvent(QEvent *e);
55
50
56 private:
51 private:
57 std::unique_ptr<Ui::MainWindow> m_Ui;
52 Ui::MainWindow *ui;
58 // QWidget *m_progressWidget;
53 QList<QProgressBar *> m_progress;
59 // QVBoxLayout *m_progressLayout;
54 int *m_progressThreadIds;
55 QWidget *m_progressWidget;
56 QVBoxLayout *m_progressLayout;
60 // QList<QLopService*> m_qlopServices;
57 // QList<QLopService*> m_qlopServices;
61 class MainWindowPrivate;
62 spimpl::unique_impl_ptr<MainWindowPrivate> impl;
63 };
58 };
64
59
65 #endif // SCIQLOP_MAINWINDOW_H
60 #endif // MAINWINDOW_H
@@ -1,5 +1,3
1 # Ignore false positive relative to App macro
1 # Ignore false positive relative to sqpApp macro
2 \.h:\d+:.IPSIS_S04.*found: Ui
2 SqpApplication\.h:\d+:.IPSIS_S03.*found: sqpApp
3
3 SqpApplication\.h:\d+:.IPSIS_S04_VARIABLE.*found: sqpApp
4 # Ignore false positive relative to macros
5 Main\.cpp:\d+:.*IPSIS_S04_VARIABLE.*found: (__ppc64__) No newline at end of file
@@ -21,7 +21,7 INCLUDE("cmake/sciqlop_params.cmake")
21 #
21 #
22 # Configure the compiler
22 # Configure the compiler
23 #
23 #
24 #INCLUDE("cmake/compiler/compiler.cmake")
24 INCLUDE("cmake/compiler/compiler.cmake")
25
25
26 #
26 #
27 # Find all necessary dependencies
27 # Find all necessary dependencies
@@ -1,16 +1,27
1 #
2 # Sciqlop_modules.cmake
3 #
4 # Set ouptut directories
5 #
6 SET (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist/${CMAKE_BUILD_TYPE})
7 SET (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist/${CMAKE_BUILD_TYPE})
8 IF (UNIX)
9 SET (CONFIG_OUTPUT_PATH $ENV{HOME}/.config/QtProject)
10 ELSEIF(WIN32)
11 SET (CONFIG_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist/${CMAKE_BUILD_TYPE}/app/QtProject)
12 ELSE()
13 SET (CONFIG_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist/${CMAKE_BUILD_TYPE})
14 ENDIF()
15
16 INCLUDE ("cmake/sciqlop_code_coverage.cmake")
1
17
2 if(BUILD_TESTS)
18 if(BUILD_TESTS)
3 INCLUDE ("cmake/sciqlop_code_coverage.cmake")
4 APPEND_COVERAGE_COMPILER_FLAGS()
19 APPEND_COVERAGE_COMPILER_FLAGS()
5 endif(BUILD_TESTS)
20 endif(BUILD_TESTS)
6
21
7 #
22 #
8 # Compile the diffents modules
23 # Compile the diffents modules
9 #
24 #
10 set(sciqlop-plugin_DIR "${CMAKE_SOURCE_DIR}/plugin/cmake")
11 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${sciqlop-plugin_DIR}")
12 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/plugin")
13
14 set(sciqlop-core_DIR "${CMAKE_SOURCE_DIR}/core/cmake")
25 set(sciqlop-core_DIR "${CMAKE_SOURCE_DIR}/core/cmake")
15 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${sciqlop-core_DIR}")
26 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${sciqlop-core_DIR}")
16 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/core")
27 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/core")
@@ -21,25 +32,6 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/gui")
21
32
22 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/app")
33 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/app")
23
34
24 OPTION (BUILD_PLUGINS "Build the plugins" OFF)
25 IF(BUILD_PLUGINS)
26 set(sciqlop-mockplugin_DIR "${CMAKE_SOURCE_DIR}/plugins/mockplugin/cmake")
27 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${sciqlop-mockplugin_DIR}")
28 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/plugins/mockplugin")
29
30 set(sciqlop-amda_DIR "${CMAKE_SOURCE_DIR}/plugins/amda/cmake")
31 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${sciqlop-amda_DIR}")
32 ADD_SUBDIRECTORY("${CMAKE_SOURCE_DIR}/plugins/amda")
33
34 # Temporary target to copy to plugins dir
35 find_package(sciqlop-mockplugin)
36 find_package(sciqlop-amda)
37 ADD_CUSTOM_TARGET(plugins
38 COMMAND ${CMAKE_COMMAND} -E copy ${SCIQLOP-MOCKPLUGIN_LIBRARIES} "${LIBRARY_OUTPUT_PATH}/plugins/${SCIQLOP-MOCKPLUGIN_LIBRARIES_NAME}"
39 COMMAND ${CMAKE_COMMAND} -E copy ${SCIQLOP-AMDA_LIBRARIES} "${LIBRARY_OUTPUT_PATH}/plugins/${SCIQLOP-AMDA_LIBRARIES_NAME}"
40 )
41 ENDIF(BUILD_PLUGINS)
42
43 # LOGGER
35 # LOGGER
44 set(QTLOGGING_INI_FILE "${CMAKE_SOURCE_DIR}/config/QtProject/qtlogging.ini")
36 set(QTLOGGING_INI_FILE "${CMAKE_SOURCE_DIR}/config/QtProject/qtlogging.ini")
45 FILE(COPY ${QTLOGGING_INI_FILE} DESTINATION ${CONFIG_OUTPUT_PATH})
37 FILE(COPY ${QTLOGGING_INI_FILE} DESTINATION ${CONFIG_OUTPUT_PATH})
@@ -1,59 +0,0
1 #
2 # Generate the source package of SciqLop.
3 #
4
5 install(DIRECTORY
6 ${EXECUTABLE_OUTPUT_PATH}
7 DESTINATION "."
8 USE_SOURCE_PERMISSIONS
9 COMPONENT CORE
10 PATTERN "*.a" EXCLUDE
11 )
12
13 set(EXECUTABLEDOTEXTENSION)
14 if(WIN32)
15 set(EXECUTABLEDOTEXTENSION ".exe")
16 endif(WIN32)
17 set (SCIQLOP_EXE_LOCATION ${EXECUTABLE_OUTPUT_PATH}/${EXECUTABLE_NAME}${EXECUTABLEDOTEXTENSION})
18
19 if(WIN32)
20 include ("cmake/sciqlop_package_qt.cmake")
21 endif(WIN32)
22
23
24 SET (CPACK_PACKAGE_VENDOR "CNRS")
25 SET (CPACK_PACKAGE_VERSION_MAJOR "${SCIQLOP_VERSION_MAJOR}")
26 SET (CPACK_PACKAGE_VERSION_MINOR "${SCIQLOP_VERSION_MINOR}")
27 SET (CPACK_PACKAGE_VERSION_PATCH "${SCIQLOP_VERSION_PATCH}${SCIQLOP_VERSION_SUFFIX}")
28 SET (CPACK_PACKAGE_VERSION "${SCIQLOP_VERSION}")
29 SET (CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/COPYING)
30 SET (CPACK_PACKAGE_CONTACT "nicolas.aunai@lpp.polytechnique.fr")
31 SET(CPACK_PACKAGE_DESCRIPTION_FILE ${CMAKE_CURRENT_SOURCE_DIR}/README.md)
32 # SET(CPACK_RESOURCE_FILE_WELCOME ${CMAKE_CURRENT_SOURCE_DIR}/WARN.txt)
33 SET(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/COPYING)
34 # SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_NAME}-${PROJECT_VERSION})
35 SET(FULLBUILD ON)
36
37 SET(CPACK_PACKAGE_NAME ${PROJECT_NAME})
38 SET(CPACK_GENERATOR "NSIS")
39 SET(CPACK_MONOLITHIC_INSTALL 1)
40 #SET(CPACK_COMPONENTS_ALL sciqlop qt)
41 SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-Setup")
42 SET(CPACK_PACKAGE_EXECUTABLES ${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_NAME})
43
44 set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
45
46 if (WIN32)
47 SET(CPACK_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
48 SET(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
49 SET(CPACK_NSIS_COMPONENT_INSTALL ON)
50 SET(CPACK_SYSTEM_NAME "MinGW32")
51 SET(CPACK_PACKAGING_INSTALL_PREFIX "")
52 #SET(CPACK_GENERATOR "NSIS")
53 SET(CPACK_NSIS_DISPLAY_NAME ${PROJECT_NAME})
54 SET(CPACK_NSIS_MUI_FINISHPAGE_RUN ${SCIQLOP_EXECUTABLE_NAME})
55 SET(CPACK_NSIS_MUI_ICON ${SCIQLOP_EXECUTABLE_ICON_LOCATION})
56 SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\${SCIQLOP_EXECUTABLE_NAME}.exe")
57 endif (WIN32)
58
59 INCLUDE(CPack)
@@ -44,30 +44,6 else()
44 set(libRootDirForceValue)
44 set(libRootDirForceValue)
45 endif()
45 endif()
46
46
47 #
48 # Sciqlop_modules.cmake
49 #
50 # Set ouptut directories
51 #
52 IF (UNIX)
53 # 32 or 64 bits compiler
54 IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
55 SET(defaultLib "lib64/sciqlop")
56 ELSE()
57 SET(defaultLib "lib/sciqlop")
58 ENDIF()
59 SET (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin)
60 SET (CONFIG_OUTPUT_PATH $ENV{HOME}/.config/QtProject)
61 SET (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${defaultLib})
62 ELSEIF(WIN32)
63 SET (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist)
64 SET (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist)
65 SET (CONFIG_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist/app/QtProject)
66 ELSE()
67 SET (EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist)
68 SET (CONFIG_OUTPUT_PATH $ENV{HOME}/.config/QtProject)
69 SET (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/dist)
70 ENDIF()
71
47
72
48
73 #
49 #
@@ -78,51 +54,33 OPTION (BUILD_SHARED_LIBS "Build the shared libraries" ON)
78 # Generate position independant code (-fPIC)
54 # Generate position independant code (-fPIC)
79 SET(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
55 SET(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
80
56
81
57 #
82
58 # Configure installation directories
83 # Configuration for make install
59 #
84
85 set(PROJECT_PLUGIN_PREFIX "SciQlop")
86
87 IF (UNIX)
60 IF (UNIX)
88 SET(CMAKE_INSTALL_PREFIX "/usr/local/${PROJECT_PLUGIN_PREFIX}")
89 SET(defaultBin "bin")
61 SET(defaultBin "bin")
90 SET(defaultInc "include/sciqlop")
62 SET(defaultInc "include/sciqlop")
91
63
92 # 32 or 64 bits compiler
64 # 32 or 64 bits compiler
93 IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
65 IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
94 SET(defaultLib "lib64")
66 SET(defaultLib "lib64/sciqlop")
95 SET(defaultPluginsLib "lib64/${PROJECT_PLUGIN_PREFIX}")
96 ELSE()
67 ELSE()
97 SET(defaultLib "lib/")
68 SET(defaultLib "lib/sciqlop")
98 SET(defaultPluginsLib "lib/${PROJECT_PLUGIN_PREFIX}")
99 ENDIF()
69 ENDIF()
100
70
101 SET(defaultDoc "share/docs/${PROJECT_PLUGIN_PREFIX}")
71 SET(defaultDoc "share/docs/sciqlop")
102 ELSE()
72 ELSE()
103 SET(defaultBin "bin")
73 SET(defaultBin "bin")
104 SET(defaultInc "include/${PROJECT_PLUGIN_PREFIX}")
74 SET(defaultInc "include/sciqlop")
105 SET(defaultLib "lib")
75 SET(defaultLib "lib/sciqlop")
106 SET(defaultPluginsLib "lib/${PROJECT_PLUGIN_PREFIX}")
76 SET(defaultDoc "docs/sciqlop")
107 SET(defaultDoc "docs/${PROJECT_PLUGIN_PREFIX}")
108 ENDIF()
77 ENDIF()
109
78
110 SET(INSTALL_BINARY_DIR "${defaultBin}" CACHE STRING
79 SET(INSTALL_BINARY_DIR "${defaultBin}" CACHE STRING
111 "Installation directory for binaries")
80 "Installation directory for binaries")
112 SET(INSTALL_LIBRARY_DIR "${defaultLib}" CACHE STRING
81 SET(INSTALL_LIBRARY_DIR "${defaultLib}" CACHE STRING
113 "Installation directory for libraries")
82 "Installation directory for libraries")
114 SET(INSTALL_PLUGINS_LIBRARY_DIR "${defaultPluginsLib}" CACHE STRING
115 "Installation directory for libraries")
116 SET(INSTALL_INCLUDE_DIR "${defaultInc}" CACHE STRING
83 SET(INSTALL_INCLUDE_DIR "${defaultInc}" CACHE STRING
117 "Installation directory for headers")
84 "Installation directory for headers")
118 SET(INSTALL_DOCUMENTATION_DIR "${defaultDoc}" CACHE STRING
85 SET(INSTALL_DOCUMENTATION_DIR "${defaultDoc}" CACHE STRING
119 "Installation directory for documentations")
86 "Installation directory for documentations")
120
121
122 # Set the rpath when installing
123 SET(CMAKE_SKIP_BUILD_RPATH FALSE)
124 SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
125 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBRARY_DIR}")
126 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
127
128 message("Install RPATH: ${CMAKE_INSTALL_PREFIX}/${INSTALL_LIBRARY_DIR}")
@@ -16,22 +16,15 CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/resources/Version.h.in"
16 "${INCLUDES_DIR}/Version.h")
16 "${INCLUDES_DIR}/Version.h")
17 CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/resources/Version.cpp.in"
17 CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/resources/Version.cpp.in"
18 "${SOURCES_DIR}/Version.cpp")
18 "${SOURCES_DIR}/Version.cpp")
19
19
20 # Find dependent modules
21 find_package(sciqlop-plugin)
22 INCLUDE_DIRECTORIES(${SCIQLOP-PLUGIN_INCLUDE_DIR})
23
24 #
20 #
25 # Find Qt modules
21 # Find Qt modules
26 #
22 #
27 SCIQLOP_FIND_QT(Core Network)
23 SCIQLOP_FIND_QT(Core)
28
24
29 #
25 #
30 # Compile the library library
26 # Compile the library library
31 #
27 #
32
33 ADD_DEFINITIONS(-DCORE_LIB)
34
35 FILE (GLOB_RECURSE MODULE_SOURCES
28 FILE (GLOB_RECURSE MODULE_SOURCES
36 ${INCLUDES_DIR}/*.h
29 ${INCLUDES_DIR}/*.h
37 ${SOURCES_DIR}/*.c
30 ${SOURCES_DIR}/*.c
@@ -42,14 +35,8 ADD_LIBRARY(${SQPCORE_LIBRARY_NAME} ${MODULE_SOURCES})
42 set_property(TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY CXX_STANDARD 14)
35 set_property(TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY CXX_STANDARD 14)
43 set_property(TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
36 set_property(TARGET ${SQPCORE_LIBRARY_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
44 TARGET_LINK_LIBRARIES(${SQPCORE_LIBRARY_NAME})
37 TARGET_LINK_LIBRARIES(${SQPCORE_LIBRARY_NAME})
45 qt5_use_modules(${SQPCORE_LIBRARY_NAME} Core Network)
38 qt5_use_modules(${SQPCORE_LIBRARY_NAME} Core)
46
39
47 INSTALL(TARGETS ${SQPCORE_LIBRARY_NAME}
48 RUNTIME DESTINATION ${INSTALL_BINARY_DIR}
49 LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
50 ARCHIVE DESTINATION ${INSTALL_LIBRARY_DIR}
51 )
52
53 # From cmake documentation: http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
40 # From cmake documentation: http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
54 # Entries in the COMPILE_DEFINITIONS are prefixed with -D or /D and added to the compile line in an unspecified order.
41 # Entries in the COMPILE_DEFINITIONS are prefixed with -D or /D and added to the compile line in an unspecified order.
55 # The DEFINE_SYMBOL target property is also added as a compile definition as a special convenience case for SHARED and MODULE library targets
42 # The DEFINE_SYMBOL target property is also added as a compile definition as a special convenience case for SHARED and MODULE library targets
@@ -106,10 +93,8 IF(BUILD_TESTS)
106
93
107 SCIQLOP_COPY_TO_TARGET(RUNTIME ${testName} ${EXTERN_SHARED_LIBRARIES})
94 SCIQLOP_COPY_TO_TARGET(RUNTIME ${testName} ${EXTERN_SHARED_LIBRARIES})
108 set(Coverage_NAME ${testName})
95 set(Coverage_NAME ${testName})
109 if(UNIX)
96 SETUP_TARGET_FOR_COVERAGE(TARGET ${testName}_coverage OUTPUT ${testFile}-path NAME ${testFile} EXECUTABLE ${testName})
110 SETUP_TARGET_FOR_COVERAGE(TARGET ${testName}_coverage OUTPUT ${testFile}-path NAME ${testFile} EXECUTABLE ${testName})
97 LIST( APPEND TARGETS_COV ${testName}_coverage)
111 LIST( APPEND TARGETS_COV ${testName}_coverage)
112 endif(UNIX)
113
98
114 ENDFOREACH( testFile )
99 ENDFOREACH( testFile )
115
100
@@ -89,8 +89,9 using default_copier_t = typename default_copier<T>::type;
89
89
90 template <class T, class D, class C>
90 template <class T, class D, class C>
91 struct is_default_manageable
91 struct is_default_manageable
92 : public std::integral_constant<bool, std::is_same<D, default_deleter_t<T> >::value
92 : public std::integral_constant<bool,
93 && std::is_same<C, default_copier_t<T> >::value> {
93 std::is_same<D, default_deleter_t<T> >::value
94 && std::is_same<C, default_copier_t<T> >::value> {
94 };
95 };
95 }
96 }
96
97
@@ -131,10 +132,11 public:
131 }
132 }
132
133
133 template <class U>
134 template <class U>
134 impl_ptr(U *u, typename std::enable_if<std::is_convertible<U *, pointer>::value
135 impl_ptr(U *u,
135 && is_default_manageable::value,
136 typename std::enable_if<std::is_convertible<U *, pointer>::value
136 dummy_t_>::type
137 && is_default_manageable::value,
137 = dummy_t_()) SPIMPL_NOEXCEPT
138 dummy_t_>::type
139 = dummy_t_()) SPIMPL_NOEXCEPT
138 : impl_ptr(u, &details::default_delete<T>, &details::default_copy<T>)
140 : impl_ptr(u, &details::default_delete<T>, &details::default_copy<T>)
139 {
141 {
140 }
142 }
@@ -151,12 +153,12 public:
151
153
152 #ifdef SPIMPL_HAS_AUTO_PTR
154 #ifdef SPIMPL_HAS_AUTO_PTR
153 template <class U>
155 template <class U>
154 impl_ptr(std::auto_ptr<U> &&u, typename std::enable_if<std::is_convertible<U *, pointer>::value
156 impl_ptr(std::auto_ptr<U> &&u,
155 && is_default_manageable::value,
157 typename std::enable_if<std::is_convertible<U *, pointer>::value
156 dummy_t_>::type
158 && is_default_manageable::value,
157 = dummy_t_()) SPIMPL_NOEXCEPT
159 dummy_t_>::type
158 : ptr_(u.release(), &details::default_delete<T>),
160 = dummy_t_()) SPIMPL_NOEXCEPT : ptr_(u.release(), &details::default_delete<T>),
159 copier_(&details::default_copy<T>)
161 copier_(&details::default_copy<T>)
160 {
162 {
161 }
163 }
162 #endif
164 #endif
@@ -1,8 +1,6
1 #ifndef SCIQLOP_DATASOURCECONTROLLER_H
1 #ifndef SCIQLOP_DATASOURCECONTROLLER_H
2 #define SCIQLOP_DATASOURCECONTROLLER_H
2 #define SCIQLOP_DATASOURCECONTROLLER_H
3
3
4 #include "CoreGlobal.h"
5
6 #include <QLoggingCategory>
4 #include <QLoggingCategory>
7 #include <QObject>
5 #include <QObject>
8 #include <QUuid>
6 #include <QUuid>
@@ -12,7 +10,6
12 Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceController)
10 Q_DECLARE_LOGGING_CATEGORY(LOG_DataSourceController)
13
11
14 class DataSourceItem;
12 class DataSourceItem;
15 class IDataProvider;
16
13
17 /**
14 /**
18 * @brief The DataSourceController class aims to make the link between SciQlop and its plugins. This
15 * @brief The DataSourceController class aims to make the link between SciQlop and its plugins. This
@@ -21,7 +18,7 class IDataProvider;
21 * source) then others specifics method will be able to access it. You can load a data source driver
18 * source) then others specifics method will be able to access it. You can load a data source driver
22 * plugin then create a data source.
19 * plugin then create a data source.
23 */
20 */
24 class SCIQLOP_CORE_EXPORT DataSourceController : public QObject {
21 class DataSourceController : public QObject {
25 Q_OBJECT
22 Q_OBJECT
26 public:
23 public:
27 explicit DataSourceController(QObject *parent = 0);
24 explicit DataSourceController(QObject *parent = 0);
@@ -39,31 +36,12 public:
39 * Sets the structure of a data source. The controller takes ownership of the structure.
36 * Sets the structure of a data source. The controller takes ownership of the structure.
40 * @param dataSourceUid the unique id with which the data source has been registered into the
37 * @param dataSourceUid the unique id with which the data source has been registered into the
41 * controller. If it is invalid, the method has no effect.
38 * controller. If it is invalid, the method has no effect.
42 * @param dataSourceItem the structure of the data source. It must be not null to be registered
39 * @param dataSourceItem the structure of the data source
43 * @sa registerDataSource()
40 * @sa registerDataSource()
44 */
41 */
45 void setDataSourceItem(const QUuid &dataSourceUid,
42 void setDataSourceItem(const QUuid &dataSourceUid,
46 std::unique_ptr<DataSourceItem> dataSourceItem) noexcept;
43 std::unique_ptr<DataSourceItem> dataSourceItem) noexcept;
47
44
48 /**
49 * Sets the data provider used to retrieve data from of a data source. The controller takes
50 * ownership of the provider.
51 * @param dataSourceUid the unique id with which the data source has been registered into the
52 * controller. If it is invalid, the method has no effect.
53 * @param dataProvider the provider of the data source
54 * @sa registerDataSource()
55 */
56 void setDataProvider(const QUuid &dataSourceUid,
57 std::unique_ptr<IDataProvider> dataProvider) noexcept;
58
59 /**
60 * Loads an item (product) as a variable in SciQlop
61 * @param dataSourceUid the unique id of the data source containing the item. It is used to get
62 * the data provider associated to the data source, and pass it to for the variable creation
63 * @param productItem the item to load
64 */
65 void loadProductItem(const QUuid &dataSourceUid, const DataSourceItem &productItem) noexcept;
66
67 public slots:
45 public slots:
68 /// Manage init/end of the controller
46 /// Manage init/end of the controller
69 void initialize();
47 void initialize();
@@ -71,18 +49,7 public slots:
71
49
72 signals:
50 signals:
73 /// Signal emitted when a structure has been set for a data source
51 /// Signal emitted when a structure has been set for a data source
74 void dataSourceItemSet(DataSourceItem *dataSourceItem);
52 void dataSourceItemSet(const DataSourceItem &dataSourceItem);
75
76 /**
77 * Signal emitted when a variable creation is asked for a product
78 * @param variableName the name of the variable
79 * @param variableMetadata the metadata of the variable
80 * @param variableProvider the provider that will be used to retrieve the data of the variable
81 * (can be null)
82 */
83 void variableCreationRequested(const QString &variableName,
84 const QVariantHash &variableMetadata,
85 std::shared_ptr<IDataProvider> variableProvider);
86
53
87 private:
54 private:
88 void waitForFinish();
55 void waitForFinish();
@@ -1,43 +1,20
1 #ifndef SCIQLOP_DATASOURCEITEM_H
1 #ifndef SCIQLOP_DATASOURCEITEM_H
2 #define SCIQLOP_DATASOURCEITEM_H
2 #define SCIQLOP_DATASOURCEITEM_H
3
3
4 #include "CoreGlobal.h"
5
6 #include <Common/spimpl.h>
4 #include <Common/spimpl.h>
7
5
8 #include <QVariant>
6 #include <QVariant>
9 #include <QVector>
7 #include <QVector>
10
8
11 class DataSourceItemAction;
12
13 /**
14 * Possible types of an item
15 */
16 enum class DataSourceItemType { NODE, PRODUCT, COMPONENT };
17
18 /**
9 /**
19 * @brief The DataSourceItem class aims to represent a structure element of a data source.
10 * @brief The DataSourceItem class aims to represent a structure element of a data source.
20 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
11 * A data source has a tree structure that is made up of a main DataSourceItem object (root)
21 * containing other DataSourceItem objects (children).
12 * containing other DataSourceItem objects (children).
22 * For each DataSourceItem can be associated a set of data representing it.
13 * For each DataSourceItem can be associated a set of data representing it.
23 */
14 */
24 class SCIQLOP_CORE_EXPORT DataSourceItem {
15 class DataSourceItem {
25 public:
16 public:
26 /// Key associated with the name of the item
17 explicit DataSourceItem(QVector<QVariant> data = {});
27 static const QString NAME_DATA_KEY;
28
29 explicit DataSourceItem(DataSourceItemType type, const QString &name);
30 explicit DataSourceItem(DataSourceItemType type, QVariantHash data = {});
31
32 /// @return the actions of the item as a vector
33 QVector<DataSourceItemAction *> actions() const noexcept;
34
35 /**
36 * Adds an action to the item. The item takes ownership of the action, and the action is
37 * automatically associated to the item
38 * @param action the action to add
39 */
40 void addAction(std::unique_ptr<DataSourceItemAction> action) noexcept;
41
18
42 /**
19 /**
43 * Adds a child to the item. The item takes ownership of the child.
20 * Adds a child to the item. The item takes ownership of the child.
@@ -55,18 +32,11 public:
55 int childCount() const noexcept;
32 int childCount() const noexcept;
56
33
57 /**
34 /**
58 * Get the data associated to a key
35 * Get the data associated to an index
59 * @param key the key to search
36 * @param dataIndex the index to search
60 * @return the data found if key is valid, default QVariant otherwise
37 * @return the data found if index is valid, default QVariant otherwise
61 */
38 */
62 QVariant data(const QString &key) const noexcept;
39 QVariant data(int dataIndex) const noexcept;
63
64 /// Gets all data
65 QVariantHash data() const noexcept;
66
67 bool isRoot() const noexcept;
68
69 QString name() const noexcept;
70
40
71 /**
41 /**
72 * Get the item's parent
42 * Get the item's parent
@@ -74,26 +44,6 public:
74 */
44 */
75 DataSourceItem *parentItem() const noexcept;
45 DataSourceItem *parentItem() const noexcept;
76
46
77 /**
78 * Gets the item's root
79 * @return the top parent, the item itself if it's the root item
80 */
81 const DataSourceItem &rootItem() const noexcept;
82
83 /**
84 * Sets or appends a value to a key
85 * @param key the key
86 * @param value the value
87 * @param append if true, the value is added to the values already existing for the key,
88 * otherwise it replaces the existing values
89 */
90 void setData(const QString &key, const QVariant &value, bool append = false) noexcept;
91
92 DataSourceItemType type() const noexcept;
93
94 bool operator==(const DataSourceItem &other);
95 bool operator!=(const DataSourceItem &other);
96
97 private:
47 private:
98 class DataSourceItemPrivate;
48 class DataSourceItemPrivate;
99 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
49 spimpl::unique_impl_ptr<DataSourceItemPrivate> impl;
@@ -1,7 +1,5
1 #include "DataSource/DataSourceController.h"
1 #include <DataSource/DataSourceController.h>
2 #include "DataSource/DataSourceItem.h"
2 #include <DataSource/DataSourceItem.h>
3
4 #include <Data/IDataProvider.h>
5
3
6 #include <QMutex>
4 #include <QMutex>
7 #include <QThread>
5 #include <QThread>
@@ -11,28 +9,6
11
9
12 Q_LOGGING_CATEGORY(LOG_DataSourceController, "DataSourceController")
10 Q_LOGGING_CATEGORY(LOG_DataSourceController, "DataSourceController")
13
11
14 namespace {
15
16 /**
17 * Builds the metadata of the variable that will be generated from the loading of an item
18 * @param dataSourceItem the data source item from which to generate the metadata
19 * @return the metadata of the variable
20 */
21 QVariantHash variableMetadata(const DataSourceItem &dataSourceItem)
22 {
23 // Variable metadata contains...
24
25 // ... all metadata of the item
26 auto result = dataSourceItem.data();
27
28 // ... and the name of the plugin, recovered from root item
29 result.insert(QStringLiteral("plugin"), dataSourceItem.rootItem().name());
30
31 return result;
32 }
33
34 } // namespace
35
36 class DataSourceController::DataSourceControllerPrivate {
12 class DataSourceController::DataSourceControllerPrivate {
37 public:
13 public:
38 QMutex m_WorkingMutex;
14 QMutex m_WorkingMutex;
@@ -40,23 +16,19 public:
40 QHash<QUuid, QString> m_DataSources;
16 QHash<QUuid, QString> m_DataSources;
41 /// Data sources structures
17 /// Data sources structures
42 std::map<QUuid, std::unique_ptr<DataSourceItem> > m_DataSourceItems;
18 std::map<QUuid, std::unique_ptr<DataSourceItem> > m_DataSourceItems;
43 /// Data providers registered
44 /// @remarks Data providers are stored as shared_ptr as they can be sent to a variable and
45 /// continue to live without necessarily the data source controller
46 std::map<QUuid, std::shared_ptr<IDataProvider> > m_DataProviders;
47 };
19 };
48
20
49 DataSourceController::DataSourceController(QObject *parent)
21 DataSourceController::DataSourceController(QObject *parent)
50 : impl{spimpl::make_unique_impl<DataSourceControllerPrivate>()}
22 : impl{spimpl::make_unique_impl<DataSourceControllerPrivate>()}
51 {
23 {
52 qCDebug(LOG_DataSourceController()) << tr("DataSourceController construction")
24 qCDebug(LOG_DataSourceController())
53 << QThread::currentThread();
25 << tr("DataSourceController construction") << QThread::currentThread();
54 }
26 }
55
27
56 DataSourceController::~DataSourceController()
28 DataSourceController::~DataSourceController()
57 {
29 {
58 qCDebug(LOG_DataSourceController()) << tr("DataSourceController destruction")
30 qCDebug(LOG_DataSourceController())
59 << QThread::currentThread();
31 << tr("DataSourceController destruction") << QThread::currentThread();
60 this->waitForFinish();
32 this->waitForFinish();
61 }
33 }
62
34
@@ -71,20 +43,13 QUuid DataSourceController::registerDataSource(const QString &dataSourceName) no
71 void DataSourceController::setDataSourceItem(
43 void DataSourceController::setDataSourceItem(
72 const QUuid &dataSourceUid, std::unique_ptr<DataSourceItem> dataSourceItem) noexcept
44 const QUuid &dataSourceUid, std::unique_ptr<DataSourceItem> dataSourceItem) noexcept
73 {
45 {
74 if (!dataSourceItem) {
75 qCWarning(LOG_DataSourceController())
76 << tr("Data source item can't be registered (null item)");
77 return;
78 }
79
80 if (impl->m_DataSources.contains(dataSourceUid)) {
46 if (impl->m_DataSources.contains(dataSourceUid)) {
81 // The data provider is implicitly converted to a shared_ptr
82 impl->m_DataSourceItems.insert(std::make_pair(dataSourceUid, std::move(dataSourceItem)));
47 impl->m_DataSourceItems.insert(std::make_pair(dataSourceUid, std::move(dataSourceItem)));
83
48
84 // Retrieves the data source item to emit the signal with it
49 // Retrieves the data source item to emit the signal with it
85 auto it = impl->m_DataSourceItems.find(dataSourceUid);
50 auto it = impl->m_DataSourceItems.find(dataSourceUid);
86 if (it != impl->m_DataSourceItems.end()) {
51 if (it != impl->m_DataSourceItems.end()) {
87 emit dataSourceItemSet(it->second.get());
52 emit dataSourceItemSet(*it->second);
88 }
53 }
89 }
54 }
90 else {
55 else {
@@ -94,40 +59,10 void DataSourceController::setDataSourceItem(
94 }
59 }
95 }
60 }
96
61
97 void DataSourceController::setDataProvider(const QUuid &dataSourceUid,
98 std::unique_ptr<IDataProvider> dataProvider) noexcept
99 {
100 if (impl->m_DataSources.contains(dataSourceUid)) {
101 impl->m_DataProviders.insert(std::make_pair(dataSourceUid, std::move(dataProvider)));
102 }
103 else {
104 qCWarning(LOG_DataSourceController()) << tr("Can't set data provider for uid %1 : no data "
105 "source has been registered with the uid")
106 .arg(dataSourceUid.toString());
107 }
108 }
109
110 void DataSourceController::loadProductItem(const QUuid &dataSourceUid,
111 const DataSourceItem &productItem) noexcept
112 {
113 if (productItem.type() == DataSourceItemType::PRODUCT
114 || productItem.type() == DataSourceItemType::COMPONENT) {
115 /// Retrieves the data provider of the data source (if any)
116 auto it = impl->m_DataProviders.find(dataSourceUid);
117 auto dataProvider = (it != impl->m_DataProviders.end()) ? it->second : nullptr;
118
119 emit variableCreationRequested(productItem.name(), variableMetadata(productItem),
120 dataProvider);
121 }
122 else {
123 qCWarning(LOG_DataSourceController()) << tr("Can't load an item that is not a product");
124 }
125 }
126
127 void DataSourceController::initialize()
62 void DataSourceController::initialize()
128 {
63 {
129 qCDebug(LOG_DataSourceController()) << tr("DataSourceController init")
64 qCDebug(LOG_DataSourceController())
130 << QThread::currentThread();
65 << tr("DataSourceController init") << QThread::currentThread();
131 impl->m_WorkingMutex.lock();
66 impl->m_WorkingMutex.lock();
132 qCDebug(LOG_DataSourceController()) << tr("DataSourceController init END");
67 qCDebug(LOG_DataSourceController()) << tr("DataSourceController init END");
133 }
68 }
@@ -1,47 +1,21
1 #include <DataSource/DataSourceItem.h>
1 #include <DataSource/DataSourceItem.h>
2 #include <DataSource/DataSourceItemAction.h>
3
2
4 #include <QVector>
3 #include <QVector>
5
4
6 const QString DataSourceItem::NAME_DATA_KEY = QStringLiteral("name");
7
8 struct DataSourceItem::DataSourceItemPrivate {
5 struct DataSourceItem::DataSourceItemPrivate {
9 explicit DataSourceItemPrivate(DataSourceItemType type, QVariantHash data)
6 explicit DataSourceItemPrivate(QVector<QVariant> data)
10 : m_Parent{nullptr}, m_Children{}, m_Type{type}, m_Data{std::move(data)}, m_Actions{}
7 : m_Parent{nullptr}, m_Children{}, m_Data{std::move(data)}
11 {
8 {
12 }
9 }
13
10
14 DataSourceItem *m_Parent;
11 DataSourceItem *m_Parent;
15 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
12 std::vector<std::unique_ptr<DataSourceItem> > m_Children;
16 DataSourceItemType m_Type;
13 QVector<QVariant> m_Data;
17 QVariantHash m_Data;
18 std::vector<std::unique_ptr<DataSourceItemAction> > m_Actions;
19 };
14 };
20
15
21 DataSourceItem::DataSourceItem(DataSourceItemType type, const QString &name)
16 DataSourceItem::DataSourceItem(QVector<QVariant> data)
22 : DataSourceItem{type, QVariantHash{{NAME_DATA_KEY, name}}}
17 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(data)}
23 {
24 }
25
26 DataSourceItem::DataSourceItem(DataSourceItemType type, QVariantHash data)
27 : impl{spimpl::make_unique_impl<DataSourceItemPrivate>(type, std::move(data))}
28 {
29 }
30
31 QVector<DataSourceItemAction *> DataSourceItem::actions() const noexcept
32 {
33 auto result = QVector<DataSourceItemAction *>{};
34
35 std::transform(std::cbegin(impl->m_Actions), std::cend(impl->m_Actions),
36 std::back_inserter(result), [](const auto &action) { return action.get(); });
37
38 return result;
39 }
40
41 void DataSourceItem::addAction(std::unique_ptr<DataSourceItemAction> action) noexcept
42 {
18 {
43 action->setDataSourceItem(this);
44 impl->m_Actions.push_back(std::move(action));
45 }
19 }
46
20
47 void DataSourceItem::appendChild(std::unique_ptr<DataSourceItem> child) noexcept
21 void DataSourceItem::appendChild(std::unique_ptr<DataSourceItem> child) noexcept
@@ -65,81 +39,12 int DataSourceItem::childCount() const noexcept
65 return impl->m_Children.size();
39 return impl->m_Children.size();
66 }
40 }
67
41
68 QVariant DataSourceItem::data(const QString &key) const noexcept
42 QVariant DataSourceItem::data(int dataIndex) const noexcept
69 {
70 return impl->m_Data.value(key);
71 }
72
73 QVariantHash DataSourceItem::data() const noexcept
74 {
43 {
75 return impl->m_Data;
44 return impl->m_Data.value(dataIndex);
76 }
77
78 bool DataSourceItem::isRoot() const noexcept
79 {
80 return impl->m_Parent == nullptr;
81 }
82
83 QString DataSourceItem::name() const noexcept
84 {
85 return data(NAME_DATA_KEY).toString();
86 }
45 }
87
46
88 DataSourceItem *DataSourceItem::parentItem() const noexcept
47 DataSourceItem *DataSourceItem::parentItem() const noexcept
89 {
48 {
90 return impl->m_Parent;
49 return impl->m_Parent;
91 }
50 }
92
93 const DataSourceItem &DataSourceItem::rootItem() const noexcept
94 {
95 return isRoot() ? *this : parentItem()->rootItem();
96 }
97
98 void DataSourceItem::setData(const QString &key, const QVariant &value, bool append) noexcept
99 {
100 auto it = impl->m_Data.constFind(key);
101 if (append && it != impl->m_Data.constEnd()) {
102 // Case of an existing value to which we want to add to the new value
103 if (it->canConvert<QVariantList>()) {
104 auto variantList = it->value<QVariantList>();
105 variantList.append(value);
106
107 impl->m_Data.insert(key, variantList);
108 }
109 else {
110 impl->m_Data.insert(key, QVariantList{*it, value});
111 }
112 }
113 else {
114 // Other cases :
115 // - new value in map OR
116 // - replacement of an existing value (not appending)
117 impl->m_Data.insert(key, value);
118 }
119 }
120
121 DataSourceItemType DataSourceItem::type() const noexcept
122 {
123 return impl->m_Type;
124 }
125
126 bool DataSourceItem::operator==(const DataSourceItem &other)
127 {
128 // Compares items' attributes
129 if (std::tie(impl->m_Type, impl->m_Data) == std::tie(other.impl->m_Type, other.impl->m_Data)) {
130 // Compares contents of items' children
131 return std::equal(std::cbegin(impl->m_Children), std::cend(impl->m_Children),
132 std::cbegin(other.impl->m_Children),
133 [](const auto &itemChild, const auto &otherChild) {
134 return *itemChild == *otherChild;
135 });
136 }
137 else {
138 return false;
139 }
140 }
141
142 bool DataSourceItem::operator!=(const DataSourceItem &other)
143 {
144 return !(*this == other);
145 }
@@ -26,11 +26,12 void TestDataSourceController::testSetDataSourceItem()
26 DataSourceController dataSourceController{};
26 DataSourceController dataSourceController{};
27
27
28 // Spy to test controllers' signals
28 // Spy to test controllers' signals
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(DataSourceItem *))};
29 QSignalSpy signalSpy{&dataSourceController, SIGNAL(dataSourceItemSet(const DataSourceItem &))};
30
30
31 // Create a data source item
31 // Create a data source item
32 auto source1Name = QStringLiteral("Source1");
32 auto source1Name = QStringLiteral("Source1");
33 auto source1Item = std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT, source1Name);
33 auto source1Values = QVector<QVariant>{source1Name};
34 auto source1Item = std::make_unique<DataSourceItem>(std::move(source1Values));
34
35
35 // Add data source item to the controller and check that a signal has been emitted after setting
36 // Add data source item to the controller and check that a signal has been emitted after setting
36 // data source item in the controller
37 // data source item in the controller
@@ -40,8 +41,7 void TestDataSourceController::testSetDataSourceItem()
40
41
41 // Try to a data source item with an unregistered uid and check that no signal has been emitted
42 // Try to a data source item with an unregistered uid and check that no signal has been emitted
42 auto unregisteredUid = QUuid::createUuid();
43 auto unregisteredUid = QUuid::createUuid();
43 dataSourceController.setDataSourceItem(
44 dataSourceController.setDataSourceItem(unregisteredUid, std::make_unique<DataSourceItem>());
44 unregisteredUid, std::make_unique<DataSourceItem>(DataSourceItemType::PRODUCT));
45 QCOMPARE(signalSpy.count(), 1);
45 QCOMPARE(signalSpy.count(), 1);
46 }
46 }
47
47
@@ -1,52 +1,3
1 # On ignore toutes les règles vera++ pour le fichier spimpl
1 # On ignore toutes les règles vera++ pour le fichier spimpl
2 Common/spimpl\.h:\d+:.*
2 Common/spimpl\.h:\d+:.*
3
3
4 # Ignore false positive relative to two class definitions in a same file
5 ArrayData\.h:\d+:.*IPSIS_S01.*
6 ArrayDataIterator\.h:\d+:.*IPSIS_S01.*
7 DataSourceItem\.h:\d+:.*IPSIS_S01.*
8 DataSeries\.h:\d+:.*IPSIS_S01.*
9 DataSeriesIterator\.h:\d+:.*IPSIS_S01.*
10 DataSeriesMergeHelper\.h:\d+:.*IPSIS_S01.*
11
12 # Ignore false positive relative to a template class
13 ArrayData\.h:\d+:.*IPSIS_S04_METHOD.*found: push_back
14 ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (const_iterator)
15 ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (D)
16 ArrayData\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (IC)
17 ArrayData\.h:\d+:.*IPSIS_S04_NAMESPACE.*found: (arraydata_detail)
18 ArrayData\.h:\d+:.*IPSIS_S06.*found: (D)
19 ArrayData\.h:\d+:.*IPSIS_S06.*found: (Dim)
20 ArrayData\.h:\d+:.*IPSIS_S06.*found: (IC)
21 ArrayData\.h:\d+:.*IPSIS_S06.*found: (IsConst)
22 DataSeries\.h:\d+:.*IPSIS_S04_METHOD.*found: LOG_DataSeries
23 DataSeries\.h:\d+:.*IPSIS_S04_METHOD.*found: push_back
24 DataSeries\.h:\d+:.*IPSIS_S04_VARIABLE.*
25 DataSeries\.h:\d+:.*IPSIS_S04_NAMESPACE.*found: (dataseries_detail)
26 DataSeries\.h:\d+:.*IPSIS_S05.*
27 DataSeries\.h:\d+:.*IPSIS_S06.*found: (value_type)
28 DataSeries\.h:\d+:.*IPSIS_S06.*found: (DataSeriesIteratorValue)
29 DataSeries\.h:\d+:.*IPSIS_S06.*found: (Dim)
30 DataSeries\.h:\d+:.*IPSIS_S06.*found: (IC)
31 DataSeries\.h:\d+:.*IPSIS_S06.*found: (IsConst)
32
33 # Ignore false positive relative to iterators
34 SqpIterator\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (random_access_iterator_tag)
35 SqpIterator\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (T)
36 SqpIterator\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (ptrdiff_t)
37 SqpIterator\.h:\d+:.*IPSIS_S04_VARIABLE.*found: (value_type)
38 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (iterator_category)
39 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (random_access_iterator_tag)
40 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (value_type)
41 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (T)
42 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (difference_type)
43 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (ptrdiff_t)
44 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (pointer)
45 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (reference)
46 SqpIterator\.h:\d+:.*IPSIS_S06.*found: (value_type)
47
48 # Ignore false positive relative to an alias
49 DataSourceItemAction\.h:\d+:.*IPSIS_S06.*found: (ExecuteFunction)
50
51 # Ignore false positive relative to unnamed namespace
52 VariableController\.cpp:\d+:.*IPSIS_F13.*
@@ -63,7 +63,6 FUNCTION(ADD_CLANGFORMAT_TARGETS)
63 clangformat_incr(i)
63 clangformat_incr(i)
64 ENDWHILE()
64 ENDWHILE()
65
65
66
67 # Retrieve source files to format
66 # Retrieve source files to format
68 IF(recurse)
67 IF(recurse)
69 FILE(GLOB_RECURSE srcs ${globs})
68 FILE(GLOB_RECURSE srcs ${globs})
@@ -82,15 +81,6 FUNCTION(ADD_CLANGFORMAT_TARGETS)
82 # Create the directory where the touched files will be saved
81 # Create the directory where the touched files will be saved
83 SET(formatDirectory "${CMAKE_CURRENT_BINARY_DIR}/format")
82 SET(formatDirectory "${CMAKE_CURRENT_BINARY_DIR}/format")
84 FILE(MAKE_DIRECTORY ${formatDirectory})
83 FILE(MAKE_DIRECTORY ${formatDirectory})
85 # STRING(REPLACE "*.ui" "" srcs ${srcs})
86 FOREACH(item ${globs})
87 STRING(REGEX MATCH ".*\.ui$" item ${item})
88 IF(item)
89 LIST(APPEND UIS ${item})
90 ENDIF(item)
91 ENDFOREACH(item ${globs})
92
93 LIST(REMOVE_ITEM srcs ${UIS})
94 FOREACH (s ${srcs})
84 FOREACH (s ${srcs})
95 SET(touchedFile ${formatDirectory}/format_touchedfile_${reportNb})
85 SET(touchedFile ${formatDirectory}/format_touchedfile_${reportNb})
96 IF(addToAll)
86 IF(addToAll)
@@ -6,14 +6,3
6 # Ignore false positive relative to 'noexcept' keyword
6 # Ignore false positive relative to 'noexcept' keyword
7 .*IPSIS_S04_VARIABLE.*found: noexcept
7 .*IPSIS_S04_VARIABLE.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
8 .*IPSIS_S06.*found: noexcept
9
10 # Ignore false positive relative to 'override' keyword
11 .*IPSIS_S04_VARIABLE.*found: override
12 .*IPSIS_S06.*found: override
13
14 # Ignore false positive relative to 'final' keyword
15 .*IPSIS_S04_VARIABLE.*found: final
16 .*IPSIS_S06.*found: final
17
18 # Ignore false positive relative to unnamed namespace
19 .*IPSIS_F13.*
@@ -17,7 +17,7 SET(SCIQLOP_CMAKE_GENERATION_WARNING "DON'T CHANGE THIS FILE. AUTOGENERATED BY C
17 #
17 #
18 # Find Qt modules
18 # Find Qt modules
19 #
19 #
20 SCIQLOP_FIND_QT(Core Widgets PrintSupport)
20 SCIQLOP_FIND_QT(Core Widgets)
21
21
22 #
22 #
23 # Find dependent libraries
23 # Find dependent libraries
@@ -65,16 +65,7 set_property(TARGET ${SQPGUI_LIBRARY_NAME} PROPERTY CXX_STANDARD 14)
65 set_property(TARGET ${SQPGUI_LIBRARY_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
65 set_property(TARGET ${SQPGUI_LIBRARY_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
66
66
67 TARGET_LINK_LIBRARIES(${SQPGUI_LIBRARY_NAME} ${LIBRARIES})
67 TARGET_LINK_LIBRARIES(${SQPGUI_LIBRARY_NAME} ${LIBRARIES})
68 qt5_use_modules(${SQPGUI_LIBRARY_NAME} Core Widgets PrintSupport)
68 qt5_use_modules(${SQPGUI_LIBRARY_NAME} Core Widgets)
69
70
71 INSTALL(TARGETS ${SQPGUI_LIBRARY_NAME}
72 RUNTIME DESTINATION ${INSTALL_BINARY_DIR}
73 LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR}
74 ARCHIVE DESTINATION ${INSTALL_LIBRARY_DIR}
75 )
76 add_dependencies(${SQPGUI_LIBRARY_NAME} ${SQPCORE_LIBRARY_NAME})
77
78
69
79 # From cmake documentation: http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
70 # From cmake documentation: http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
80 # Entries in the COMPILE_DEFINITIONS are prefixed with -D or /D and added to the compile line in an unspecified order.
71 # Entries in the COMPILE_DEFINITIONS are prefixed with -D or /D and added to the compile line in an unspecified order.
@@ -96,7 +87,7 SCIQLOP_COPY_TO_TARGET(LIBRARY ${SQPGUI_LIBRARY_NAME})
96 LIST(APPEND CHECKSTYLE_INPUT_FILES ${MODULE_SOURCES})
87 LIST(APPEND CHECKSTYLE_INPUT_FILES ${MODULE_SOURCES})
97 SCIQLOP_SET_TO_PARENT_SCOPE(CHECKSTYLE_INPUT_FILES)
88 SCIQLOP_SET_TO_PARENT_SCOPE(CHECKSTYLE_INPUT_FILES)
98 # Vera++ exclusion files
89 # Vera++ exclusion files
99 LIST(APPEND CHECKSTYLE_EXCLUSION_FILES ${CMAKE_CURRENT_SOURCE_DIR}/vera-exclusions/exclusions.txt)
90 #LIST(APPEND CHECKSTYLE_EXCLUSION_FILES ${CMAKE_CURRENT_SOURCE_DIR}/path/to/exclusionFiles.tcl)
100 SCIQLOP_SET_TO_PARENT_SCOPE(CHECKSTYLE_EXCLUSION_FILES)
91 SCIQLOP_SET_TO_PARENT_SCOPE(CHECKSTYLE_EXCLUSION_FILES)
101
92
102 #
93 #
@@ -16,10 +16,6 Q_DECLARE_LOGGING_CATEGORY(LOG_SqpApplication)
16 #define sqpApp (static_cast<SqpApplication *>(QCoreApplication::instance()))
16 #define sqpApp (static_cast<SqpApplication *>(QCoreApplication::instance()))
17
17
18 class DataSourceController;
18 class DataSourceController;
19 class NetworkController;
20 class TimeController;
21 class VariableController;
22 class VisualizationController;
23
19
24 /**
20 /**
25 * @brief The SqpApplication class aims to make the link between SciQlop
21 * @brief The SqpApplication class aims to make the link between SciQlop
@@ -37,12 +33,7 public:
37 virtual ~SqpApplication();
33 virtual ~SqpApplication();
38 void initialize();
34 void initialize();
39
35
40 /// Accessors for the differents sciqlop controllers
36 DataSourceController &dataSourceController() const noexcept;
41 DataSourceController &dataSourceController() noexcept;
42 NetworkController &networkController() noexcept;
43 TimeController &timeController() noexcept;
44 VariableController &variableController() noexcept;
45 VisualizationController &visualizationController() noexcept;
46
37
47 private:
38 private:
48 class SqpApplicationPrivate;
39 class SqpApplicationPrivate;
@@ -1,119 +1,40
1 #include "SqpApplication.h"
1 #include "SqpApplication.h"
2
2
3 #include <Data/IDataProvider.h>
4 #include <DataSource/DataSourceController.h>
3 #include <DataSource/DataSourceController.h>
5 #include <Network/NetworkController.h>
6 #include <QThread>
4 #include <QThread>
7 #include <Time/TimeController.h>
8 #include <Variable/Variable.h>
9 #include <Variable/VariableController.h>
10 #include <Visualization/VisualizationController.h>
11
5
12 Q_LOGGING_CATEGORY(LOG_SqpApplication, "SqpApplication")
6 Q_LOGGING_CATEGORY(LOG_SqpApplication, "SqpApplication")
13
7
14 class SqpApplication::SqpApplicationPrivate {
8 class SqpApplication::SqpApplicationPrivate {
15 public:
9 public:
16 SqpApplicationPrivate()
10 SqpApplicationPrivate() : m_DataSourceController{std::make_unique<DataSourceController>()}
17 : m_DataSourceController{std::make_unique<DataSourceController>()},
18 m_NetworkController{std::make_unique<NetworkController>()},
19 m_TimeController{std::make_unique<TimeController>()},
20 m_VariableController{std::make_unique<VariableController>()},
21 m_VisualizationController{std::make_unique<VisualizationController>()}
22 {
11 {
23 // /////////////////////////////// //
24 // Connections between controllers //
25 // /////////////////////////////// //
26
27 // VariableController <-> DataSourceController
28 connect(m_DataSourceController.get(),
29 SIGNAL(variableCreationRequested(const QString &, const QVariantHash &,
30 std::shared_ptr<IDataProvider>)),
31 m_VariableController.get(),
32 SLOT(createVariable(const QString &, const QVariantHash &,
33 std::shared_ptr<IDataProvider>)));
34
35 // VariableController <-> VisualizationController
36 connect(m_VariableController.get(),
37 SIGNAL(variableAboutToBeDeleted(std::shared_ptr<Variable>)),
38 m_VisualizationController.get(),
39 SIGNAL(variableAboutToBeDeleted(std::shared_ptr<Variable>)), Qt::DirectConnection);
40
41 connect(m_VariableController.get(),
42 SIGNAL(rangeChanged(std::shared_ptr<Variable>, const SqpRange &)),
43 m_VisualizationController.get(),
44 SIGNAL(rangeChanged(std::shared_ptr<Variable>, const SqpRange &)));
45
46
47 m_DataSourceController->moveToThread(&m_DataSourceControllerThread);
12 m_DataSourceController->moveToThread(&m_DataSourceControllerThread);
48 m_DataSourceControllerThread.setObjectName("DataSourceControllerThread");
49 m_NetworkController->moveToThread(&m_NetworkControllerThread);
50 m_NetworkControllerThread.setObjectName("NetworkControllerThread");
51 m_VariableController->moveToThread(&m_VariableControllerThread);
52 m_VariableControllerThread.setObjectName("VariableControllerThread");
53 m_VisualizationController->moveToThread(&m_VisualizationControllerThread);
54 m_VisualizationControllerThread.setObjectName("VsualizationControllerThread");
55
56
57 // Additionnal init
58 m_VariableController->setTimeController(m_TimeController.get());
59 }
13 }
60
14
61 virtual ~SqpApplicationPrivate()
15 virtual ~SqpApplicationPrivate()
62 {
16 {
17 qCInfo(LOG_SqpApplication()) << tr("SqpApplicationPrivate destruction");
63 m_DataSourceControllerThread.quit();
18 m_DataSourceControllerThread.quit();
64 m_DataSourceControllerThread.wait();
19 m_DataSourceControllerThread.wait();
65
66 m_NetworkControllerThread.quit();
67 m_NetworkControllerThread.wait();
68
69 m_VariableControllerThread.quit();
70 m_VariableControllerThread.wait();
71
72 m_VisualizationControllerThread.quit();
73 m_VisualizationControllerThread.wait();
74 }
20 }
75
21
76 std::unique_ptr<DataSourceController> m_DataSourceController;
22 std::unique_ptr<DataSourceController> m_DataSourceController;
77 std::unique_ptr<VariableController> m_VariableController;
78 std::unique_ptr<TimeController> m_TimeController;
79 std::unique_ptr<NetworkController> m_NetworkController;
80 std::unique_ptr<VisualizationController> m_VisualizationController;
81 QThread m_DataSourceControllerThread;
23 QThread m_DataSourceControllerThread;
82 QThread m_NetworkControllerThread;
83 QThread m_VariableControllerThread;
84 QThread m_VisualizationControllerThread;
85 };
24 };
86
25
87
26
88 SqpApplication::SqpApplication(int &argc, char **argv)
27 SqpApplication::SqpApplication(int &argc, char **argv)
89 : QApplication{argc, argv}, impl{spimpl::make_unique_impl<SqpApplicationPrivate>()}
28 : QApplication{argc, argv}, impl{spimpl::make_unique_impl<SqpApplicationPrivate>()}
90 {
29 {
91 qCDebug(LOG_SqpApplication()) << tr("SqpApplication construction") << QThread::currentThread();
30 qCInfo(LOG_SqpApplication()) << tr("SqpApplication construction");
92
31
93 connect(&impl->m_DataSourceControllerThread, &QThread::started,
32 connect(&impl->m_DataSourceControllerThread, &QThread::started,
94 impl->m_DataSourceController.get(), &DataSourceController::initialize);
33 impl->m_DataSourceController.get(), &DataSourceController::initialize);
95 connect(&impl->m_DataSourceControllerThread, &QThread::finished,
34 connect(&impl->m_DataSourceControllerThread, &QThread::finished,
96 impl->m_DataSourceController.get(), &DataSourceController::finalize);
35 impl->m_DataSourceController.get(), &DataSourceController::finalize);
97
36
98 connect(&impl->m_NetworkControllerThread, &QThread::started, impl->m_NetworkController.get(),
99 &NetworkController::initialize);
100 connect(&impl->m_NetworkControllerThread, &QThread::finished, impl->m_NetworkController.get(),
101 &NetworkController::finalize);
102
103 connect(&impl->m_VariableControllerThread, &QThread::started, impl->m_VariableController.get(),
104 &VariableController::initialize);
105 connect(&impl->m_VariableControllerThread, &QThread::finished, impl->m_VariableController.get(),
106 &VariableController::finalize);
107
108 connect(&impl->m_VisualizationControllerThread, &QThread::started,
109 impl->m_VisualizationController.get(), &VisualizationController::initialize);
110 connect(&impl->m_VisualizationControllerThread, &QThread::finished,
111 impl->m_VisualizationController.get(), &VisualizationController::finalize);
112
113 impl->m_DataSourceControllerThread.start();
37 impl->m_DataSourceControllerThread.start();
114 impl->m_NetworkControllerThread.start();
115 impl->m_VariableControllerThread.start();
116 impl->m_VisualizationControllerThread.start();
117 }
38 }
118
39
119 SqpApplication::~SqpApplication()
40 SqpApplication::~SqpApplication()
@@ -124,27 +45,7 void SqpApplication::initialize()
124 {
45 {
125 }
46 }
126
47
127 DataSourceController &SqpApplication::dataSourceController() noexcept
48 DataSourceController &SqpApplication::dataSourceController() const noexcept
128 {
49 {
129 return *impl->m_DataSourceController;
50 return *impl->m_DataSourceController;
130 }
51 }
131
132 NetworkController &SqpApplication::networkController() noexcept
133 {
134 return *impl->m_NetworkController;
135 }
136
137 TimeController &SqpApplication::timeController() noexcept
138 {
139 return *impl->m_TimeController;
140 }
141
142 VariableController &SqpApplication::variableController() noexcept
143 {
144 return *impl->m_VariableController;
145 }
146
147 VisualizationController &SqpApplication::visualizationController() noexcept
148 {
149 return *impl->m_VisualizationController;
150 }
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (674 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (842 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (636 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (7219 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (31403 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (22288 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (29129 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (10802 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (360000 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 3
Under Review
author

Auto status change to "Under Review"

Approved
author

Status change > Approved

note
author

Pull request merged and closed