From e0fd782237ed6409362bf0852ad73592b2510781 Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Wed, 22 Jan 2025 15:29:48 +0100 Subject: [PATCH] cleanin --- CommonData/filter.h | 1 + Desktop/data/datasetpackage.cpp | 19 ------- Desktop/data/datasetpackage.h | 25 +-------- Desktop/data/filtermodel.cpp | 89 +------------------------------- Desktop/data/filtermodel.h | 17 ++---- Desktop/data/models/datasetq.cpp | 25 ++++++++- Desktop/data/models/datasetq.h | 8 ++- Desktop/data/models/filterq.cpp | 60 ++++++++++++++------- Desktop/data/models/filterq.h | 1 + 9 files changed, 79 insertions(+), 166 deletions(-) diff --git a/CommonData/filter.h b/CommonData/filter.h index 705e32a91a..17cf0d5ae3 100644 --- a/CommonData/filter.h +++ b/CommonData/filter.h @@ -83,6 +83,7 @@ class Filter : public DataSetBaseNode std::function _nameChanged; std::function _rFilterChanged; + std::function _filteredChanged; std::function _generatedFilterChanged; std::function _filteredRowCountChanged; std::function _constructorJsonChanged; diff --git a/Desktop/data/datasetpackage.cpp b/Desktop/data/datasetpackage.cpp index 176b554c45..23c15d49a2 100644 --- a/Desktop/data/datasetpackage.cpp +++ b/Desktop/data/datasetpackage.cpp @@ -413,25 +413,6 @@ QVariant DataSetPackage::getColumnTypesWithIcons() const return QVariant(ColumnTypeAndIcons); } -int DataSetPackage::columnsFilteredCount() -{ - if(_dataSet == nullptr) return 0; - - int colsFiltered = 0; - - for(Column * col : _dataSet->columns()) - if(col->hasLabelFilter()) - colsFiltered++; - - return colsFiltered; -} - -void DataSetPackage::resetFilterCounters() -{ - for(Column * col : _dataSet->columns()) - col->nonFilteredCountersReset(); -} - bool DataSetPackage::setColumnType(int columnIndex, columnType newColumnType) { diff --git a/Desktop/data/datasetpackage.h b/Desktop/data/datasetpackage.h index 8ba8bdff7c..5859674f12 100644 --- a/Desktop/data/datasetpackage.h +++ b/Desktop/data/datasetpackage.h @@ -92,28 +92,9 @@ class DataSetPackage : public QObject bool rowCountChanged, bool hasNewColumns, bool informEngines = true); - - QHash roleNames() const override; - int rowCount( const QModelIndex &parent = QModelIndex()) const override; - int columnCount( const QModelIndex &parent = QModelIndex()) const override; - QVariant data( const QModelIndex &index, int role = Qt::DisplayRole) const override; - QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const override; - bool setData( const QModelIndex &index, const QVariant &value, int role) override; - Qt::ItemFlags flags( const QModelIndex &index) const override; - QModelIndex parent( const QModelIndex & index) const override; - QModelIndex index( int row, int column, const QModelIndex & parent = QModelIndex()) const override; - bool insertRows( int row, int count, const QModelIndex & aparent = QModelIndex()) override; - bool insertColumns( int column, int count, const QModelIndex & aparent = QModelIndex()) override; - bool removeRows( int row, int count, const QModelIndex & aparent = QModelIndex()) override; - bool removeColumns( int column, int count, const QModelIndex & aparent = QModelIndex()) override; - QString insertColumnSpecial(int column, const QMap& props); QString appendColumnSpecial( const QMap& props); - QModelIndex indexForSubNode(DataSetBaseNode * node) const; - int filteredRowCount() const { return _dataSet->shownFilter()->filteredRowCount(); } - static QVariant getDataSetViewLines(bool up=false, bool left=false, bool down=true, bool right=true); - int dataRowCount() const; int dataColumnCount() const; @@ -323,8 +304,8 @@ public slots: bool setLabelValue( const QModelIndex & index, const QString & newLabel); QModelIndex lastCurrentCell(); int getColIndex(QVariant colID); - void columnsApply(intset columnIndexes, std::function applyThis); - void columnsApply(intset columnIndexes, std::function applyThis); + void columnsApply(intset columnIndexes, std::function applyThis); + void columnsApply(intset columnIndexes, std::function applyThis); void dbDelete(); private: @@ -358,8 +339,6 @@ public slots: QTimer _databaseIntervalSyncher, _delayedRefreshTimer; - UndoStack * _undoStack = nullptr; - }; #endif // FILEPACKAGE_H diff --git a/Desktop/data/filtermodel.cpp b/Desktop/data/filtermodel.cpp index 9e997b830d..fab5bf955f 100644 --- a/Desktop/data/filtermodel.cpp +++ b/Desktop/data/filtermodel.cpp @@ -21,56 +21,10 @@ QString FilterModel::filterErrorMsg() const { return !filter() ? "" : tq(fi QString FilterModel::generatedFilter() const { return !filter() ? DEFAULT_FILTER_GEN : tq(filter()->generatedFilter()); } QString FilterModel::constructorJson() const { return !filter() ? DEFAULT_FILTER_JSON : tq(filter()->constructorJson()); } -const char * FilterModel::defaultRFilter() -{ - static std::string defaultFilter; - - const std::string forceTranslatedStuffToAlwaysBeAComment = - tr( - "Above you see the code that JASP generates for both value filtering and the drag&drop filter." "\n" - "This default result is stored in 'generatedFilter' and can be replaced or combined with a custom filter." "\n" - "To combine you can append clauses using '&': 'generatedFilter & customFilter & perhapsAnotherFilter'" "\n" - "Click the (i) icon in the lower right corner for further help." "\n").toStdString(); - - defaultFilter = "# " + stringUtils::replaceBy(forceTranslatedStuffToAlwaysBeAComment, "\n", "\n# ") + "\n\ngeneratedFilter"; - - return defaultFilter.c_str(); -} void FilterModel::reset() { - implement me -} - -void FilterModel::dataSetPackageResetDone() -{ - _setGeneratedFilter(tq(_labelFilterGenerator->generateFilter()) ); - setConstructorJson( !DataSetPackage::filter() ? "" : tq(DataSetPackage::filter()->constructorJson()) ); - _setRFilter( !DataSetPackage::filter() ? "" : tq(DataSetPackage::filter()->rFilter()) ); -} - -void FilterModel::modelInit() -{ - if(!DataSetPackage::pkg()->isJaspFile() || DataSetPackage::pkg()->filterShouldRunInit()) //Either this wasn't a JASP file (archive) and we need to run the filter after loading, or it *is* a JASP file but it is old (<0.11) and doesn't have filterVector stored in it yet. - runFilter()(); - - DataSetPackage::pkg()->setFilterShouldRunInit(true); //Make sure next time we come here (because of computed columns or something) we do actually run the filter -} - -void FilterModel::setRFilter(QString newRFilter) -{ - filter()->setRFilter -} - -void FilterModel::setFilterErrorMsg( QString newFilterErrorMsg) -{ - if(newFilterErrorMsg != filterErrorMsg()) - { - if(DataSetPackage::filter()) - DataSetPackage::filter()->setErrorMsg(fq(newFilterErrorMsg)); - - emit filterErrorMsgChanged(); - } + filter()->reset()(); } void FilterModel::applyConstructorJson(QString newConstructorJson) @@ -85,47 +39,6 @@ void FilterModel::applyRFilter(QString newRFilter) _undoStack->pushCommand(new SetRFilterCommand(filter(), newRFilter)); } -void FilterModel::setConstructorJson(QString newconstructorJson) -{ - if(newconstructorJson != constructorJson()) - { - bool oldHasFilter = hasFilter(); - - if(DataSetPackage::filter()) - DataSetPackage::filter()->setConstructorJson(fq(newconstructorJson)); - - if(oldHasFilter != hasFilter()) - emit hasFilterChanged(); - - std::set columnsUsedInConstructedFilter = JsonUtilities::convertDragNDropFilterJSONToSet(constructorJson().toStdString()); - - if(columnsUsedInConstructedFilter != _columnsUsedInConstructedFilter) - emit updateColumnsUsedInConstructedFilter(columnsUsedInConstructedFilter); - - _columnsUsedInConstructedFilter = columnsUsedInConstructedFilter; - - emit constructorJsonChanged(); - } -} - -void FilterModel::setConstructorR(QString newConstructorR) -{ - if(newConstructorR != constructorR()) - { - if(DataSetPackage::filter()) - DataSetPackage::filter()->setConstructorR(fq(newConstructorR)); - - emit constructorRChanged(); - setGeneratedFilter(tq(_labelFilterGenerator->generateFilter())); - } -} -void FilterModel::setGeneratedFilter(QString newGeneratedFilter) -{ - JASPTIMER_SCOPE(FilterModel::setGeneratedFilter); - - runFilter(); -} - void FilterModel::processFilterResult() { diff --git a/Desktop/data/filtermodel.h b/Desktop/data/filtermodel.h index 13c7b346b9..3d181a4394 100644 --- a/Desktop/data/filtermodel.h +++ b/Desktop/data/filtermodel.h @@ -1,8 +1,9 @@ #ifndef FILTERMODEL_H #define FILTERMODEL_H +#include #include -#include "utilities/qutils.h" +#include class FilterQ; class UndoStack; @@ -39,14 +40,10 @@ public slots: void applyConstructorJson( QString constructorJson); void applyRFilter( QString rFilter); - void processFilterResult(int requestId); - void processFilterErrorMsg(QString filterErrorMsg, int requestId); - void rescanRFilterForColumns(); + void processFilterDone(); void computeColumnSucceeded(QString columnName, QString warning, bool dataChanged); - void dataSetPackageResetDone(); - signals: void rFilterChanged(); void hasFilterChanged(); @@ -56,14 +53,6 @@ public slots: void generatedFilterChanged(); void constructorJsonChanged(); - void updateColumnsUsedInConstructedFilter(std::set columnNames); - void resetRFilter(); - void refreshAllAnalyses(); - void filterUpdated(); - int sendFilter(QString generatedFilter, QString rFilter); - -private: - UndoStack* _undoStack = nullptr; }; #endif // FILTERMODEL_H diff --git a/Desktop/data/models/datasetq.cpp b/Desktop/data/models/datasetq.cpp index 7a41c46cc5..4b9805dc12 100644 --- a/Desktop/data/models/datasetq.cpp +++ b/Desktop/data/models/datasetq.cpp @@ -597,6 +597,8 @@ void DataSetQ::resetAllFilters() for(Column * col : columns()) col->resetFilter(); + resetFilterCounters(); + emit allFiltersReset(); emit columnsFilteredCountChanged(); //this is only used in conjunction with a reset so dont do: emit headerDataChanged(Qt::Horizontal, 0, columnCount()); @@ -605,15 +607,34 @@ void DataSetQ::resetAllFilters() void DataSetQ::resetFilterAllows(size_t columnIndex) { column(columnIndex)->resetFilter(); + resetFilterCounters(); emit labelFilterChanged(); QModelIndex parentModel = indexForSubNode(_dataSet->dataNode()); - emit dataChanged(DataSetPackage::index(0, columnIndex, parentModel), DataSetPackage::index(rowCount() - 1, columnIndex, parentModel), {int(specialRoles::filter)} ); + emit dataChanged(DataSetPackage::index(0, columnIndex, parentModel), DataSetPackage::index(rowCount() - 1, columnIndex, parentModel), {int(dataPkgRoles::filter)} ); parentModel = indexForSubNode(_dataSet->column(columnIndex)); - emit dataChanged(DataSetPackage::index(0, 0, parentModel), DataSetPackage::index(rowCount(parentModel) - 1, columnCount(parentModel) - 1, parentModel), {int(specialRoles::filter)} ); + emit dataChanged(DataSetPackage::index(0, 0, parentModel), DataSetPackage::index(rowCount(parentModel) - 1, columnCount(parentModel) - 1, parentModel), {int(dataPkgRoles::filter)} ); emit filteredOutChanged(columnIndex); } + + +int DataSetQ::columnsFilteredCount() const +{ + int colsFiltered = 0; + + for(Column * col : columns()) + if(col->hasLabelFilter()) + colsFiltered++; + + return colsFiltered; +} + +void DataSetQ::resetFilterCounters() +{ + for(Column * col : columns()) + col->nonFilteredCountersReset(); +} diff --git a/Desktop/data/models/datasetq.h b/Desktop/data/models/datasetq.h index dcf8cd244f..7b55930f18 100644 --- a/Desktop/data/models/datasetq.h +++ b/Desktop/data/models/datasetq.h @@ -39,7 +39,8 @@ friend ColumnQ; bool removeColumns( int column, int count, const QModelIndex & aparent = QModelIndex()) override; static bool dataMode(); - std::vector & columnsQ(); + std::vector & columnsQ() const; + std::string freeNewColumnName(size_t startHere) const; bool isColumnNameFree(const std::string & name) const; @@ -62,6 +63,9 @@ friend ColumnQ; bool dataFileCanHaveLabels() const; void resetAllFilters(); + int columnsFilteredCount() const; + void resetFilterCounters(); + signals: //These should all still be connected to DataSetPackage or such void manualEditMade(); void datasetChanged( QStringList changedColumns, @@ -86,6 +90,8 @@ friend ColumnQ; void columnsFilteredCountChanged(); void rowCountChanged(); + void refreshAllAnalyses(); + public slots: void refresh() { beginResetModel(); endResetModel(); } void handleColumnChanged( ColumnQ * column); diff --git a/Desktop/data/models/filterq.cpp b/Desktop/data/models/filterq.cpp index 95eea857ce..0c1132a801 100644 --- a/Desktop/data/models/filterq.cpp +++ b/Desktop/data/models/filterq.cpp @@ -1,5 +1,8 @@ #include "filterq.h" +#include "columnq.h" #include "datasetq.h" +#include "jsonutilities.h" +#include "columnencoder.h" #include "utilities/qutils.h" #include "labelfiltergenerator.h" @@ -7,10 +10,12 @@ FilterQ::FilterQ(DataSetQ * data) : Filter(data), _labelGen(new LabelFilterGenerator(this)) { - connect(data, &DataSetQ::labelFilterChanged, _labelGen, &LabelFilterGenerator::regenerateGeneratedFilter); - connect(this, &FilterQ::constructorRChanged, _labelGen, &LabelFilterGenerator::regenerateGeneratedFilter); - connect(this, &FilterQ::filteredRowCountChanged, this, &FilterQ::updateStatusBar ); - connect(data, &DataSetQ::datasetChanged, this, &FilterQ::datasetChanged ); + connect(data, &DataSetQ::labelFilterChanged, _labelGen, &LabelFilterGenerator::regenerateGeneratedFilter ); + connect(data, &DataSetQ::datasetChanged, this, &FilterQ::datasetChanged ); + connect(this, &FilterQ::constructorRChanged, _labelGen, &LabelFilterGenerator::regenerateGeneratedFilter ); + connect(this, &FilterQ::filteredRowCountChanged, this, &FilterQ::updateStatusBar ); + connect(this, &FilterQ::filteredChanged, data, &DataSetQ::refreshAllAnalyses ); + } FilterQ::FilterQ(DataSetQ * data, const std::string & name, bool createIfMissing) @@ -24,6 +29,23 @@ DataSetQ * FilterQ::dataQ() const return static_cast(data()); } + +const char * FilterQ::defaultRFilter() +{ + static std::string defaultFilter; + + const std::string forceTranslatedStuffToAlwaysBeAComment = + tr( + "Above you see the code that JASP generates for both value filtering and the drag&drop filter." "\n" + "This default result is stored in 'generatedFilter' and can be replaced or combined with a custom filter." "\n" + "To combine you can append clauses using '&': 'generatedFilter & customFilter & perhapsAnotherFilter'" "\n" + "Click the (i) icon in the lower right corner for further help." "\n").toStdString(); + + defaultFilter = "# " + stringUtils::replaceBy(forceTranslatedStuffToAlwaysBeAComment, "\n", "\n# ") + "\n\ngeneratedFilter"; + + return defaultFilter.c_str(); +} + QString FilterQ::nameQ() const { return tq(Filter::name()); } QString FilterQ::rFilterQ() const { return tq(Filter::rFilter()); } QString FilterQ::constructorRQ() const { return tq(Filter::constructorR()); } @@ -71,6 +93,7 @@ void FilterQ::bindStdFunctionsToSignals() { _nameChanged = [this](){ emit nameChanged(); }; _rFilterChanged = [this](){ emit rFilterChanged(); }; + _filteredChanged = [this](){ emit filteredChanged(); }; _generatedFilterChanged = [this](){ emit generatedFilterChanged(); }; _filteredRowCountChanged = [this](){ emit filteredRowCountChanged(); }; _constructorJsonChanged = [this](){ emit constructorJsonChanged(); }; @@ -97,39 +120,36 @@ void FilterQ::datasetChanged( QStringList changedColumns, break; } - auto iUseOneOfTheseColumns = [&](std::vector cols) -> bool + auto iUseOneOfTheseColumns = [&](QStringList cols) -> bool { - for(const std::string & col : cols) - if(columnUsed(tq(col))) + for(const QString & col : cols) + if(columnUsed(col)) return true; return false; }; - if(iUseOneOfTheseColumns(fq(changeNameColumns.keys()))) + if(iUseOneOfTheseColumns(changeNameColumns.keys())) { strstrmap stdChangeNameCols(fq(changeNameColumns)); invalidateMe = true; - setRFilter( tq(ColumnEncoder::replaceColumnNamesInRScript(fq(rFilter()), stdChangeNameCols))); - setConstructorJson( tq(JsonUtilities::replaceColumnNamesInDragNDropFilterJSONStr(fq(constructorJson()), stdChangeNameCols))); + setRFilter( tq(ColumnEncoder::replaceColumnNamesInRScript(rFilter(), stdChangeNameCols))); + setConstructorJson( tq(JsonUtilities::replaceColumnNamesInDragNDropFilterJSONStr(constructorJson(), stdChangeNameCols))); } - auto missingStd = fq(missingColumns); - if(iUseOneOfTheseColumns(missingStd)) + if(iUseOneOfTheseColumns(missingColumns)) { - setRFilter(tq(ColumnEncoder::removeColumnNamesFromRScript(fq(rFilter()), missingStd))); - - setConstructorJson( tq(JsonUtilities::removeColumnsFromDragNDropFilterJSONStr( fq(constructorJson()), missingStd))); + Filter::setRFilter(ColumnEncoder::removeColumnNamesFromRScript(rFilter(), missingStd)); + Filter::setConstructorJson(JsonUtilities::removeColumnsFromDragNDropFilterJSONStr( constructorJson(), missingStd)); invalidateMe = false; //Actually, if stuff is removed from the filter it won't work will it now? - //Just reset the filter result to everything true while the user gets the change to fix their now broken filter - if(DataSetPackage::filter()) - DataSetPackage::filter()->reset(); + //Just reset the filter result to everything true whiol->hasLabelFille the user gets the change to fix their now broken filter + reset(); emit refreshAllAnalyses(); - emit filterUpdated(); + updateStatusBar(); //The following errormsg is overwritten immediately but that is because constructorJson changed triggers qml which triggers (some vents later) a send event. So yeah... @@ -141,3 +161,5 @@ void FilterQ::datasetChanged( QStringList changedColumns, runFilter(); } + + diff --git a/Desktop/data/models/filterq.h b/Desktop/data/models/filterq.h index 4a4104bc0f..9410ef28bd 100644 --- a/Desktop/data/models/filterq.h +++ b/Desktop/data/models/filterq.h @@ -56,6 +56,7 @@ class FilterQ : public Filter, public QObject signals: void nameChanged(); void rFilterChanged(); + void filteredChanged(); void updateStatusBar(); void hasFilterChanged(); void invalidatedChanged();