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)22JuliaVariableModel::JuliaVariableModel(JuliaSession* session): 23 DefaultVariableModel(session), 24 m_interface(nullptr) 25 { 26 } 27 setJuliaServer(QDBusInterface * interface)28void JuliaVariableModel::setJuliaServer(QDBusInterface* interface) 29 { 30 m_interface = interface; 31 } 32 update()33void 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