BornAgain  1.19.0
Simulate and fit neutron and x-ray scattering at grazing incidence
gui2::ParserPropertyWidget Class Reference

Panel to setup ASCII parser. More...

Inheritance diagram for gui2::ParserPropertyWidget:
[legend]
Collaboration diagram for gui2::ParserPropertyWidget:
[legend]

Public Types

enum  SeparatorButtonId { AUTOMATIC , SPACE , COMMA , CUSTOM }
 

Signals

void parserPropertyChanged ()
 
int targetCanvasChanged (int canvas_index)
 

Public Member Functions

 ParserPropertyWidget (QWidget *parent=nullptr)
 
 ~ParserPropertyWidget ()
 
std::unique_ptr< ParserInterfacecreateParser () const
 Creates parser from parser properties. More...
 
void setTargetCanvas (const QStringList &canvas_names, int current_index)
 Sets list of canvas names as possible import targets. More...
 

Private Slots

void onParserPropertyChange ()
 

Private Member Functions

void addCustomSeparatorRow (QGridLayout *layout, QButtonGroup *group)
 Adds row to the grid: elements with custom separator settings. More...
 
void addIgnoreNumbersPatternRow (QGridLayout *layout)
 Adds row to the grid: elements with pattern to ignore line numbers. More...
 
void addIgnoreStringPatternRow (QGridLayout *layout)
 Adds row to the grid: elements with pattern to ignore lines. More...
 
void addImportToBlock (QGridLayout *layout)
 Adds row to the grid: elements related to the import target. More...
 
void addSectionLabel (const QString &text, QGridLayout *layout)
 
void addStandardSeparatorRow (QGridLayout *layout, QButtonGroup *group)
 Adds row to the grid: elements with standard separator settings. More...
 
QGridLayout * createGridLayout ()
 
void readSettings ()
 Reads widget settings. More...
 
void writeSettings ()
 Writes widget settings. More...
 

Private Attributes

QLineEdit * m_customSeparatorLineEdit {nullptr}
 
ParserOptions m_options
 
QButtonGroup * m_separatorButtonGroup {nullptr}
 
QComboBox * m_targetCanvasCombo {nullptr}
 

Detailed Description

Panel to setup ASCII parser.

Intended for concrete class DefaultParser. Contains selection of separator symbols, patterns to ignore lines, and import target settings.

Definition at line 35 of file parserpropertywidget.h.

Member Enumeration Documentation

◆ SeparatorButtonId

Constructor & Destructor Documentation

◆ ParserPropertyWidget()

gui2::ParserPropertyWidget::ParserPropertyWidget ( QWidget *  parent = nullptr)

Definition at line 63 of file parserpropertywidget.cpp.

63  : QWidget(parent)
64 {
65  auto layout = new QVBoxLayout(this);
66  layout->addLayout(createGridLayout());
67  layout->addStretch(1);
68 
69  readSettings();
70 }
void readSettings()
Reads widget settings.

References createGridLayout(), and readSettings().

Here is the call graph for this function:

◆ ~ParserPropertyWidget()

gui2::ParserPropertyWidget::~ParserPropertyWidget ( )

Definition at line 72 of file parserpropertywidget.cpp.

73 {
74  writeSettings();
75 }
void writeSettings()
Writes widget settings.

References writeSettings().

Here is the call graph for this function:

Member Function Documentation

◆ addCustomSeparatorRow()

void gui2::ParserPropertyWidget::addCustomSeparatorRow ( QGridLayout *  layout,
QButtonGroup *  group 
)
private

Adds row to the grid: elements with custom separator settings.

Definition at line 208 of file parserpropertywidget.cpp.

209 {
210  int row = layout->rowCount();
211  m_customSeparatorLineEdit = new QLineEdit;
212  auto customRadio = new QRadioButton;
213 
214  // custom separator radio
215  customRadio->setText("Custom");
216  customRadio->setToolTip("Use given symbols as column separator");
217  auto on_custom_separator = [this](auto) {
218  m_options.m_separator = m_customSeparatorLineEdit->text().toStdString();
220  };
221  connect(customRadio, &QRadioButton::clicked, on_custom_separator);
222 
223  // custom separator text
225  m_customSeparatorLineEdit->setToolTip("Use given symbols as column separator");
226  auto on_custom_lineedit = [this, customRadio]() {
227  if (customRadio->isChecked())
228  m_options.m_separator = m_customSeparatorLineEdit->text().toStdString();
230  };
231  connect(m_customSeparatorLineEdit, &QLineEdit::editingFinished, on_custom_lineedit);
232 
233  // adding to the layout
234  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
235  layout->addWidget(customRadio, row, 1, Qt::AlignLeft);
236  layout->addWidget(m_customSeparatorLineEdit, row, 2, Qt::AlignLeft);
237  group->addButton(customRadio, CUSTOM);
238 }
MVVM_VIEW_EXPORT int WidthOfLetterM()
Returns width of the letter 'M' deduced from current font metrics.
std::string m_separator
column separator

References CUSTOM, m_customSeparatorLineEdit, m_options, gui2::ParserOptions::m_separator, onParserPropertyChange(), and ModelView::Utils::WidthOfLetterM().

Referenced by createGridLayout().

Here is the call graph for this function:

◆ addIgnoreNumbersPatternRow()

void gui2::ParserPropertyWidget::addIgnoreNumbersPatternRow ( QGridLayout *  layout)
private

Adds row to the grid: elements with pattern to ignore line numbers.

Definition at line 278 of file parserpropertywidget.cpp.

279 {
280  auto lineNumbersRadio = new QRadioButton;
281  auto lineNumbersLineEdit = new QLineEdit;
282 
283  // radio settings
284  int row = layout->rowCount();
285  lineNumbersRadio->setAutoExclusive(false);
286  lineNumbersRadio->setText("Line numbers");
287  lineNumbersRadio->setToolTip("Ignore lines with line numbers matching the pattern");
288  auto on_linenumbers_radio = [this, lineNumbersLineEdit](auto checked) {
290  checked ? lineNumbersLineEdit->text().toStdString() : std::string();
292  };
293  connect(lineNumbersRadio, &QRadioButton::clicked, on_linenumbers_radio);
294 
295  // line edit settings
296  lineNumbersLineEdit->setPlaceholderText("Example: 1-5,42");
297  lineNumbersLineEdit->setToolTip("Ignore lines with line numbers matching the pattern");
298  auto on_linenumbers_lineedit = [this, lineNumbersRadio, lineNumbersLineEdit]() {
299  if (lineNumbersRadio->isChecked())
300  m_options.m_skip_index_pattern = lineNumbersLineEdit->text().toStdString();
302  };
303  connect(lineNumbersLineEdit, &QLineEdit::editingFinished, on_linenumbers_lineedit);
304 
305  // adding to the layout
306  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
307  layout->addWidget(lineNumbersRadio, row, 1, Qt::AlignLeft);
308  layout->addWidget(lineNumbersLineEdit, row, 2, Qt::AlignLeft);
309 
310  // validator
311  auto validator = new QRegExpValidator(QRegExp("^[0-9,-]*$"), this);
312  lineNumbersLineEdit->setValidator(validator);
313 }
std::string m_skip_index_pattern
pattern denoting line to skip (i.e. '1,10-12,42')

References m_options, gui2::ParserOptions::m_skip_index_pattern, and onParserPropertyChange().

Referenced by createGridLayout().

Here is the call graph for this function:

◆ addIgnoreStringPatternRow()

void gui2::ParserPropertyWidget::addIgnoreStringPatternRow ( QGridLayout *  layout)
private

Adds row to the grid: elements with pattern to ignore lines.

Definition at line 242 of file parserpropertywidget.cpp.

243 {
244  auto startingWithRadio = new QRadioButton;
245  auto startingFromLineEdit = new QLineEdit;
246 
247  // radio settings
248  int row = layout->rowCount();
249  startingWithRadio->setText("Starting with");
250  startingWithRadio->setAutoExclusive(false);
251  startingWithRadio->setChecked(true);
252  startingWithRadio->setToolTip("Ignore lines starting with a given character(s)");
253  auto on_startingfrom_radio = [this, startingFromLineEdit](auto checked) {
255  checked ? startingFromLineEdit->text().toStdString() : std::string();
257  };
258  connect(startingWithRadio, &QRadioButton::clicked, on_startingfrom_radio);
259 
260  // line edit settings
261  startingFromLineEdit->setText("#");
262  startingFromLineEdit->setToolTip("Ignore lines starting with a given character(s)");
263  auto on_startingfrom_lineedit = [this, startingWithRadio, startingFromLineEdit]() {
264  if (startingWithRadio->isChecked())
265  m_options.m_header_prefix = startingFromLineEdit->text().toStdString();
267  };
268  connect(startingFromLineEdit, &QLineEdit::editingFinished, on_startingfrom_lineedit);
269 
270  // adding to layout
271  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
272  layout->addWidget(startingWithRadio, row, 1, Qt::AlignLeft);
273  layout->addWidget(startingFromLineEdit, row, 2, Qt::AlignLeft);
274 }
std::string m_header_prefix
prefix denoting header line

References gui2::ParserOptions::m_header_prefix, m_options, and onParserPropertyChange().

Referenced by createGridLayout().

Here is the call graph for this function:

◆ addImportToBlock()

void gui2::ParserPropertyWidget::addImportToBlock ( QGridLayout *  layout)
private

Adds row to the grid: elements related to the import target.

Definition at line 317 of file parserpropertywidget.cpp.

318 {
319  auto newCanvasRadio = new QRadioButton;
320  auto existingCanvasRadio = new QRadioButton;
321  m_targetCanvasCombo = new QComboBox;
322 
323  // radio settings
324  newCanvasRadio->setText("New canvas");
325  newCanvasRadio->setChecked(true);
326  newCanvasRadio->setToolTip("Data will be imported into the new canvas");
327  auto on_newcanvas_radio = [this](auto checked) {
328  if (checked)
330  };
331  connect(newCanvasRadio, &QRadioButton::clicked, on_newcanvas_radio);
332 
333  existingCanvasRadio->setText("Existing canvas");
334  existingCanvasRadio->setToolTip("Data will be imported into existing canvas");
335  auto on_existingcanvas_radio = [this](auto checked) {
336  if (checked)
337  targetCanvasChanged(m_targetCanvasCombo->currentIndex());
338  };
339  connect(existingCanvasRadio, &QRadioButton::clicked, on_existingcanvas_radio);
340 
341  // combo settings
342  m_targetCanvasCombo->setToolTip("Data will be imported into existing canvas");
343  auto on_canvas_combo = [this, existingCanvasRadio](int index) {
344  if (existingCanvasRadio->isChecked())
345  targetCanvasChanged(index);
346  };
347  connect(m_targetCanvasCombo,
348  static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
349  on_canvas_combo);
350 
351  // adding to the layout
352  int row = layout->rowCount();
353  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
354  layout->addWidget(newCanvasRadio, row, 1, Qt::AlignLeft);
355  row = layout->rowCount();
356  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
357  layout->addWidget(existingCanvasRadio, row, 1, Qt::AlignLeft);
358  layout->addWidget(m_targetCanvasCombo, row, 2, Qt::AlignLeft);
359  auto buttonGroup = new QButtonGroup(this);
360  buttonGroup->addButton(newCanvasRadio);
361  buttonGroup->addButton(existingCanvasRadio);
362 }
int targetCanvasChanged(int canvas_index)

References m_targetCanvasCombo, and targetCanvasChanged().

Referenced by createGridLayout().

◆ addSectionLabel()

void gui2::ParserPropertyWidget::addSectionLabel ( const QString &  text,
QGridLayout *  layout 
)
private

Definition at line 157 of file parserpropertywidget.cpp.

158 {
159  int row = layout->rowCount();
160  layout->addWidget(createSectionWidget(text), row, 0, 1, 3, Qt::AlignLeft);
161 }

Referenced by createGridLayout().

◆ addStandardSeparatorRow()

void gui2::ParserPropertyWidget::addStandardSeparatorRow ( QGridLayout *  layout,
QButtonGroup *  group 
)
private

Adds row to the grid: elements with standard separator settings.

Definition at line 165 of file parserpropertywidget.cpp.

166 {
167  // automatic separator
168  int row = layout->rowCount();
169  auto automaticRadio = new QRadioButton;
170  automaticRadio->setChecked(true);
171  automaticRadio->setText("Automatic");
172  automaticRadio->setToolTip("Try to guess column separator");
173  connect(automaticRadio, &QRadioButton::clicked, [this](auto) {
174  m_options.m_separator.clear();
176  });
177 
178  // space separator
179  auto spaceRadio = new QRadioButton;
180  spaceRadio->setText("Space");
181  spaceRadio->setToolTip("Use empty space as column separator");
182  connect(spaceRadio, &QRadioButton::clicked, [this](auto) {
183  m_options.m_separator = " ";
185  });
186 
187  // comma separator
188  auto commaRadio = new QRadioButton;
189  commaRadio->setText("Comma");
190  commaRadio->setToolTip("Use comma as column separator");
191  connect(commaRadio, &QRadioButton::clicked, [this](auto) {
192  m_options.m_separator = ",";
194  });
195 
196  // adding all to layout
197  layout->addWidget(new QLabel(" "), row, 0, Qt::AlignLeft);
198  layout->addWidget(automaticRadio, row, 1, Qt::AlignLeft);
199  layout->addWidget(spaceRadio, row, 2, Qt::AlignLeft);
200  layout->addWidget(commaRadio, row, 3, Qt::AlignLeft);
201  group->addButton(automaticRadio, AUTOMATIC);
202  group->addButton(spaceRadio, SPACE);
203  group->addButton(commaRadio, COMMA);
204 }

References AUTOMATIC, COMMA, m_options, gui2::ParserOptions::m_separator, onParserPropertyChange(), and SPACE.

Referenced by createGridLayout().

Here is the call graph for this function:

◆ createGridLayout()

QGridLayout * gui2::ParserPropertyWidget::createGridLayout ( )
private

Definition at line 133 of file parserpropertywidget.cpp.

134 {
135  auto grid_layout = new QGridLayout;
136 
137  addSectionLabel("Separator", grid_layout);
138  m_separatorButtonGroup = new QButtonGroup(this);
141 
142  addSectionLabel("Ignore lines", grid_layout);
143  addIgnoreStringPatternRow(grid_layout);
144  addIgnoreNumbersPatternRow(grid_layout);
145 
146  addSectionLabel("Import target", grid_layout);
147  addImportToBlock(grid_layout);
148 
149  // make first colum with invisible label fixed
150  for (int col = 0; col < grid_layout->columnCount(); ++col)
151  grid_layout->setColumnStretch(col, 10);
152  grid_layout->setColumnStretch(0, 0);
153 
154  return grid_layout;
155 }
void addSectionLabel(const QString &text, QGridLayout *layout)
void addIgnoreNumbersPatternRow(QGridLayout *layout)
Adds row to the grid: elements with pattern to ignore line numbers.
void addCustomSeparatorRow(QGridLayout *layout, QButtonGroup *group)
Adds row to the grid: elements with custom separator settings.
void addImportToBlock(QGridLayout *layout)
Adds row to the grid: elements related to the import target.
void addIgnoreStringPatternRow(QGridLayout *layout)
Adds row to the grid: elements with pattern to ignore lines.
void addStandardSeparatorRow(QGridLayout *layout, QButtonGroup *group)
Adds row to the grid: elements with standard separator settings.

References addCustomSeparatorRow(), addIgnoreNumbersPatternRow(), addIgnoreStringPatternRow(), addImportToBlock(), addSectionLabel(), addStandardSeparatorRow(), and m_separatorButtonGroup.

Referenced by ParserPropertyWidget().

Here is the call graph for this function:

◆ createParser()

std::unique_ptr< ParserInterface > gui2::ParserPropertyWidget::createParser ( ) const

Creates parser from parser properties.

Definition at line 79 of file parserpropertywidget.cpp.

80 {
81  ParserOptions options = m_options;
82 
83  // sanity check for empty separator
84  options.m_separator = options.m_separator.empty() ? std::string(" ") : options.m_separator;
85  return std::make_unique<DefaultParser>(options);
86 }

References m_options, and gui2::ParserOptions::m_separator.

Referenced by gui2::LoaderSelectorPanel::createParser().

◆ onParserPropertyChange

void gui2::ParserPropertyWidget::onParserPropertyChange ( )
privateslot

Definition at line 96 of file parserpropertywidget.cpp.

97 {
98  qDebug() << "option"
99  << "header:" << QString::fromStdString(m_options.m_header_prefix)
100  << "separator:" << QString::fromStdString(m_options.m_separator) << "pattern"
101  << QString::fromStdString(m_options.m_skip_index_pattern);
102  emit parserPropertyChanged();
103 }

References gui2::ParserOptions::m_header_prefix, m_options, gui2::ParserOptions::m_separator, gui2::ParserOptions::m_skip_index_pattern, and parserPropertyChanged().

Referenced by addCustomSeparatorRow(), addIgnoreNumbersPatternRow(), addIgnoreStringPatternRow(), and addStandardSeparatorRow().

◆ parserPropertyChanged

void gui2::ParserPropertyWidget::parserPropertyChanged ( )
signal

◆ readSettings()

void gui2::ParserPropertyWidget::readSettings ( )
private

Reads widget settings.

Definition at line 107 of file parserpropertywidget.cpp.

108 {
109  QSettings settings;
110 
111  if (settings.contains(separatorgroupid_setting_name())) {
112  int button_id = settings.value(separatorgroupid_setting_name()).toInt();
113  if (auto button = m_separatorButtonGroup->button(button_id); button) {
114  button->click();
115  }
116  }
117 
118  if (settings.contains(customseparatortext_setting_name()))
119  m_customSeparatorLineEdit->setText(
120  settings.value(customseparatortext_setting_name()).toString());
121 }
std::string toString(PyObject *obj)
Converts PyObject into string, if possible, or throws exception.
Definition: PyUtils.cpp:24

References m_customSeparatorLineEdit, m_separatorButtonGroup, and PyUtils::toString().

Referenced by ParserPropertyWidget().

Here is the call graph for this function:

◆ setTargetCanvas()

void gui2::ParserPropertyWidget::setTargetCanvas ( const QStringList &  canvas_names,
int  current_index 
)

Sets list of canvas names as possible import targets.

Definition at line 90 of file parserpropertywidget.cpp.

91 {
92  m_targetCanvasCombo->insertItems(0, canvas_names);
93  m_targetCanvasCombo->setCurrentIndex(current_index);
94 }

References m_targetCanvasCombo.

Referenced by gui2::LoaderSelectorPanel::setTargetCanvas().

◆ targetCanvasChanged

int gui2::ParserPropertyWidget::targetCanvasChanged ( int  canvas_index)
signal

◆ writeSettings()

void gui2::ParserPropertyWidget::writeSettings ( )
private

Writes widget settings.

Definition at line 125 of file parserpropertywidget.cpp.

126 {
127  QSettings settings;
128 
129  settings.setValue(separatorgroupid_setting_name(), m_separatorButtonGroup->checkedId());
130  settings.setValue(customseparatortext_setting_name(), m_customSeparatorLineEdit->text());
131 }

References m_customSeparatorLineEdit, and m_separatorButtonGroup.

Referenced by ~ParserPropertyWidget().

Member Data Documentation

◆ m_customSeparatorLineEdit

QLineEdit* gui2::ParserPropertyWidget::m_customSeparatorLineEdit {nullptr}
private

Definition at line 70 of file parserpropertywidget.h.

Referenced by addCustomSeparatorRow(), readSettings(), and writeSettings().

◆ m_options

◆ m_separatorButtonGroup

QButtonGroup* gui2::ParserPropertyWidget::m_separatorButtonGroup {nullptr}
private

Definition at line 68 of file parserpropertywidget.h.

Referenced by createGridLayout(), readSettings(), and writeSettings().

◆ m_targetCanvasCombo

QComboBox* gui2::ParserPropertyWidget::m_targetCanvasCombo {nullptr}
private

Definition at line 69 of file parserpropertywidget.h.

Referenced by addImportToBlock(), and setTargetCanvas().


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