BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
RealDataSelectorWidget Class Reference

The RealDataSelectorWidget represents left panel of ImportDataView. More...

Inheritance diagram for RealDataSelectorWidget:
[legend]
Collaboration diagram for RealDataSelectorWidget:
[legend]

Signals

void selectionChanged (SessionItem *)
 

Public Member Functions

 RealDataSelectorWidget (QWidget *parent=0)
 
RealDataItemcurrentItem ()
 
virtual QSize minimumSizeHint () const override
 
void setCurrentItem (RealDataItem *item)
 
void setModel (RealDataModel *realDataModel)
 
virtual QSize sizeHint () const override
 

Protected Member Functions

virtual void showEvent (QShowEvent *) override
 

Private Member Functions

QModelIndex currentIndex ()
 
void importData (int ndim)
 
void onContextMenuRequest (const QPoint &point)
 
void onSelectionChanged ()
 
void removeCurrentItem ()
 
void renameCurrentItem ()
 
void rotateCurrentItem ()
 
void updateActionEnabling ()
 
void updateActionEnabling (const RealDataItem *item)
 

Private Attributes

QAction * m_import1dDataAction
 
QAction * m_import2dDataAction
 
QTreeView * m_itemTree
 
RealDataTreeModelm_itemTreeModel
 
RealDataPropertiesWidgetm_propertiesWidget
 
QAction * m_removeDataAction
 
QAction * m_renameDataAction
 
QAction * m_rotateDataAction
 

Detailed Description

The RealDataSelectorWidget represents left panel of ImportDataView.

Contains a tree to select data set (m_itemTree & m_itemTreeModel) and properties of currently selected data (RealDataPropertiesWidget).

Definition at line 35 of file RealDataSelectorWidget.h.

Constructor & Destructor Documentation

◆ RealDataSelectorWidget()

RealDataSelectorWidget::RealDataSelectorWidget ( QWidget *  parent = 0)

Definition at line 39 of file RealDataSelectorWidget.cpp.

40  : QWidget(parent)
41  , m_itemTree(new QTreeView)
44  , m_import2dDataAction(new QAction(this))
45  , m_import1dDataAction(new QAction(this))
46  , m_renameDataAction(new QAction(this))
47  , m_removeDataAction(new QAction(this))
48  , m_rotateDataAction(new QAction(this))
49 {
50  setMinimumSize(128, 600);
51  setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
52  setWindowTitle("RealDataSelectorWidget");
53 
54  // #baimport ++ necessary to tree somehow?
55  /*
56  QSize RealDataItemSelectorWidget::sizeHint() const
57  {
58  return QSize(Constants::ITEM_SELECTOR_WIDGET_WIDTH, Constants::ITEM_SELECTOR_WIDGET_HEIGHT);
59  }
60 
61  QSize RealDataItemSelectorWidget::minimumSizeHint() const { return QSize(25, 25); }
62  */
63 
64  m_import2dDataAction->setText("Import 2D data");
65  m_import2dDataAction->setIcon(QIcon(":/images/import.svg"));
66  m_import2dDataAction->setIconText("2D");
67  m_import2dDataAction->setToolTip("Import 2D data");
68  connect(m_import2dDataAction, &QAction::triggered, [this]() { importData(2); });
69 
70  m_import1dDataAction->setText("Import 1D data");
71  m_import1dDataAction->setIcon(QIcon(":/images/import.svg"));
72  m_import1dDataAction->setIconText("1D");
73  m_import1dDataAction->setToolTip("Import 1D data");
74  connect(m_import1dDataAction, &QAction::triggered, [this]() { importData(1); });
75 
76  m_renameDataAction->setText("Rename");
77  m_renameDataAction->setIcon(QIcon()); // #baTODO: Icon needed?
78  m_renameDataAction->setIconText("Rename");
79  m_renameDataAction->setToolTip("Rename data");
80  connect(m_renameDataAction, &QAction::triggered, this,
82 
83  m_removeDataAction->setText("Remove");
84  m_removeDataAction->setIcon(QIcon(":/images/delete.svg"));
85  m_removeDataAction->setIconText("Remove");
86  m_removeDataAction->setToolTip("Remove selected data");
87  connect(m_removeDataAction, &QAction::triggered, this,
89 
90  m_rotateDataAction->setText("Rotate");
91  m_rotateDataAction->setIcon(QIcon(":/images/rotate-left.svg"));
92  m_rotateDataAction->setIconText("Rotate");
93  m_rotateDataAction->setToolTip("Rotate intensity data by 90 deg counterclockwise");
94  connect(m_rotateDataAction, &QAction::triggered, this,
96 
97  QToolBar* toolBar = new StyledToolBar(this);
98  toolBar->setMinimumSize(toolBar->minimumHeight(), toolBar->minimumHeight());
99  toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
100  toolBar->addAction(m_import2dDataAction);
101  toolBar->addAction(m_import1dDataAction);
102  toolBar->addAction(m_removeDataAction);
103  toolBar->addAction(m_rotateDataAction);
104 
105  // #baimport ++ following line necessary for tree as well? relevant for RealItems at all?
106  // m_itemTree->setAttribute(Qt::WA_MacShowFocusRect, false);
107  m_itemTree->setItemsExpandable(false);
108  m_itemTree->setRootIsDecorated(false);
109  m_itemTree->setHeaderHidden(true);
110  m_itemTree->setContextMenuPolicy(Qt::CustomContextMenu);
111  m_itemTree->setModel(m_itemTreeModel);
112 
113  auto splitter = new QSplitter;
114  splitter->setOrientation(Qt::Vertical);
115  splitter->addWidget(m_itemTree);
116  splitter->addWidget(m_propertiesWidget);
117  splitter->setChildrenCollapsible(true);
118 
119  auto mainLayout = new QVBoxLayout;
120  mainLayout->setMargin(0);
121  mainLayout->setSpacing(0);
122  mainLayout->setContentsMargins(0, 0, 0, 0);
123  mainLayout->addWidget(toolBar);
124  mainLayout->addWidget(splitter);
125  setLayout(mainLayout);
126 
127  connect(m_itemTree, &QTreeView::customContextMenuRequested, this,
129 
131 }
The RealDataPropertiesWidget class holds instrument selector to link with RealDataItem.
RealDataTreeModel * m_itemTreeModel
void onContextMenuRequest(const QPoint &point)
RealDataPropertiesWidget * m_propertiesWidget
Tree model for real data item selection. Used for the tree in the import view.
The StyledToolBar class represents our standard narrow toolbar with the height 24 pixels.
Definition: StyledToolBar.h:22

References importData(), m_import1dDataAction, m_import2dDataAction, m_itemTree, m_itemTreeModel, m_propertiesWidget, m_removeDataAction, m_renameDataAction, m_rotateDataAction, onContextMenuRequest(), removeCurrentItem(), renameCurrentItem(), rotateCurrentItem(), and updateActionEnabling().

Here is the call graph for this function:

Member Function Documentation

◆ currentIndex()

QModelIndex RealDataSelectorWidget::currentIndex ( )
private

Definition at line 170 of file RealDataSelectorWidget.cpp.

171 {
172  return m_itemTree->selectionModel()->currentIndex();
173 }

References m_itemTree.

Referenced by currentItem(), and renameCurrentItem().

◆ currentItem()

RealDataItem * RealDataSelectorWidget::currentItem ( )

Definition at line 157 of file RealDataSelectorWidget.cpp.

158 {
160 }
RealDataItem * itemForIndex(const QModelIndex &index) const

References currentIndex(), RealDataTreeModel::itemForIndex(), and m_itemTreeModel.

Referenced by onSelectionChanged(), removeCurrentItem(), rotateCurrentItem(), showEvent(), and updateActionEnabling().

Here is the call graph for this function:

◆ importData()

void RealDataSelectorWidget::importData ( int  ndim)
private

Definition at line 203 of file RealDataSelectorWidget.cpp.

204 {
205  QMap<QString, AbstractDataLoader*> loaderOfFilter;
206  QString filters;
207  QString selectedFilter;
208  if (ndim == 2) {
209  filters = "Intensity File (*.int *.gz *.tif *.tiff *.txt *.csv);;"
210  "Other (*.*)";
212  } else {
213  for (auto loader : DataLoaders1D::instance().loaders()) {
214  const QString filter =
215  loader->name()
216  + " (*.txt *.csv *.dat)"; // #baimport - take file filters from loader
217  loaderOfFilter[filter] = loader;
218 
219  if (!filters.isEmpty())
220  filters += ";;";
221  filters += filter;
222  }
223  filters += ";;Other (*.*)";
224 
226  }
227  QString dirname = AppSvc::projectManager()->userImportDir();
228  QStringList fileNames = QFileDialog::getOpenFileNames(Q_NULLPTR, "Open Intensity Files",
229  dirname, filters, &selectedFilter);
230 
231  if (fileNames.isEmpty())
232  return;
233 
234  QString newImportDir = GUIHelpers::fileDir(fileNames[0]);
235  if (newImportDir != dirname)
236  AppSvc::projectManager()->setImportDir(newImportDir);
237 
238  if (ndim == 1)
240  else
242 
243  for (const auto& fileName : fileNames) {
244  QFileInfo info(fileName);
245  auto baseNameOfLoadedFile = info.baseName();
246 
247  if (ndim == 2) {
248  std::unique_ptr<OutputData<double>> data = ImportDataUtils::Import2dData(fileName);
249  if (data) {
250  auto realDataItem = m_itemTreeModel->insertIntensityDataItem();
251  realDataItem->setName(baseNameOfLoadedFile);
252  realDataItem->setOutputData(data.release());
253  setCurrentItem(realDataItem);
254  }
255  } else if (ndim == 1) {
256  auto realDataItem = m_itemTreeModel->insertSpecularDataItem();
257  realDataItem->setName(baseNameOfLoadedFile);
258  realDataItem->setNativeFileName(fileName);
259 
260  const AbstractDataLoader* selectedLoader =
261  loaderOfFilter.value(selectedFilter, nullptr);
262  const QString errorText = ImportDataUtils::Import1dData(realDataItem, selectedLoader);
263  if (errorText.isEmpty())
264  setCurrentItem(realDataItem);
265  else {
266  m_itemTreeModel->removeItem(realDataItem);
267 
268  GUIHelpers::warning("File import",
269  QString("The file '%1' could not be imported.")
270  .arg(QDir::toNativeSeparators(fileName)),
271  errorText);
272  }
273  }
274  }
275 }
Base class for all data loaders (classes which can import real data)
static ProjectManager * projectManager()
Definition: AppSvc.cpp:18
static DataLoaders1D & instance()
The one and only instance.
void setRecentlyUsedImportFilter1D(const QString &filter)
QString recentlyUsedImportFilter2D() const
void setRecentlyUsedImportFilter2D(const QString &filter)
void setImportDir(const QString &dirname)
Sets user import directory in system settings.
QString userImportDir() const
Returns directory name which was used by the user to import files.
QString recentlyUsedImportFilter1D() const
void setName(const QString &name)
void setCurrentItem(RealDataItem *item)
RealDataItem * insertIntensityDataItem()
RealDataItem * insertSpecularDataItem()
void removeItem(RealDataItem *item)
void warning(QWidget *parent, const QString &title, const QString &text, const QString &detailedText)
Definition: GUIHelpers.cpp:74
QString fileDir(const QString &fileName)
Returns file directory from the full file path.
Definition: GUIHelpers.cpp:193
QString Import1dData(RealDataItem *realDataItem, const AbstractDataLoader *selectedLoader)
Import 1D data into the given item.
std::unique_ptr< OutputData< double > > Import2dData(const QString &baseNameOfLoadedFile)

References GUIHelpers::fileDir(), ImportDataUtils::Import1dData(), ImportDataUtils::Import2dData(), RealDataTreeModel::insertIntensityDataItem(), RealDataTreeModel::insertSpecularDataItem(), DataLoaders1D::instance(), m_itemTreeModel, AppSvc::projectManager(), ProjectManager::recentlyUsedImportFilter1D(), ProjectManager::recentlyUsedImportFilter2D(), RealDataTreeModel::removeItem(), setCurrentItem(), ProjectManager::setImportDir(), RealDataItem::setName(), ProjectManager::setRecentlyUsedImportFilter1D(), ProjectManager::setRecentlyUsedImportFilter2D(), ProjectManager::userImportDir(), and GUIHelpers::warning().

Referenced by RealDataSelectorWidget().

Here is the call graph for this function:

◆ minimumSizeHint()

QSize RealDataSelectorWidget::minimumSizeHint ( ) const
overridevirtual

Definition at line 138 of file RealDataSelectorWidget.cpp.

139 {
140  return QSize(128, 200);
141 }

◆ onContextMenuRequest()

void RealDataSelectorWidget::onContextMenuRequest ( const QPoint &  point)
private

Definition at line 182 of file RealDataSelectorWidget.cpp.

183 {
184  auto realDataItemAtPoint = m_itemTreeModel->itemForIndex(m_itemTree->indexAt(point));
185  updateActionEnabling(realDataItemAtPoint);
186 
187  QMenu menu;
188  menu.setToolTipsVisible(true);
189 
190  if (realDataItemAtPoint != nullptr) {
191  menu.addAction(m_renameDataAction);
192  menu.addAction(m_removeDataAction);
193  if (realDataItemAtPoint->isIntensityData())
194  menu.addAction(m_rotateDataAction);
195  menu.addSeparator();
196  }
197 
198  menu.addAction(m_import2dDataAction);
199  menu.addAction(m_import1dDataAction);
200  menu.exec(m_itemTree->mapToGlobal(point));
201 }

References RealDataTreeModel::itemForIndex(), m_import1dDataAction, m_import2dDataAction, m_itemTree, m_itemTreeModel, m_removeDataAction, m_renameDataAction, m_rotateDataAction, and updateActionEnabling().

Referenced by RealDataSelectorWidget().

Here is the call graph for this function:

◆ onSelectionChanged()

void RealDataSelectorWidget::onSelectionChanged ( )
private

Definition at line 175 of file RealDataSelectorWidget.cpp.

176 {
180 }
void setItem(RealDataItem *item)
Set current RealDataItem to display in instrument selector.
void selectionChanged(SessionItem *)

References currentItem(), m_propertiesWidget, selectionChanged(), RealDataPropertiesWidget::setItem(), and updateActionEnabling().

Referenced by setModel().

Here is the call graph for this function:

◆ removeCurrentItem()

void RealDataSelectorWidget::removeCurrentItem ( )
private

Definition at line 283 of file RealDataSelectorWidget.cpp.

284 {
286 }

References currentItem(), m_itemTreeModel, and RealDataTreeModel::removeItem().

Referenced by RealDataSelectorWidget().

Here is the call graph for this function:

◆ renameCurrentItem()

void RealDataSelectorWidget::renameCurrentItem ( )
private

Definition at line 277 of file RealDataSelectorWidget.cpp.

278 {
279  if (currentIndex().isValid())
280  m_itemTree->edit(currentIndex());
281 }

References currentIndex(), and m_itemTree.

Referenced by RealDataSelectorWidget().

Here is the call graph for this function:

◆ rotateCurrentItem()

void RealDataSelectorWidget::rotateCurrentItem ( )
private

Definition at line 288 of file RealDataSelectorWidget.cpp.

289 {
290  if (!currentItem() || !currentItem()->isIntensityData())
291  // should never happen because of action disabling => no
292  // dialog necessary
293  return;
294 
295  if (currentItem()->rotationAffectsSetup()) {
296  const QString title("Rotate data");
297  const QString message("Rotation will break the link between the data and the instrument. "
298  "Detector masks or projections, if they exist, will be removed.");
299  if (!GUIHelpers::question(MainWindow::instance(), title, message,
300  "Do you wish to rotate the data?", "Yes, please rotate",
301  "No, cancel data rotation"))
302  return;
303  }
304 
305  QApplication::setOverrideCursor(Qt::WaitCursor);
306  currentItem()->rotateData();
307  QApplication::restoreOverrideCursor();
308 }
static MainWindow * instance()
Returns the one and only instance of this class.
Definition: mainwindow.cpp:129
bool question(QWidget *parent, const QString &title, const QString &text, const QString &detailedText, const QString &yesText, const QString &noText)
Definition: GUIHelpers.cpp:94

References currentItem(), MainWindow::instance(), GUIHelpers::question(), and RealDataItem::rotateData().

Referenced by RealDataSelectorWidget().

Here is the call graph for this function:

◆ selectionChanged

void RealDataSelectorWidget::selectionChanged ( SessionItem )
signal

◆ setCurrentItem()

void RealDataSelectorWidget::setCurrentItem ( RealDataItem item)

Definition at line 162 of file RealDataSelectorWidget.cpp.

163 {
164  m_itemTree->selectionModel()->clearSelection();
165  QModelIndex index = m_itemTreeModel->indexForItem(item);
166  if (index.isValid())
167  m_itemTree->selectionModel()->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
168 }
QModelIndex indexForItem(RealDataItem *item) const

References RealDataTreeModel::indexForItem(), m_itemTree, and m_itemTreeModel.

Referenced by importData(), and showEvent().

Here is the call graph for this function:

◆ setModel()

void RealDataSelectorWidget::setModel ( RealDataModel realDataModel)

Definition at line 143 of file RealDataSelectorWidget.cpp.

144 {
145  m_itemTreeModel->setRealDataModel(realDataModel);
146 
147  connect(m_itemTreeModel, &QAbstractItemModel::modelReset,
148  [this]() { m_itemTree->expandAll(); });
149 
150  connect(m_itemTreeModel, &QAbstractItemModel::rowsInserted,
151  [this]() { m_itemTree->expandAll(); });
152 
153  connect(m_itemTree->selectionModel(), &QItemSelectionModel::selectionChanged, this,
154  &RealDataSelectorWidget::onSelectionChanged, Qt::UniqueConnection);
155 }
void setRealDataModel(RealDataModel *model)

References m_itemTree, m_itemTreeModel, onSelectionChanged(), and RealDataTreeModel::setRealDataModel().

Referenced by ImportDataView::ImportDataView().

Here is the call graph for this function:

◆ showEvent()

void RealDataSelectorWidget::showEvent ( QShowEvent *  )
overrideprotectedvirtual

Definition at line 325 of file RealDataSelectorWidget.cpp.

326 {
327  // ensure a current item when widget is shown
328  if (!currentItem())
330 }
RealDataItem * topMostItem() const
The topmost visible item. Can be null of course.

References currentItem(), m_itemTreeModel, setCurrentItem(), and RealDataTreeModel::topMostItem().

Here is the call graph for this function:

◆ sizeHint()

QSize RealDataSelectorWidget::sizeHint ( ) const
overridevirtual

Definition at line 133 of file RealDataSelectorWidget.cpp.

134 {
135  return QSize(200, 400);
136 }

◆ updateActionEnabling() [1/2]

void RealDataSelectorWidget::updateActionEnabling ( )
private

Definition at line 310 of file RealDataSelectorWidget.cpp.

311 {
313 }

References currentItem().

Referenced by RealDataSelectorWidget(), onContextMenuRequest(), and onSelectionChanged().

Here is the call graph for this function:

◆ updateActionEnabling() [2/2]

void RealDataSelectorWidget::updateActionEnabling ( const RealDataItem item)
private

Definition at line 315 of file RealDataSelectorWidget.cpp.

316 {
317  m_import2dDataAction->setEnabled(true);
318  m_import1dDataAction->setEnabled(true);
319 
320  m_rotateDataAction->setEnabled(item != nullptr ? item->isIntensityData() : false);
321  m_removeDataAction->setEnabled(item != nullptr);
322  m_renameDataAction->setEnabled(item != nullptr);
323 }
bool isIntensityData() const

References RealDataItem::isIntensityData(), m_import1dDataAction, m_import2dDataAction, m_removeDataAction, m_renameDataAction, and m_rotateDataAction.

Here is the call graph for this function:

Member Data Documentation

◆ m_import1dDataAction

QAction* RealDataSelectorWidget::m_import1dDataAction
private

◆ m_import2dDataAction

QAction* RealDataSelectorWidget::m_import2dDataAction
private

◆ m_itemTree

QTreeView* RealDataSelectorWidget::m_itemTree
private

◆ m_itemTreeModel

RealDataTreeModel* RealDataSelectorWidget::m_itemTreeModel
private

◆ m_propertiesWidget

RealDataPropertiesWidget* RealDataSelectorWidget::m_propertiesWidget
private

Definition at line 69 of file RealDataSelectorWidget.h.

Referenced by RealDataSelectorWidget(), and onSelectionChanged().

◆ m_removeDataAction

QAction* RealDataSelectorWidget::m_removeDataAction
private

◆ m_renameDataAction

QAction* RealDataSelectorWidget::m_renameDataAction
private

◆ m_rotateDataAction

QAction* RealDataSelectorWidget::m_rotateDataAction
private

The documentation for this class was generated from the following files: