Skip to content

Commit

Permalink
Add levels property to VariablesList
Browse files Browse the repository at this point in the history
  • Loading branch information
boutinb committed Sep 13, 2024
1 parent 8ac10c9 commit b14de98
Show file tree
Hide file tree
Showing 11 changed files with 42 additions and 70 deletions.
21 changes: 8 additions & 13 deletions CommonData/column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -857,7 +857,7 @@ int Column::labelsTempCount()
return _labelsTemp.size();
}

int Column::nonFilteredTotalNumerics()
int Column::nonFilteredNumericsCount()
{
if (_nonFilteredNumericsCount == -1)
{
Expand All @@ -873,36 +873,31 @@ int Column::nonFilteredTotalNumerics()
return _nonFilteredNumericsCount;
}

int Column::nonFilteredTotalLevels()
stringset Column::nonFilteredLevels()
{
if (_nonFilteredLevelsCount == -1)
if (_nonFilteredLevels.empty())
{
Labelset labels;
doubleset numerics;

for(size_t r=0; r<_data->rowCount(); r++)
if(_data->filter()->filtered()[r])
{
if(_ints[r] != Label::DOUBLE_LABEL_VALUE)
{
Label * label = labelByIntsId(_ints[r]);
if(label && !label->isEmptyValue())
labels.insert(label);
_nonFilteredLevels.insert(label->label());
}
else if(!std::isnan(_dbls[r]))
numerics.insert(_dbls[r]);
_nonFilteredLevels.insert(ColumnUtils::doubleToString(_dbls[r]));
}

_nonFilteredLevelsCount = numerics.size() + labels.size();
}

return _nonFilteredLevelsCount;
return _nonFilteredLevels;
}

void Column::nonFilteredCountersReset()
{
_nonFilteredLevelsCount = -1;
_nonFilteredNumericsCount = -1;
_nonFilteredLevels.clear();
_nonFilteredNumericsCount = -1;
}

int Column::labelsTempNumerics()
Expand Down
8 changes: 4 additions & 4 deletions CommonData/column.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,8 @@ class Column : public DataSetBaseNode
int labelsDoubleValueIsTempLabelRow(double dbl);
Label * labelDoubleDummy() { return _doubleDummy; }

int nonFilteredTotalNumerics();
int nonFilteredTotalLevels();
int nonFilteredNumericsCount();
stringset nonFilteredLevels();
void nonFilteredCountersReset();

std::set<size_t> labelsMoveRows(std::vector<qsizetype> rows, bool up);
Expand Down Expand Up @@ -258,8 +258,8 @@ class Column : public DataSetBaseNode
stringvec _labelsTemp; ///< Contains displaystring for labels. Used to allow people to edit "double" labels. Initialized when necessary
doublevec _labelsTempDbls;
strintmap _labelsTempToIndex;
int _nonFilteredLevelsCount = -1,
_nonFilteredNumericsCount = -1;
stringset _nonFilteredLevels;
int _nonFilteredNumericsCount = -1;
bool _invalidated = false,
_forceTypes = true, ///< If this is a computed column this means whether the source columns used in a computed columns calculation should be forcefully loaded as the desired type or just as their own.
_autoSortByValue;
Expand Down
25 changes: 3 additions & 22 deletions Desktop/data/columnsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@ QVariant ColumnsModel::provideInfo(VariableInfo::InfoType info, const QString& c
switch(info)
{
case VariableInfo::VariableType: return colTypeInt;
case VariableInfo::Labels: return _getLabels(colIndex);
case VariableInfo::DoubleValues: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::valuesDblList));
case VariableInfo::TotalNumericValues: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::totalNumericValues));
case VariableInfo::TotalLevels: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::totalLevels));
case VariableInfo::TotalNumericValues: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::nonFilteredNumericValuesCount));
case VariableInfo::TotalLevels: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::nonFilteredLevels)).toStringList().length();
case VariableInfo::Labels: return QTransposeProxyModel::data(qColIndex, int(DataSetPackage::specialRoles::nonFilteredLevels));
case VariableInfo::NameRole: return data(qColIndex, ColumnsModel::NameRole);
case VariableInfo::DataSetRowCount: return QTransposeProxyModel::columnCount();
case VariableInfo::DataSetValue: return QTransposeProxyModel::data(qValIndex, int(DataSetPackage::specialRoles::value));
Expand Down Expand Up @@ -173,22 +173,3 @@ void ColumnsModel::datasetChanged( QStringList chan
}
}

QVariant ColumnsModel::_getLabels(int colId) const
{
QStringList labels = QTransposeProxyModel::data(index(colId, 0), int(DataSetPackage::specialRoles::labelsStrList)).toStringList();
QStringList unusedLabels = labels;

int count = _tableModel->rowCount();
for (int i = 0; i < count; i++)
{
unusedLabels.removeAll(_tableModel->data(_tableModel->index(i, colId)).toString());
if (unusedLabels.isEmpty())
break;
}

// Warning: the order of the labels must be kept.
for (const QString& unusedLabel : unusedLabels)
labels.removeAll(unusedLabel);

return labels;
}
2 changes: 0 additions & 2 deletions Desktop/data/columnsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ public slots:
void filterChanged();

private:
QVariant _getLabels(int colId) const;

DataSetTableModel * _tableModel = nullptr;
static ColumnsModel * _singleton;
};
Expand Down
18 changes: 4 additions & 14 deletions Desktop/data/datasetpackage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -509,16 +509,15 @@ QVariant DataSetPackage::data(const QModelIndex &index, int role) const
case int(specialRoles::label): return tq(column->getLabel(index.row(), false, true));
case int(specialRoles::description): return tq(column->description());
case int(specialRoles::shadowDisplay): return tq(column->getShadow(index.row()));
case int(specialRoles::labelsStrList): return getColumnLabelsAsStringList(column->name());
case int(specialRoles::valuesDblList): return getColumnValuesAsDoubleList(getColumnIndex(column->name()));
case int(specialRoles::inEasyFilter): return isColumnUsedInEasyFilter(column->name());
case int(specialRoles::value): return tq(column->getValue(index.row()));
case int(specialRoles::name): return tq(column->name());
case int(specialRoles::title): return tq(column->title());
case int(specialRoles::filter): return getRowFilter(index.row());
case int(specialRoles::columnType): return int(column->type());
case int(specialRoles::totalNumericValues): return column->nonFilteredTotalNumerics();
case int(specialRoles::totalLevels): return column->nonFilteredTotalLevels();
case int(specialRoles::nonFilteredNumericValuesCount): return column->nonFilteredNumericsCount();
case int(specialRoles::nonFilteredLevels): return tql(column->nonFilteredLevels());
case int(specialRoles::computedColumnType): return int(column->codeType());
case int(specialRoles::columnPkgIndex): return index.column();
case int(specialRoles::lines):
Expand Down Expand Up @@ -553,9 +552,8 @@ QVariant DataSetPackage::data(const QModelIndex &index, int role) const
case int(specialRoles::filter): return index.row() >= labels.size() || labels[index.row()]->filterAllows();
case int(specialRoles::value): return tq(column->labelsTempValue(index.row()));
case int(specialRoles::description): return index.row() >= labels.size() ? "" : tq(labels[index.row()]->description());
case int(specialRoles::labelsStrList): return getColumnLabelsAsStringList(column->name());
case int(specialRoles::totalNumericValues): return column->labelsTempNumerics();
case int(specialRoles::totalLevels): return int(column->labelsTemp().size());
case int(specialRoles::nonFilteredNumericValuesCount): return column->nonFilteredNumericsCount();
case int(specialRoles::nonFilteredLevels): return tql(column->nonFilteredLevels());
case int(specialRoles::valuesDblList): return getColumnValuesAsDoubleList(getColumnIndex(column->name()));
case int(specialRoles::lines): return getDataSetViewLines(index.row() == 0, index.column() == 0, true, true);
case int(specialRoles::label): [[fallthrough]];
Expand Down Expand Up @@ -1793,14 +1791,6 @@ std::string DataSetPackage::getColumnName(size_t columnIndex) const
return _dataSet && _dataSet->column(columnIndex) ? _dataSet->column(columnIndex)->name() : "";
}

QStringList DataSetPackage::getColumnLabelsAsStringList(const std::string & columnName) const
{
int colIndex = getColumnIndex(columnName);

if(colIndex > -1) return getColumnLabelsAsStringList(colIndex);
else return QStringList();;
}

QStringList DataSetPackage::getColumnLabelsAsStringList(size_t columnIndex) const
{
return tq(getColumnLabelsAsStrVec(columnIndex));
Expand Down
1 change: 0 additions & 1 deletion Desktop/data/datasetpackage.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ class DataSetPackage : public QAbstractItemModel //Not QAbstractTableModel becau
void columnsReverseValues( intset columnIndex);
void columnsSetAutoSortForColumns( std::map<int,bool> columnutoSort);
qsizetype getMaximumColumnWidthInCharacters( int columnIndex) const;
QStringList getColumnLabelsAsStringList( const std::string & columnName) const;
QStringList getColumnLabelsAsStringList( size_t columnIndex) const;
stringvec getColumnLabelsAsStrVec( size_t columnIndex) const;
boolvec getColumnFilterAllows( size_t columnIndex) const;
Expand Down
7 changes: 3 additions & 4 deletions Desktop/data/datasetpackageenums.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

///Special roles for the different submodels of DataSetPackage. If both maxColString and columnWidthFallback are defined by a model DataSetView will only use maxColString. selected is now only used in ColumnModel, but defined here for convenience.
DECLARE_ENUM(
dataPkgRoles,
dataPkgRoles,
filter = Qt::UserRole,
name,
title,
Expand All @@ -24,12 +24,11 @@ DECLARE_ENUM(
maxColumnHeaderString,
columnWidthFallback,
computedColumnType,
totalNumericValues,
totalLevels,
nonFilteredNumericValuesCount,
nonFilteredLevels,
columnIsComputed,
labelsHasFilter,
columnPkgIndex,
labelsStrList,
valuesStrList,
valuesDblList,
inEasyFilter,
Expand Down
7 changes: 7 additions & 0 deletions QMLComponents/controls/variableslistbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ void VariablesListBase::setUp()
QQuickItem::connect(this, SIGNAL(itemDoubleClicked(int)), this, SLOT(itemDoubleClickedHandler(int)));
QQuickItem::connect(this, SIGNAL(itemsDropped(QVariant, QVariant, int)), this, SLOT(itemsDroppedHandler(QVariant, QVariant, int)));
connect(this, &VariablesListBase::allowedColumnsChanged, this, &VariablesListBase::_setAllowedVariables );
connect(_draggableModel, &ListModelDraggable::termsChanged, this, &VariablesListBase::levelsChanged );
connect(_draggableModel, &ListModelDraggable::filterChanged, this, &VariablesListBase::levelsChanged );
connect(_draggableModel, &ListModelDraggable::filterChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::maxLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::minLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
Expand Down Expand Up @@ -296,6 +298,11 @@ columnType VariablesListBase::defaultType() const
return _allowedTypesModel->defaultType();
}

QStringList VariablesListBase::levels() const
{
return initialized() ? model()->allLevels(model()->terms()) : QStringList();
}

void VariablesListBase::setDropKeys(const QStringList &dropKeys)
{
Log::log() << "LOG setDropKeys " << name() << ": " << dropKeys.join('/') << std::endl;
Expand Down
3 changes: 3 additions & 0 deletions QMLComponents/controls/variableslistbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class VariablesListBase : public JASPListControl, public BoundControl
Q_PROPERTY( QStringList columnsTypes READ columnsTypes NOTIFY columnsTypesChanged )
Q_PROPERTY( QStringList columnsNames READ columnsNames NOTIFY columnsNamesChanged )
Q_PROPERTY( QStringList dropKeys READ dropKeys WRITE setDropKeys NOTIFY dropKeysChanged )
Q_PROPERTY( QStringList levels READ levels NOTIFY levelsChanged )
Q_PROPERTY( QString interactionHighOrderCheckBox READ interactionHighOrderCheckBox WRITE setInteractionHighOrderCheckBox NOTIFY interactionHighOrderCheckBoxChanged )
Q_PROPERTY( QAbstractListModel* allowedTypesModel READ allowedTypesModel NOTIFY allowedTypesModelChanged )
Q_PROPERTY( int minNumericLevels READ minNumericLevels WRITE setMinNumericLevels NOTIFY minNumericLevelsChanged )
Expand Down Expand Up @@ -79,6 +80,7 @@ class VariablesListBase : public JASPListControl, public BoundControl
QAbstractListModel * allowedTypesModel();
bool isTypeAllowed(columnType type) const override;
columnType defaultType() const override;
QStringList levels() const;
int minLevels() const { return _minLevels; }
int maxLevels() const { return _maxLevels; }
int minNumericLevels() const { return _minNumericLevels; }
Expand All @@ -95,6 +97,7 @@ class VariablesListBase : public JASPListControl, public BoundControl
void dropKeysChanged();
void interactionHighOrderCheckBoxChanged();
void allowedTypesModelChanged();
void levelsChanged();
void minLevelsChanged();
void maxLevelsChanged();
void minNumericLevelsChanged();
Expand Down
19 changes: 9 additions & 10 deletions QMLComponents/models/listmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -566,17 +566,16 @@ Terms ListModel::filterTerms(const Terms& terms, const QStringList& filters)
}

if (filters.contains("levels"))
{
Terms allLabels;
for (const Term& term : result)
{
Terms labels = requestInfo(VariableInfo::Labels, term.asQString()).toStringList();
if (labels.size() > 0) allLabels.add(labels);
else allLabels.add(term);
}
result = allLevels(result);

result = allLabels;
}
return result;
}

QStringList ListModel::allLevels(const Terms& terms) const
{
QStringList result;
for (const Term& term : terms)
result.append(requestInfo(VariableInfo::Labels, term.asQString()).toStringList());

return result;
}
Expand Down
1 change: 1 addition & 0 deletions QMLComponents/models/listmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class ListModel : public QAbstractTableModel, public VariableInfoConsumer
virtual JASPControl * getRowControl(const QString& key, const QString& name) const;
virtual bool addRowControl(const QString& key, JASPControl* control);
QStringList termsTypes();
QStringList allLevels(const Terms& terms) const;
void setVariableType(int index, columnType type);
columnType getVariableType( const QString& name) const;
columnType getVariableRealType(const QString& name) const;
Expand Down

0 comments on commit b14de98

Please sign in to comment.