diff --git a/src/backends/R/rbackend.cpp b/src/backends/R/rbackend.cpp --- a/src/backends/R/rbackend.cpp +++ b/src/backends/R/rbackend.cpp @@ -37,6 +37,7 @@ new RScriptExtension(this); new RPlotExtension(this); + new RVariableManagementExtension(this); } RBackend::~RBackend() @@ -66,7 +67,8 @@ qDebug()<<"Requesting capabilities of RSession"; return Cantor::Backend::InteractiveMode | Cantor::Backend::SyntaxHighlighting | - Cantor::Backend::Completion; + Cantor::Backend::Completion | + Cantor::Backend::VariableManagement; } bool RBackend::requirementsFullfilled() const diff --git a/src/backends/R/rextensions.h b/src/backends/R/rextensions.h --- a/src/backends/R/rextensions.h +++ b/src/backends/R/rextensions.h @@ -51,4 +51,17 @@ QString plotCommand() const override { return QLatin1String("plot"); } }; +class RVariableManagementExtension : public Cantor::VariableManagementExtension +{ + public: + RVariableManagementExtension(QObject* parent); + ~RVariableManagementExtension(); + QString addVariable(const QString& name, const QString& value) Q_DECL_OVERRIDE; + QString setValue(const QString& name, const QString& value) Q_DECL_OVERRIDE; + QString removeVariable(const QString& name) Q_DECL_OVERRIDE; + QString saveVariables(const QString& fileName) Q_DECL_OVERRIDE; + QString loadVariables(const QString& fileName) Q_DECL_OVERRIDE; + QString clearVariables() Q_DECL_OVERRIDE; +}; + #endif /* _REXTENSIONS_H */ diff --git a/src/backends/R/rextensions.cpp b/src/backends/R/rextensions.cpp --- a/src/backends/R/rextensions.cpp +++ b/src/backends/R/rextensions.cpp @@ -65,3 +65,46 @@ { return QLatin1String("xlim=range(")+QString::number(directive.min())+QLatin1String(",")+QString::number(directive.max())+QLatin1String(")"); } + +RVariableManagementExtension::RVariableManagementExtension(QObject* parent) : Cantor::VariableManagementExtension(parent) +{ + +} + + +RVariableManagementExtension::~RVariableManagementExtension() +{ + +} + +QString RVariableManagementExtension::addVariable(const QString& name, const QString& value) + { + return setValue(name, value); + } + +QString RVariableManagementExtension::setValue(const QString& name, const QString& value) + { + return QString::fromLatin1("%1 = %2").arg(name).arg(value); + } + +QString RVariableManagementExtension::removeVariable(const QString& name) + { + return QString::fromLatin1("remove(%1)").arg(name); + } + +QString RVariableManagementExtension::saveVariables(const QString& fileName) + { + Q_UNUSED(fileName); + return QString(); + } + +QString RVariableManagementExtension::loadVariables(const QString& fileName) + { + Q_UNUSED(fileName); + return QString(); + } + +QString RVariableManagementExtension::clearVariables() + { + return QLatin1String("rm(list=ls())"); + } diff --git a/src/backends/R/rserver/org.kde.Cantor.R.xml b/src/backends/R/rserver/org.kde.Cantor.R.xml --- a/src/backends/R/rserver/org.kde.Cantor.R.xml +++ b/src/backends/R/rserver/org.kde.Cantor.R.xml @@ -16,6 +16,7 @@ + diff --git a/src/backends/R/rserver/rserver.h b/src/backends/R/rserver/rserver.h --- a/src/backends/R/rserver/rserver.h +++ b/src/backends/R/rserver/rserver.h @@ -60,7 +60,7 @@ void inputRequested(const QString& prompt); void requestAnswered(); - void symbolList(const QStringList& variables, const QStringList& functions); + void symbolList(const QStringList& variables, const QStringList& values, const QStringList& functions); public Q_SLOTS: void runCommand(const QString& cmd, bool internal=false); diff --git a/src/backends/R/rserver/rserver.cpp b/src/backends/R/rserver/rserver.cpp --- a/src/backends/R/rserver/rserver.cpp +++ b/src/backends/R/rserver/rserver.cpp @@ -426,13 +426,19 @@ { // setStatus(RServer::Busy); - QStringList vars,funcs, namespaces; + QStringList vars, values, funcs; int errorOccurred; // TODO: error checks /* Obtaining a list of user namespace objects */ SEXP usr=PROTECT(R_tryEval(lang1(install("ls")),NULL,&errorOccurred)); for (int i=0;i& v, QVector& f); Q_SIGNALS: @@ -64,6 +69,7 @@ QList m_expressionQueue; /* Available variables and functions, TODO make full classes and type info */ + Cantor::DefaultVariableModel* m_variableModel; QStringList m_variables; QStringList m_functions; }; diff --git a/src/backends/R/rsession.cpp b/src/backends/R/rsession.cpp --- a/src/backends/R/rsession.cpp +++ b/src/backends/R/rsession.cpp @@ -23,6 +23,7 @@ #include "rexpression.h" #include "rcompletionobject.h" #include "rhighlighter.h" +#include #include #include @@ -32,7 +33,7 @@ #include #endif -RSession::RSession(Cantor::Backend* backend) : Session(backend), m_process(nullptr), m_rServer(nullptr) +RSession::RSession(Cantor::Backend* backend) : Session(backend), m_process(nullptr), m_rServer(nullptr), m_variableModel(new Cantor::DefaultVariableModel(this)) { } @@ -59,7 +60,7 @@ m_rServer = new org::kde::Cantor::R(QString::fromLatin1("org.kde.Cantor.R-%1").arg(m_process->pid()), QLatin1String("/"), QDBusConnection::sessionBus(), this); connect(m_rServer, SIGNAL(statusChanged(int)), this, SLOT(serverChangedStatus(int))); - connect(m_rServer,SIGNAL(symbolList(const QStringList&,const QStringList&)),this,SLOT(receiveSymbols(const QStringList&,const QStringList&))); + connect(m_rServer, SIGNAL(symbolList(const QStringList&, const QStringList&, const QStringList&)),this,SLOT(receiveSymbols(const QStringList&, const QStringList&, const QStringList&))); emit loginDone(); qDebug()<<"login done"; @@ -131,10 +132,14 @@ f.append(QRegExp(QLatin1String("\\b")+s+QLatin1String("\\b"))); } -void RSession::receiveSymbols(const QStringList& v, const QStringList & f) +void RSession::receiveSymbols(const QStringList& vars, const QStringList& values, const QStringList & funcs) { - m_variables=v; - m_functions=f; + m_variables = vars; + for (int i = 0; i < vars.count(); i++) + { + m_variableModel->addVariable(vars[i], values[i]); + } + m_functions = funcs; emit symbolsChanged(); } @@ -193,3 +198,8 @@ s+=QLatin1Char('\n'); m_rServer->answerRequest(s); } + +QAbstractItemModel* RSession::variableModel() +{ + return m_variableModel; +} \ No newline at end of file