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