Skip to content

Commit

Permalink
Levels constraints should take the filter into account
Browse files Browse the repository at this point in the history
  • Loading branch information
boutinb committed Sep 4, 2024
1 parent d4a1b6b commit e221af9
Show file tree
Hide file tree
Showing 17 changed files with 79 additions and 15 deletions.
17 changes: 15 additions & 2 deletions CommonData/column.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -799,9 +799,10 @@ void Column::labelsTempReset()
_labelsTempRevision = -1;
_labelsTempMaxWidth = 0;
_labelsTempNumerics = 0;
_labelsFilterCountTemp = 0;
}

int Column::labelsTempCount()
int Column::labelsTempCount(bool onlyFiltered)
{
if(_revision != _labelsTempRevision)
{
Expand All @@ -819,6 +820,8 @@ int Column::labelsTempCount()

if(!std::isnan(*_labelsTempDbls.rbegin()))
_labelsTempNumerics++;
if(_labels[r]->filterAllows())
_labelsFilterCountTemp++;
}

doubleset dblset;
Expand All @@ -843,14 +846,16 @@ int Column::labelsTempCount()
_labelsTempToIndex[doubleLabel] = _labelsTemp.size()-1;
_labelsTempMaxWidth = std::max(_labelsTempMaxWidth, qsizetype(_labelsTemp[_labelsTemp.size()-1].size()));
_labelsTempNumerics ++;
_labelsFilterCountTemp ++;

}
}

//Make sure we dont do this too often be remembering at which revision we created the temp values:
_labelsTempRevision = _revision;
}

return _labelsTemp.size();
return onlyFiltered ? _labelsFilterCountTemp : _labelsTemp.size();
}

int Column::labelsTempNumerics()
Expand Down Expand Up @@ -934,6 +939,14 @@ int Column::labelsDoubleValueIsTempLabelRow(double dbl)
return -1;
}

void Column::labelsFilterCountUpdate(bool increase)
{
if(increase)
_labelsFilterCountTemp++;
else if(_labelsFilterCountTemp > 0)
_labelsFilterCountTemp--;
}

void Column::_resetLabelValueMap()
{
_labelByIntsIdMap.clear();
Expand Down
4 changes: 3 additions & 1 deletion CommonData/column.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ class Column : public DataSetBaseNode
strintmap labelsResetValues( int & maxValue);
void labelsRemoveBeyond( size_t indexToStartRemoving);

int labelsTempCount(); ///< Generates the labelsTemp also!
int labelsTempCount(bool onlyFiltered = false); ///< Generates the labelsTemp also!
int labelsTempNumerics(); ///< Also calls labelsTempCount() to be sure it has some info
const stringvec & labelsTemp();
void labelsTempReset();
Expand All @@ -127,6 +127,7 @@ class Column : public DataSetBaseNode
double labelsTempValueDouble( size_t tempLabelIndex);
int labelsDoubleValueIsTempLabelRow(double dbl);
Label * labelDoubleDummy() { return _doubleDummy; }
void labelsFilterCountUpdate(bool increase);

std::set<size_t> labelsMoveRows(std::vector<qsizetype> rows, bool up);
void labelsReverse();
Expand Down Expand Up @@ -252,6 +253,7 @@ class Column : public DataSetBaseNode
_labelsTempNumerics = 0; ///< Use the labelsTemp step to calculate the amount of numeric labels
qsizetype _labelsTempMaxWidth = 0;
stringvec _labelsTemp; ///< Contains displaystring for labels. Used to allow people to edit "double" labels. Initialized when necessary
int _labelsFilterCountTemp;
doublevec _labelsTempDbls;
strintmap _labelsTempToIndex;
bool _invalidated = false,
Expand Down
2 changes: 2 additions & 0 deletions Desktop/data/columnsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ ColumnsModel::ColumnsModel(DataSetTableModel *tableModel)
connect(_tableModel, &DataSetTableModel::columnTypeChanged, this, [&](QString col, int) { emit columnTypeChanged(col); });
connect(_tableModel, &DataSetTableModel::labelChanged, this, [&](QString col, QString orgLabel, QString newLabel) { emit labelsChanged(col, {std::make_pair(orgLabel, newLabel) }); } );
connect(_tableModel, &DataSetTableModel::labelsReordered, this, &ColumnsModel::labelsReordered );
connect(_tableModel, &DataSetTableModel::labelFilterChanged, this, &ColumnsModel::labelFilterChanged );

auto * info = new VariableInfo(_singleton);

Expand All @@ -24,6 +25,7 @@ ColumnsModel::ColumnsModel(DataSetTableModel *tableModel)
connect(this, &ColumnsModel::columnTypeChanged, info, &VariableInfo::columnTypeChanged );
connect(this, &ColumnsModel::labelsChanged, info, &VariableInfo::labelsChanged );
connect(this, &ColumnsModel::labelsReordered, info, &VariableInfo::labelsReordered );
connect(this, &ColumnsModel::labelFilterChanged, info, &VariableInfo::labelFilterChanged );
connect(this, &QTransposeProxyModel::columnsInserted, info, &VariableInfo::rowCountChanged );
connect(this, &QTransposeProxyModel::columnsRemoved, info, &VariableInfo::rowCountChanged );
connect(this, &QTransposeProxyModel::modelReset, info, &VariableInfo::rowCountChanged );
Expand Down
1 change: 1 addition & 0 deletions Desktop/data/columnsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public slots:
void columnTypeChanged( QString colName);
void labelsChanged( QString columnName, QMap<QString, QString> changedLabels);
void labelsReordered( QString columnName);
void labelFilterChanged(QString columnName);

private:
QVariant _getLabels(int colId) const;
Expand Down
16 changes: 11 additions & 5 deletions Desktop/data/datasetpackage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ QVariant DataSetPackage::data(const QModelIndex &index, int role) const
case int(specialRoles::filter): return getRowFilter(index.row());
case int(specialRoles::columnType): return int(column->type());
case int(specialRoles::totalNumericValues): return column->labelsTempNumerics();
case int(specialRoles::totalLevels): return int(column->labelsTemp().size());
case int(specialRoles::totalLevels): return int(column->labelsTempCount(true));
case int(specialRoles::computedColumnType): return int(column->codeType());
case int(specialRoles::columnPkgIndex): return index.column();
case int(specialRoles::lines):
Expand Down Expand Up @@ -718,7 +718,7 @@ bool DataSetPackage::setData(const QModelIndex &index, const QVariant &value, in

if(column->hasFilter())
{
emit labelFilterChanged();
emit labelFilterChanged(tq(column->name()));
emit runFilter();
}
}
Expand Down Expand Up @@ -814,7 +814,7 @@ void DataSetPackage::resetFilterAllows(size_t columnIndex)

_dataSet->column(columnIndex)->resetFilter();

emit labelFilterChanged();
emit labelFilterChanged(tq(_dataSet->column(columnIndex)->name()));

QModelIndex parentModel = indexForSubNode(_dataSet->dataNode());
emit dataChanged(DataSetPackage::index(0, columnIndex, parentModel), DataSetPackage::index(rowCount() - 1, columnIndex, parentModel), {int(specialRoles::filter)} );
Expand Down Expand Up @@ -865,6 +865,7 @@ bool DataSetPackage::setLabelDisplay(const QModelIndex &index, const QString &ne
aChange = true;
}

QString oldLabel = tq(label->label());
if(label->setLabel(newLabel.toStdString()))
{
aChange = true;
Expand All @@ -877,6 +878,9 @@ bool DataSetPackage::setLabelDisplay(const QModelIndex &index, const QString &ne
changedCols = {column->name()};

endSynchingDataChangedColumns(changedCols, false, false);

if(aChange)
emit labelChanged(tq(column->name()), oldLabel, tq(label->label()));

if(setManual)
setManualEdits(true);
Expand Down Expand Up @@ -1011,12 +1015,14 @@ bool DataSetPackage::setLabelAllowFilter(const QModelIndex & index, bool newAllo
int col = column->data()->columnIndex(column);

bool before = column->hasFilter();
labels[row]->setFilterAllows(newAllowValue);

if (labels[row]->setFilterAllows(newAllowValue))
column->labelsFilterCountUpdate(newAllowValue);

if(before != column->hasFilter())
notifyColumnFilterStatusChanged(col); //basically resetModel now

emit labelFilterChanged();
emit labelFilterChanged(tq(column->name()));
QModelIndex columnParentNode = indexForSubNode(column);
emit dataChanged(DataSetPackage::index(row, 0, columnParentNode), DataSetPackage::index(row, columnCount(columnParentNode), columnParentNode), { int(specialRoles::filter) });
emit filteredOutChanged(col);
Expand Down
2 changes: 1 addition & 1 deletion Desktop/data/datasetpackage.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ class DataSetPackage : public QAbstractItemModel //Not QAbstractTableModel becau
void runFilter();
void badDataEntered(const QModelIndex index);
void allFiltersReset();
void labelFilterChanged();
void labelFilterChanged( QString columnName);
void labelChanged( QString columnName, QString originalLabel, QString newLabel);
void columnDataTypeChanged( QString columnName);
void labelsReordered( QString columnName);
Expand Down
1 change: 1 addition & 0 deletions Desktop/data/datasettablemodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ DataSetTableModel::DataSetTableModel(bool showInactive)
connect(DataSetPackage::pkg(), &DataSetPackage::columnDataTypeChanged, this, [&](QString colName) { emit columnTypeChanged(colName, int(DataSetPackage::pkg()->getColumnType(colName))); }, Qt::QueuedConnection);
connect(DataSetPackage::pkg(), &DataSetPackage::labelChanged, this, &DataSetTableModel::labelChanged );
connect(DataSetPackage::pkg(), &DataSetPackage::labelsReordered, this, &DataSetTableModel::labelsReordered );
connect(DataSetPackage::pkg(), &DataSetPackage::labelFilterChanged, this, &DataSetTableModel::labelFilterChanged );
//connect(this, &DataSetTableModel::dataChanged, this, &DataSetTableModel::onDataChanged, Qt::QueuedConnection);

setFilterRole(int(DataSetPackage::specialRoles::filter));
Expand Down
1 change: 1 addition & 0 deletions Desktop/data/datasettablemodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ class DataSetTableModel : public DataSetTableProxy
void columnTypeChanged(QString colName, int colType);
void labelChanged(QString columnName, QString originalLabel, QString newLabel);
void labelsReordered(QString columnName);
void labelFilterChanged(QString columnName);

void renameColumnDialog(int columnIndex);

Expand Down
2 changes: 1 addition & 1 deletion Engine/rbridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,7 @@ std::vector<bool> rbridge_applyFilter(const std::string & filterCode, const std:
jaspRCPP_freeArrayPointer(&arrayPointer);

if(!atLeastOneRow)
throw filterException("Filtered out all data..");
throw filterException("Filtered out all data.");

if(arrayLength != rowCount)
{
Expand Down
2 changes: 2 additions & 0 deletions QMLComponents/controls/sourceitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ void SourceItem::connectModels()
} );
connect(variableInfo, &VariableInfo::labelsChanged, controlModel, &ListModel::sourceLabelsChanged );
connect(variableInfo, &VariableInfo::labelsReordered, controlModel, &ListModel::sourceLabelsReordered );
connect(variableInfo, &VariableInfo::labelFilterChanged, controlModel, &ListModel::sourceLabelFilterChanged );
connect(variableInfo, &VariableInfo::columnsChanged, controlModel, &ListModel::sourceColumnsChanged );
}

Expand All @@ -142,6 +143,7 @@ void SourceItem::connectModels()
connect(_sourceListModel, &ListModel::columnTypeChanged, controlModel, &ListModel::sourceColumnTypeChanged);
connect(_sourceListModel, &ListModel::labelsChanged, controlModel, &ListModel::sourceLabelsChanged );
connect(_sourceListModel, &ListModel::labelsReordered, controlModel, &ListModel::sourceLabelsReordered );
connect(_sourceListModel, &ListModel::labelFilterChanged, controlModel, &ListModel::sourceLabelFilterChanged );
connect(_sourceListModel, &ListModel::columnsChanged, controlModel, &ListModel::sourceColumnsChanged );
}

Expand Down
20 changes: 15 additions & 5 deletions QMLComponents/controls/variableslistbase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,12 @@ void VariablesListBase::setUp()
//We use macros here because the signals come from QML
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(this, &VariablesListBase::allowedColumnsChanged, this, &VariablesListBase::_setAllowedVariables );
connect(_draggableModel, &ListModelDraggable::labelFilterChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::maxLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::minLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::maxNumericLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
connect(this, &VariablesListBase::minNumericLevelsChanged, this, &VariablesListBase::checkLevelsConstraints );
}

void VariablesListBase::_setInitialized(const Json::Value &value)
Expand Down Expand Up @@ -326,11 +331,8 @@ void VariablesListBase::setVariableType(int index, int type)
model()->setVariableType(index, columnType(type));
}

void VariablesListBase::termsChangedHandler()
void VariablesListBase::checkLevelsConstraints()
{
setColumnsTypes(model()->termsTypes());
setColumnsNames(model()->terms().asQList());

bool noScaleAllowed = !_allowedTypesModel->hasType(columnType::scale);

if (_minLevels >= 0 || _maxLevels >= 0 || _minNumericLevels >= 0 || _maxNumericLevels >= 0 || noScaleAllowed)
Expand Down Expand Up @@ -387,6 +389,14 @@ void VariablesListBase::termsChangedHandler()
if (!hasError)
clearControlError();
}
}

void VariablesListBase::termsChangedHandler()
{
setColumnsTypes(model()->termsTypes());
setColumnsNames(model()->terms().asQList());

checkLevelsConstraints();

if (_boundControl) _boundControl->resetBoundValue();
else JASPListControl::termsChangedHandler();
Expand Down
1 change: 1 addition & 0 deletions QMLComponents/controls/variableslistbase.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ protected slots:
void itemDoubleClickedHandler(int index);
void itemsDroppedHandler(QVariant indexes, QVariant vdropList, int dropItemIndex);
void interactionHighOrderHandler(JASPControl* checkBoxControl);
void checkLevelsConstraints();

protected:
GENERIC_SET_FUNCTION(ListViewType, _listViewType, listViewTypeChanged, ListViewType )
Expand Down
9 changes: 9 additions & 0 deletions QMLComponents/models/listmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,15 @@ bool ListModel::sourceLabelsReordered(QString columnName)
return change;
}

bool ListModel::sourceLabelFilterChanged(QString columnName)
{
bool change = terms().contains(columnName);
if (change)
emit labelFilterChanged(columnName);

return change;
}

void ListModel::sourceColumnsChanged(QStringList columns)
{
QStringList changedColumns;
Expand Down
2 changes: 2 additions & 0 deletions QMLComponents/models/listmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ class ListModel : public QAbstractTableModel, public VariableInfoConsumer
void columnTypeChanged(Term term);
void labelsChanged(QString columnName, QMap<QString, QString> = {});
void labelsReordered(QString columnName);
void labelFilterChanged(QString columnName);
void columnsChanged(QStringList columns);
void selectedItemsChanged();
void oneTermChanged(const QString& oldName, const QString& newName);
Expand All @@ -117,6 +118,7 @@ public slots:
virtual int sourceColumnTypeChanged(Term sourceTerm);
virtual bool sourceLabelsChanged(QString columnName, QMap<QString, QString> changedLabels = {});
virtual bool sourceLabelsReordered(QString columnName);
virtual bool sourceLabelFilterChanged(QString columnName);
virtual void sourceColumnsChanged(QStringList columns);

void dataChangedHandler(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>());
Expand Down
12 changes: 12 additions & 0 deletions QMLComponents/models/listmodelavailableinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,16 @@ bool ListModelAvailableInterface::sourceLabelsChanged(QString columnName, QMap<Q
return change;
}

bool ListModelAvailableInterface::sourceLabelFilterChanged(QString columnName)
{
bool change = ListModelDraggable::sourceLabelFilterChanged(columnName);

if (!change && _allTerms.contains(columnName))
emit labelFilterChanged(columnName);

return change;
}

bool ListModelAvailableInterface::sourceLabelsReordered(QString columnName)
{
bool change = ListModelDraggable::sourceLabelsReordered(columnName);
Expand All @@ -179,6 +189,7 @@ bool ListModelAvailableInterface::sourceLabelsReordered(QString columnName)
return change;
}


void ListModelAvailableInterface::removeTermsInAssignedList()
{
if (keepTerms())
Expand Down Expand Up @@ -215,6 +226,7 @@ void ListModelAvailableInterface::addAssignedModel(ListModelAssignedInterface *a
connect(this, &ListModelAvailableInterface::columnTypeChanged, assignedModel, &ListModelAssignedInterface::sourceColumnTypeChanged );
connect(this, &ListModelAvailableInterface::labelsChanged, assignedModel, &ListModelAssignedInterface::sourceLabelsChanged );
connect(this, &ListModelAvailableInterface::labelsReordered, assignedModel, &ListModelAssignedInterface::sourceLabelsReordered );
connect(this, &ListModelAvailableInterface::labelFilterChanged, assignedModel, &ListModelAssignedInterface::sourceLabelFilterChanged );
connect(listView(), &JASPListControl::containsVariablesChanged, assignedModel->listView(), &JASPListControl::setContainsVariables );
connect(listView(), &JASPListControl::containsInteractionsChanged, assignedModel->listView(), &JASPListControl::setContainsInteractions );
}
Expand Down
1 change: 1 addition & 0 deletions QMLComponents/models/listmodelavailableinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public slots:
int sourceColumnTypeChanged(Term name) override;
bool sourceLabelsChanged(QString columnName, QMap<QString, QString> = {}) override;
bool sourceLabelsReordered(QString columnName) override;
bool sourceLabelFilterChanged(QString columnName) override;
void removeAssignedModel(ListModelAssignedInterface *assignedModel);
void clearAssignedModels() { _assignedModels.clear(); }

Expand Down
1 change: 1 addition & 0 deletions QMLComponents/variableinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class VariableInfo : public QObject
void columnTypeChanged(QString colName);
void labelsChanged(QString columnName, QMap<QString, QString> changedLabels);
void labelsReordered(QString columnName);
void labelFilterChanged(QString columnName);
void rowCountChanged();
void dataAvailableChanged();

Expand Down

0 comments on commit e221af9

Please sign in to comment.