1 /*
2     SPDX-License-Identifier: GPL-2.0-or-later
3     SPDX-FileCopyrightText: 2018 Nikita Sirgienko <warquark@gmail.com>
4 */
5 
6 #include "juliavariablemodel.h"
7 #include "juliaextensions.h"
8 #include "juliasession.h"
9 
10 #include <QDebug>
11 #include <QDBusReply>
12 #include <QDBusInterface>
13 #include <QString>
14 
15 #include "settings.h"
16 
17 using namespace Cantor;
18 
19 const QRegularExpression JuliaVariableModel::typeVariableInfo = QRegularExpression(QLatin1String("\\w+\\["));
20 const QStringList JuliaVariableModel::internalCantorJuliaVariables = {QLatin1String("__cantor_gr_gks_need_restore__")};
21 
JuliaVariableModel(JuliaSession * session)22 JuliaVariableModel::JuliaVariableModel(JuliaSession* session):
23     DefaultVariableModel(session),
24     m_interface(nullptr)
25 {
26 }
27 
setJuliaServer(QDBusInterface * interface)28 void JuliaVariableModel::setJuliaServer(QDBusInterface* interface)
29 {
30     m_interface = interface;
31 }
32 
update()33 void JuliaVariableModel::update()
34 {
35     if (!m_interface)
36         return;
37 
38     m_interface->call(QLatin1String("parseModules"), JuliaSettings::variableManagement());
39 
40     const QStringList& variables =
41         static_cast<QDBusReply<QStringList>>(m_interface->call(QLatin1String("variablesList"))).value();
42 
43     QList<Variable> vars;
44     if (JuliaSettings::variableManagement())
45     {
46         const QStringList& values =
47             static_cast<QDBusReply<QStringList>>(m_interface->call(QLatin1String("variableValuesList"))).value();
48         const QStringList& variablesSizes =
49             static_cast<QDBusReply<QStringList>>(m_interface->call(QLatin1String("variableSizesList"))).value();
50 
51         for (int i = 0; i < variables.size(); i++)
52         {
53             if (i >= values.size())
54             {
55                 qWarning() << "Don't have value for variable from julia server response, something wrong!";
56                 continue;
57             }
58 
59             const QString& name = variables[i];
60             QString value = values[i];
61             size_t size = variablesSizes[i].toULongLong();
62             if (!internalCantorJuliaVariables.contains(name) && value != JuliaVariableManagementExtension::REMOVED_VARIABLE_MARKER)
63             {
64                 // Register variable
65                 // We use replace here, because julia return data type for some variables, and we need
66                 // remove it to make variable view more consistent with the other backends
67                 // More info: https://bugs.kde.org/show_bug.cgi?id=377771
68                 vars << Variable(name, value.replace(typeVariableInfo, QLatin1String("[")), size);
69             }
70         }
71     }
72     else
73     {
74         for (int i = 0; i < variables.size(); i++)
75             vars << Variable(variables[i], QString());
76     }
77     setVariables(vars);
78 
79     const QStringList& newFuncs =
80         static_cast<QDBusReply<QStringList>>(m_interface->call(QLatin1String("functionsList"))).value();
81     setFunctions(newFuncs);
82 }
83