11 #include <QListWidgetItem>
12 #include <QMessageBox>
13 #include <QStringList>
57 }
catch (
const std::bad_alloc&) {
61 connect(addSFToolButton, &QAbstractButton::clicked,
this,
63 connect(addAllSFToolButton, &QAbstractButton::clicked,
this,
66 connect(applyAllButton, &QAbstractButton::clicked,
this,
68 connect(cancelButton, &QAbstractButton::clicked,
this, &QDialog::reject);
74 int stdPropsCount = stdPropsText.count();
79 combo->setMaxVisibleItems(stdPropsCount);
85 combo->setMaxVisibleItems(stdPropsCount);
91 int listPropsCount = listPropsText.count();
96 combo->setMaxVisibleItems(listPropsCount);
102 int singlePropsCount = singlePropsText.count();
107 combo->setMaxVisibleItems(singlePropsCount);
115 if (!hasAPreviousContext)
return false;
117 int unassignedProps = 0;
118 int mismatchProps = 0;
123 if (!restored || mismatchProps != 0 ) {
139 context->allProperties.clear();
158 int assignedProps = 0;
163 std::fill(
context->standardCombosProperties.begin(),
164 context->standardCombosProperties.end(), QString());
170 context->standardCombosProperties[i] =
179 std::fill(
context->listCombosProperties.begin(),
180 context->listCombosProperties.end(), QString());
183 context->listCombosProperties[i] =
192 std::fill(
context->singleCombosProperties.begin(),
193 context->singleCombosProperties.end(), QString());
197 context->singleCombosProperties[i] =
205 context->sfCombosProperties.clear();
206 for (
size_t i = 0; i <
m_sfCombos.size(); ++i) {
209 context->sfCombosProperties.push_back(
215 }
catch (
const std::bad_alloc&) {
220 context->ignoredProps =
context->allProperties.size() - assignedProps;
225 int& unassignedProps,
226 int& mismatchProps) {
242 if (!
context->allProperties.contains(
252 if (!
context->allProperties.contains(
262 if (!
context->allProperties.contains(
268 int assignedEntries = 0;
277 if (!
context->standardCombosProperties[i].isNull()) {
280 context->standardCombosProperties[i]);
297 if (!
context->listCombosProperties[i].isNull()) {
300 context->listCombosProperties[i]);
317 if (!
context->singleCombosProperties[i].isNull()) {
320 context->singleCombosProperties[i]);
332 for (
size_t i = 0; i <
context->sfCombosProperties.size(); ++i) {
343 assert(assignedEntries <= totalProps);
344 unassignedProps = totalProps - assignedEntries;
368 if (xComboBox->currentIndex() == 0) ++zeroCoord;
369 if (yComboBox->currentIndex() == 0) ++zeroCoord;
370 if (zComboBox->currentIndex() == 0) ++zeroCoord;
374 QMessageBox::warning(
376 "At least two vertex coordinates (X,Y,Z) must be defined!");
385 assert(n + p + q >= 2);
386 std::vector<int> assignedIndexCount(n + p + q, 0);
391 ++assignedIndexCount[
m_listCombos[j]->currentIndex() > 0
398 for (
size_t l = 0; l <
m_sfCombos.size(); ++l)
399 ++assignedIndexCount[
m_sfCombos[l]->currentIndex()];
401 for (
int i = 1; i < n + p + q; ++i) {
402 if (assignedIndexCount[i] > 1) {
404 QMessageBox::warning(
nullptr,
"Error",
405 QString(
"Can't assign same property to "
406 "multiple fields! (%1)")
407 .arg(xComboBox->itemText(i)));
421 QString itemTitle = QString(
"Scalar #%1").arg(
m_sfCombos.size());
422 QListWidgetItem* sfItem =
new QListWidgetItem(itemTitle);
425 QComboBox* sfCombo =
new QComboBox;
429 sfCombo->setCurrentIndex(selectedIndex);
431 scalarFields->addItem(sfItem);
432 scalarFields->setItemWidget(sfItem, sfCombo);
438 std::vector<bool> notUsed;
444 int index = combo->currentIndex();
446 if (
static_cast<size_t>(index) < notUsed.size()) {
447 notUsed[index] =
false;
458 int index = combo->currentIndex();
460 if (
static_cast<size_t>(index) < notUsed.size()) {
461 notUsed[index] =
false;
469 size_t createdSFCount = 0;
470 for (
size_t i = 0; i < notUsed.size(); ++i) {
477 if (createdSFCount == 0) {
478 QMessageBox::warning(
this,
"Add all SFs",
"No unused property");
static PlyLoadingContext s_lastContext
Last loading context.
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Dialog for configuration of PLY files opening sequence.
void addAllStdPropsAsSF()
bool isValid(bool displayErrors=true) const
Returns whether the current configuration is valid or not.
void addSFComboBox(int selectedIndex=0)
QStringList m_stdPropsText
Standard comboboxes elements.
std::vector< QComboBox * > m_listCombos
List-related comboboxes (faces, etc.)
void setListComboItems(const QStringList &listPropsText)
PlyOpenDlg(QWidget *parent=nullptr)
static void ResetApplyAll()
Resets the "apply all" flag (if set)
void saveContext(PlyLoadingContext *context)
Saves current configuration (for internal use)
void setSingleComboItems(const QStringList &singlePropsText)
bool canBeSkipped() const
Returns whether the dialog can be 'skipped'.
bool restorePreviousContext(bool &hasAPreviousContext)
Restores the previously saved configuration (if any)
void setDefaultComboItems(const QStringList &stdPropsText)
bool restoreContext(PlyLoadingContext *context, int &unassignedProps, int &mismatchProps)
Restore a previously saved configuration (for internal use)
QStringList m_singlePropsText
Single-related comboboxes elements.
std::vector< QComboBox * > m_standardCombos
Standard comboboxes.
std::vector< QComboBox * > m_singleCombos
Single-related comboboxes (texture index, etc.)
std::vector< QComboBox * > m_sfCombos
SF comboboxes.
QStringList m_listPropsText
List-related comboboxes elements.
Ply dialog loading context.
std::vector< QString > standardCombosProperties
std::vector< QString > listCombosProperties
std::vector< QString > singleCombosProperties
QStringList allProperties
std::vector< QString > sfCombosProperties