ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
cvQueryWidgets.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <QComboBox>
11 #include <QDoubleSpinBox>
12 #include <QGridLayout>
13 #include <QHBoxLayout>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QMap>
17 #include <QRegularExpression>
18 #include <QString>
19 #include <QVBoxLayout>
20 #include <QWidget>
21 
34 class cvQueryValueWidget : public QWidget {
35  Q_OBJECT
36 
37 public:
38  enum ValueType {
43  LOCATION_WITH_TOLERANCE, // Must be before LOCATION (ParaView order)
45  };
46 
47  explicit cvQueryValueWidget(QWidget* parent = nullptr);
48  ~cvQueryValueWidget() override = default;
49 
54  void setType(ValueType type);
55 
61  QMap<QString, QString> values() const;
62 
66  void setValues(const QMap<QString, QString>& values);
67 
71  void clear();
72 
73 signals:
74  void valueChanged();
75 
76 private:
77  void rebuildUI();
78 
79  ValueType m_type;
80  QMap<QString, QLineEdit*> m_lineEdits;
81 };
82 
92 class cvQueryConditionWidget : public QWidget {
93  Q_OBJECT
94 
95 public:
96  enum TermType {
97  ARRAY, // Regular array field (ID, NormalX, etc.)
98  POINT_NEAREST_TO, // Point nearest to location
99  CELL_CONTAINING_POINT, // Cell containing a point
100  };
101 
102  explicit cvQueryConditionWidget(QWidget* parent = nullptr);
103  ~cvQueryConditionWidget() override = default;
104 
108  void updateTerms(const QStringList& arrayNames,
109  const QMap<QString, int>& arrayComponents,
110  bool isPointData);
111 
115  QString expression() const;
116 
120  void setExpression(const QString& expr);
121 
125  void clear();
126 
127 signals:
129 
130 private slots:
131  void onTermChanged(int index);
132  void onOperatorChanged(int index);
133 
134 private:
135  void populateOperators(TermType termType);
136  void updateValueWidget();
137 
138  QString currentTerm() const;
139  TermType currentTermType() const;
140  void setCurrentTerm(const QString& term);
141 
142  // Helper to add operator with its metadata
143  void addOperator(const QString& text,
145  const QString& expressionTemplate);
146 
147  // Helper to add term with its metadata
148  void addTerm(const QString& text,
149  TermType type,
150  const QString& internalName);
151 
152  QComboBox* m_termCombo;
153  QComboBox* m_operatorCombo;
154  cvQueryValueWidget* m_valueWidget;
155 
156  // Role constants for combo box item data
157  static constexpr int TermTypeRole = Qt::UserRole;
158  static constexpr int NameRole = Qt::UserRole + 1;
159  static constexpr int ValueTypeRole = Qt::UserRole;
160  static constexpr int ExprTemplateRole = Qt::UserRole + 1;
161  static constexpr int ExprRegExRole = Qt::UserRole + 2;
162 };
163 
167 namespace QueryExpressionUtils {
173 QString formatExpression(const QString& templateStr,
174  const QMap<QString, QString>& values);
175 
179 QRegularExpression createRegex(const QString& templateStr);
180 
186 QStringList splitByAnd(const QString& expression);
187 } // namespace QueryExpressionUtils
char type
#define slots
#define signals
cvQueryConditionWidget - Single query condition widget
void setExpression(const QString &expr)
~cvQueryConditionWidget() override=default
cvQueryConditionWidget(QWidget *parent=nullptr)
QString expression() const
void updateTerms(const QStringList &arrayNames, const QMap< QString, int > &arrayComponents, bool isPointData)
cvQueryValueWidget - Dynamic value input widget
~cvQueryValueWidget() override=default
void setType(ValueType type)
void setValues(const QMap< QString, QString > &values)
QMap< QString, QString > values() const
cvQueryValueWidget(QWidget *parent=nullptr)
Helper functions for expression formatting and parsing.
QStringList splitByAnd(const QString &expression)
QString formatExpression(const QString &templateStr, const QMap< QString, QString > &values)
QRegularExpression createRegex(const QString &templateStr)