v2.0.0
Loading...
Searching...
No Matches
averagelayoutview.cpp
Go to the documentation of this file.
1//=============================================================================================================
35
36//=============================================================================================================
37// INCLUDES
38//=============================================================================================================
39
40#include "averagelayoutview.h"
41
47
48#include <fiff/fiff_info.h>
49
50//=============================================================================================================
51// QT INCLUDES
52//=============================================================================================================
53
54#include <QLabel>
55#include <QVBoxLayout>
56#include <QGraphicsView>
57#include <QSvgGenerator>
58#include <QDebug>
59#include <QGraphicsItem>
60#include <QSettings>
61#include <QRhiWidget>
62
63
64//=============================================================================================================
65// USED NAMESPACES
66//=============================================================================================================
67
68using namespace DISPLIB;
69using namespace FIFFLIB;
70
71//=============================================================================================================
72// DEFINE MEMBER METHODS
73//=============================================================================================================
74
75AverageLayoutView::AverageLayoutView(const QString& sSettingsPath,
76 QWidget *parent,
77 Qt::WindowFlags f)
78: AbstractView(parent, f)
79, m_qMapAverageColor(QSharedPointer<QMap<QString, QColor> >::create())
80, m_qMapAverageActivation(QSharedPointer<QMap<QString, bool> >::create())
81{
82 m_sSettingsPath = sSettingsPath;
83 this->setWindowTitle("Average Layout");
84
85 m_pAverageLayoutView = new QGraphicsView();
86
87 auto *rhiViewport = new QRhiWidget;
88#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
89 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
90#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
91 rhiViewport->setApi(QRhiWidget::Api::Metal);
92#elif defined(Q_OS_WIN)
93 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
94#else
95 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
96#endif
97 m_pAverageLayoutView->setViewport(rhiViewport);
98
99 m_pAverageLayoutView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
100 m_pAverageLayoutView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
101
103 m_pAverageScene->setBackgroundBrush(QBrush(Qt::white));
104
105 m_pAverageLayoutView->setScene(m_pAverageScene.data());
106
107 //set layouts
108 QVBoxLayout *neLayout = new QVBoxLayout(this);
109 neLayout->setContentsMargins(0,0,0,0);
110 neLayout->addWidget(m_pAverageLayoutView);
111 this->setLayout(neLayout);
112 loadSettings();
113}
114
115//=============================================================================================================
116
121
122//=============================================================================================================
123
125{
127 auto *rhiViewport = new QRhiWidget;
128#if defined(WASMBUILD) || defined(__EMSCRIPTEN__)
129 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
130#elif defined(Q_OS_MACOS) || defined(Q_OS_IOS)
131 rhiViewport->setApi(QRhiWidget::Api::Metal);
132#elif defined(Q_OS_WIN)
133 rhiViewport->setApi(QRhiWidget::Api::Direct3D11);
134#else
135 rhiViewport->setApi(QRhiWidget::Api::OpenGL);
136#endif
137 m_pAverageLayoutView->setViewport(rhiViewport);
138 }
139}
140
141//=============================================================================================================
142
143void AverageLayoutView::setChannelInfoModel(QSharedPointer<ChannelInfoModel> &pChannelInfoModel)
144{
145 m_pChannelInfoModel = pChannelInfoModel;
146}
147
148//=============================================================================================================
149
150void AverageLayoutView::setEvokedSetModel(QSharedPointer<EvokedSetModel> pEvokedSetModel)
151{
152 if (pEvokedSetModel){
153 connect(pEvokedSetModel.data(), &EvokedSetModel::dataChanged,
154 this, &AverageLayoutView::updateData, Qt::UniqueConnection);
155 }
156
157 m_pEvokedSetModel = pEvokedSetModel;
158}
159
160//=============================================================================================================
161
162void AverageLayoutView::setBackgroundColor(const QColor& backgroundColor)
163{
164 if(!m_pAverageScene) {
165 qDebug() << "AverageLayoutView::setBackgroundColor - m_pAverageScene is NULL. Returning. ";
166 return;
167 }
168
169 QBrush backgroundBrush = m_pAverageScene->backgroundBrush();
170 backgroundBrush.setColor(backgroundColor);
171 m_pAverageScene->setBackgroundBrush(backgroundBrush);
172}
173
174//=============================================================================================================
175
177{
178 if(!m_pAverageScene) {
179 qDebug() << "AverageLayoutView::getBackgroundColor - m_pAverageScene is NULL. Returning. ";
180 return QColor();
181 }
182
183 return m_pAverageScene->backgroundBrush().color();
184}
185
186//=============================================================================================================
187
188void AverageLayoutView::takeScreenshot(const QString& fileName)
189{
190 if(!m_pAverageScene) {
191 qDebug() << "AverageLayoutView::takeScreenshot - m_pAverageScene is NULL. Returning. ";
192 return;
193 }
194
195 if(fileName.contains(".svg", Qt::CaseInsensitive))
196 {
197 // Generate screenshot
198 QSvgGenerator svgGen;
199 svgGen.setFileName(fileName);
200 QRectF rect = m_pAverageScene->itemsBoundingRect();
201 svgGen.setSize(QSize(rect.width(), rect.height()));
202
203 QPainter painter(&svgGen);
204 m_pAverageScene->render(&painter);
205 }
206
207 if(fileName.contains(".png", Qt::CaseInsensitive))
208 {
209 QRect rect = m_pAverageLayoutView->frameRect();
210 QPixmap pixMap = QWidget::grab(rect);
211 pixMap.save(fileName);
212 }
213}
214
215//=============================================================================================================
216
217void AverageLayoutView::setScaleMap(const QMap<qint32,float> &scaleMap)
218{
219 if(!m_pAverageScene) {
220 qDebug() << "AverageLayoutView::setScaleMap - m_pAverageScene is NULL. Returning. ";
221 return;
222 }
223
224 m_scaleMap = scaleMap;
225
226 m_pAverageScene->setScaleMap(scaleMap);
227
228 updateData();
229}
230
231//=============================================================================================================
232
233QSharedPointer<QMap<QString, QColor> > AverageLayoutView::getAverageColor() const
234{
235 return m_qMapAverageColor;
236}
237
238//=============================================================================================================
239
240QSharedPointer<QMap<QString, bool> > AverageLayoutView::getAverageActivation() const
241{
243}
244
245//=============================================================================================================
246
247void AverageLayoutView::setAverageColor(const QSharedPointer<QMap<QString, QColor> > qMapAverageColor)
248{
249 if(!m_pAverageScene) {
250 qDebug() << "AverageLayoutView::setAverageColor - m_pAverageScene is NULL. Returning. ";
251 return;
252 }
253
254 m_qMapAverageColor = qMapAverageColor;
255 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
256}
257
258//=============================================================================================================
259
261{
262 for (QString mapKey : m_qMapAverageColor->keys()){
263 m_qMapAverageColor->insert(mapKey, avgColor);
264 }
265
266 m_pAverageScene->setColorPerAverage(m_qMapAverageColor);
267 m_pAverageScene->setSignalItemColor(avgColor);
268}
269
270//=============================================================================================================
271
272void AverageLayoutView::setAverageActivation(const QSharedPointer<QMap<QString, bool> > qMapAverageActivation)
273{
274 if(!m_pAverageScene) {
275 qDebug() << "AverageLayoutView::setAverageActivation - m_pAverageScene is NULL. Returning. ";
276 return;
277 }
278
279 m_qMapAverageActivation = qMapAverageActivation;
280 m_pAverageScene->setActivationPerAverage(qMapAverageActivation);
281}
282
283//=============================================================================================================
284
285void AverageLayoutView::channelSelectionManagerChanged(const QList<QGraphicsItem*> &selectedChannelItems)
286{
287 if(!m_pAverageScene) {
288 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
289 return;
290 }
291 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current data
292 m_pAverageScene->repaintItems(selectedChannelItems);
296 updateData();
297}
298
299//=============================================================================================================
300
302{
303 if(!m_pAverageScene) {
304 qDebug() << "AverageLayoutView::channelSelectionManagerChanged - m_pAverageScene is NULL. Returning. ";
305 return;
306 }
307
308 SelectionItem* pSelectionItem = data.value<DISPLIB::SelectionItem*>();
309
310 //Repaint the average items in the average scene based on the input parameter selectedChannelItems and update them with current data
311 m_pAverageScene->repaintSelectionItems(*pSelectionItem);
315 updateData();
316}
317
318//=============================================================================================================
319
321{
322 if(m_pFiffInfo) {
323 QList<QGraphicsItem *> currentAverageSceneItems = m_pAverageScene->items();
324
325 //Set new data for all averageSceneItems
326 for(int i = 0; i < currentAverageSceneItems.size(); i++) {
327 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
328
329 averageSceneItemTemp->m_lAverageData.clear();
330
332 //Get only the necessary data from the average model (use column 2)
333 QList<QPair<QString, DISPLIB::RowVectorPair> > averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair> > >();
334
335 //Get the averageScenItem specific data row
336 int channelNumber = averageSceneItemTemp->m_iChannelNumber;
337
338 if(channelNumber != -1) {
339 averageSceneItemTemp->m_iChannelKind = m_pFiffInfo->chs.at(channelNumber).kind;
340 averageSceneItemTemp->m_iChannelUnit = m_pFiffInfo->chs.at(channelNumber).unit;
341 averageSceneItemTemp->m_firstLastSample.first = (-1)*m_pEvokedSetModel->getNumPreStimSamples();
342
343 if(!averageData.isEmpty()) {
344 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
345 }
346
347 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
348 averageSceneItemTemp->m_lAverageData = averageData;
349 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
350 }
351 }
352 }
353
354 m_pAverageScene->updateScene();
355 return;
356 }
357
359 qDebug() << "AverageLayoutView::updateData - m_pAverageScene, m_pEvokedSetModel or m_pChannelInfoModel are NULL. Returning. ";
360 return;
361 }
362 //Get current items from the average scene
363 QList<QGraphicsItem *> currentAverageSceneItems = m_pAverageScene->items();
364
365 //Set new data for all averageSceneItems
366 for(int i = 0; i < currentAverageSceneItems.size(); i++) {
367 AverageSceneItem* averageSceneItemTemp = static_cast<AverageSceneItem*>(currentAverageSceneItems.at(i));
368
369 averageSceneItemTemp->m_lAverageData.clear();
370
371 //Get only the necessary data from the average model (use column 2)
372 QList<QPair<QString, DISPLIB::RowVectorPair> > averageData = m_pEvokedSetModel->data(0, 2, EvokedSetModelRoles::GetAverageData).value<QList<QPair<QString, DISPLIB::RowVectorPair> > >();
373
374 //Get the averageScenItem specific data row
375 int channelNumber = m_pChannelInfoModel->getIndexFromMappedChName(averageSceneItemTemp->m_sChannelName);
376
377 if(channelNumber != -1) {
378 //qDebug() << "Change data for" << channelNumber << "" << averageSceneItemTemp->m_sChannelName;
379
380 averageSceneItemTemp->m_iChannelKind = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 4), ChannelInfoModelRoles::GetChKind).toInt();
381 averageSceneItemTemp->m_iChannelUnit = m_pChannelInfoModel->data(m_pChannelInfoModel->index(channelNumber, 6), ChannelInfoModelRoles::GetChUnit).toInt();
382 averageSceneItemTemp->m_firstLastSample.first = (-1)*m_pEvokedSetModel->getNumPreStimSamples();
383
384 if(!averageData.isEmpty()) {
385 averageSceneItemTemp->m_firstLastSample.second = averageData.first().second.second - m_pEvokedSetModel->getNumPreStimSamples();
386 }
387
388 averageSceneItemTemp->m_iChannelNumber = channelNumber;
389 averageSceneItemTemp->m_iTotalNumberChannels = m_pEvokedSetModel->rowCount();
390 averageSceneItemTemp->m_lAverageData = averageData;
391 averageSceneItemTemp->m_bIsBad = m_pEvokedSetModel->getIsChannelBad(channelNumber);
392 }
393 }
394
395 m_pAverageScene->updateScene();
396}
397
398//=============================================================================================================
399
401{
402 if(m_sSettingsPath.isEmpty()) {
403 return;
404 }
405
406 QSettings settings("MNECPP");
407}
408
409//=============================================================================================================
410
412{
413 if(m_sSettingsPath.isEmpty()) {
414 return;
415 }
416
417 QSettings settings("MNECPP");
418}
419
420//=============================================================================================================
421
423{
424 switch(mode) {
426 break;
427 default: // default is research mode
428 break;
429 }
430}
431
432//=============================================================================================================
433
435{
436 switch(mode) {
438 break;
439 default: // default is realtime mode
440 break;
441 }
442}
443
444//=============================================================================================================
445
446void AverageLayoutView::setFiffInfo(const QSharedPointer<FIFFLIB::FiffInfo> pFiffInfo)
447{
448 m_pFiffInfo = pFiffInfo;
449}
450
451//=============================================================================================================
452
453QSharedPointer<EvokedSetModel> AverageLayoutView::getEvokedSetModel()
454{
455 return m_pEvokedSetModel;
456}
457
458//=============================================================================================================
459
461{
462 setEvokedSetModel(Q_NULLPTR);
463 updateData();
464}
Declaration of the AverageLayoutView Class.
Contains the declaration of the AverageScene class.
Declaration of the EvokedSetModel Class.
Contains the declaration of the AverageSceneItem class.
The declaration for ChannelInfoModel..
Contains the declaration of the SelectionSceneItem class.
FiffInfo class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
2-D display widgets and visualisation helpers (charts, topography, colour maps).
AbstractView(QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void setBackgroundColor(const QColor &backgroundColor)
QMap< qint32, float > m_scaleMap
void setEvokedSetModel(QSharedPointer< EvokedSetModel > pEvokedSetModel)
void channelSelectionChanged(const QVariant &data)
void setChannelInfoModel(QSharedPointer< ChannelInfoModel > &pChannelInfoModel)
QSharedPointer< QMap< QString, bool > > getAverageActivation() const
QSharedPointer< FIFFLIB::FiffInfo > m_pFiffInfo
QSharedPointer< DISPLIB::EvokedSetModel > m_pEvokedSetModel
void setAverageColor(const QSharedPointer< QMap< QString, QColor > > qMapAverageColor)
QPointer< QGraphicsView > m_pAverageLayoutView
QSharedPointer< AverageScene > m_pAverageScene
QSharedPointer< QMap< QString, QColor > > m_qMapAverageColor
QSharedPointer< QMap< QString, QColor > > getAverageColor() const
QSharedPointer< QMap< QString, bool > > m_qMapAverageActivation
void setScaleMap(const QMap< qint32, float > &scaleMap)
void takeScreenshot(const QString &fileName)
void setAverageActivation(const QSharedPointer< QMap< QString, bool > > qMapAverageActivation)
QSharedPointer< DISPLIB::ChannelInfoModel > m_pChannelInfoModel
void setFiffInfo(const QSharedPointer< FIFFLIB::FiffInfo > pFiffInfo)
AverageLayoutView(const QString &sSettingsPath="", QWidget *parent=0, Qt::WindowFlags f=Qt::Widget)
void updateProcessingMode(ProcessingMode mode)
void channelSelectionManagerChanged(const QList< QGraphicsItem * > &selectedChannelItems)
void setSingleAverageColor(const QColor &avgColor)
QSharedPointer< EvokedSetModel > getEvokedSetModel()
The AverageScene class provides a reimplemented QGraphicsScene for 2D layout plotting.
QSharedPointer< AverageScene > SPtr
The AverageSceneItem class provides a new data structure for visualizing averages in a 2D layout.
QList< QPair< QString, RowVectorPair > > m_lAverageData
QPair< int, int > m_firstLastSample
The SelectionSceneItem class provides a new data structure for visualizing channels in a 2D layout.