diff --git a/src/backends/maxima/maximavariablemodel.h b/src/backends/maxima/maximavariablemodel.h --- a/src/backends/maxima/maximavariablemodel.h +++ b/src/backends/maxima/maximavariablemodel.h @@ -38,10 +38,8 @@ void clear(); - QList variables(); QList functions(); - QStringList variableNames(); QStringList functionNames(bool stripParameters=false); bool isUpdateCommand(const QString &cmd) const; @@ -53,17 +51,13 @@ void parseNewFunctions(Cantor::Expression::Status status); Q_SIGNALS: - void variablesAdded(const QStringList variables); - void variablesRemoved(const QStringList variables); - void functionsAdded(const QStringList variables); void functionsRemoved(const QStringList variables); private: MaximaSession* maximaSession(); private: - QList m_variables; QList m_functions; Cantor::Expression* m_variableExpression; Cantor::Expression* m_functionExpression; diff --git a/src/backends/maxima/maximavariablemodel.cpp b/src/backends/maxima/maximavariablemodel.cpp --- a/src/backends/maxima/maximavariablemodel.cpp +++ b/src/backends/maxima/maximavariablemodel.cpp @@ -39,9 +39,7 @@ void MaximaVariableModel::clear() { emit functionsRemoved(functionNames()); - emit variablesRemoved(variableNames()); m_functions.clear(); - m_variables.clear(); DefaultVariableModel::clearVariables(); } @@ -143,43 +141,10 @@ MaximaExpression* expr=static_cast(sender()); QList newVars=parse(expr); - QStringList addedVars; - QStringList removedVars; - //remove the old variables - for (const Variable& var : m_variables) - { - //check if this var is present in the new variables - bool found=false; - for (const Variable& var2 : newVars) - { - if(var.name==var2.name) - { - found=true; - break; - } - } - - if(!found) - { - removeVariable(var); - removedVars<deleteLater(); - - emit variablesAdded(addedVars); - emit variablesRemoved(removedVars); } void MaximaVariableModel::parseNewFunctions(Cantor::Expression::Status status) @@ -243,25 +208,11 @@ return static_cast (session()); } -QList MaximaVariableModel::variables() -{ - return m_variables; -} - QList MaximaVariableModel::functions() { return m_functions; } -QStringList MaximaVariableModel::variableNames() -{ - QStringList names; - for (const Cantor::DefaultVariableModel::Variable& var : m_variables) - names< variables() const; + + /** + * Returns names of stored variables + */ + QStringList variableNames() const; + public Q_SLOTS: /** * Adds a variable to the model. @@ -113,6 +123,18 @@ */ void clearVariables(); +Q_SIGNALS: + /** + * Emitted after adding new variables + * @param variables list of new variables + */ + void variablesAdded(const QStringList& variables); + + /** + * Emitted after variables removing + * @param variables list of removed variables + */ + void variablesRemoved(const QStringList& variables); protected: QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; @@ -123,6 +145,8 @@ QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex& index) const override; + void setVariables(const QList& newVars); + enum Column { NameColumn = 0, diff --git a/src/lib/defaultvariablemodel.cpp b/src/lib/defaultvariablemodel.cpp --- a/src/lib/defaultvariablemodel.cpp +++ b/src/lib/defaultvariablemodel.cpp @@ -146,10 +146,12 @@ Q_D(DefaultVariableModel); if ( d->variables.contains(variable) ) { + // TODO: Why we remove variable here? removeVariable(variable); } beginInsertRows(QModelIndex(), d->variables.size(), d->variables.size()); d->variables.append(variable); + emit variablesAdded(QStringList(variable.name)); endInsertRows(); } @@ -166,25 +168,104 @@ int row = d->variables.indexOf(variable); if(row==-1) return; + const QString& name = variable.name; beginRemoveRows(QModelIndex(), row, row); d->variables.removeAt(row); endRemoveRows(); + emit variablesRemoved(QStringList(name)); } void DefaultVariableModel::clearVariables() { Q_D(DefaultVariableModel); beginResetModel(); + + QStringList names; + for (const Variable var: d->variables) + names.append(var.name); + d->variables.clear(); endResetModel(); + + emit variablesRemoved(names); +} + +void DefaultVariableModel::setVariables(const QList& newVars) +{ + Q_D(DefaultVariableModel); + + QStringList addedVars; + QStringList removedVars; + + // Handle deleted vars + for (const Variable var : variables()) + { + bool found = false; + for (const Variable& newvar : newVars) + if(var.name == newvar.name) + { + found=true; + break; + } + + if (!found) + removedVars << var.name; + } + + // Handle added vars + const int size = d->variables.size(); + for (const Variable newvar : newVars) + { + bool found = false; + for (int i = 0; i < size; i++) + if(d->variables[i].name == newvar.name) + { + found=true; + break; + } + + if (!found) + { + addedVars << newvar.name; + beginInsertRows(QModelIndex(), d->variables.size(), d->variables.size()); + d->variables.append(newvar); + endInsertRows(); + } + } + + for (const QString& var: removedVars) + { + int row = d->variables.indexOf(Variable{var,QString()}); + beginRemoveRows(QModelIndex(), row, row); + d->variables.removeAt(row); + endRemoveRows(); + } + + emit variablesAdded(addedVars); + emit variablesRemoved(removedVars); } Session* DefaultVariableModel::session() const { Q_D(const DefaultVariableModel); return d->session; } +QList DefaultVariableModel::variables() const +{ + Q_D(const DefaultVariableModel); + return d->variables; +} + +QStringList DefaultVariableModel::variableNames() const +{ + Q_D(const DefaultVariableModel); + QStringList names; + for (const Variable var: d->variables) + names << var.name; + return names; +} + bool operator==(const Cantor::DefaultVariableModel::Variable& one, const Cantor::DefaultVariableModel::Variable& other) { return one.name == other.name;