File indexing completed on 2024-04-28 11:20:46

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2009 Alexander Rieder <alexanderrieder@gmail.com>
0004 */
0005 
0006 #include "extension.h"
0007 using namespace Cantor;
0008 
0009 #include <QStringList>
0010 
0011 #define EXTENSION_CONSTRUCTORS(name) name::name(QObject* parent) : Extension(QLatin1String(#name),parent) {} \
0012                                      name::~name() {}
0013 
0014 
0015 Extension::Extension(const QString& name, QObject* parent) : QObject(parent)
0016 {
0017     setObjectName(name);
0018 }
0019 
0020 EXTENSION_CONSTRUCTORS(HistoryExtension)
0021 EXTENSION_CONSTRUCTORS(ScriptExtension)
0022 EXTENSION_CONSTRUCTORS(CASExtension)
0023 EXTENSION_CONSTRUCTORS(CalculusExtension)
0024 EXTENSION_CONSTRUCTORS(PlotExtension)
0025 EXTENSION_CONSTRUCTORS(AdvancedPlotExtension)
0026 EXTENSION_CONSTRUCTORS(LinearAlgebraExtension)
0027 EXTENSION_CONSTRUCTORS(VariableManagementExtension)
0028 EXTENSION_CONSTRUCTORS(PackagingExtension)
0029 
0030 //implement this here, as it's ";" most of the time
0031 QString ScriptExtension::commandSeparator()
0032 {
0033     return QStringLiteral(";\n");
0034 }
0035 
0036 //implement this here, as it's "#" most of the time
0037 QString ScriptExtension::commentStartingSequence()
0038 {
0039     return QStringLiteral("#");
0040 }
0041 
0042 //implement this here, as it's "" most of the time
0043 QString ScriptExtension::commentEndingSequence()
0044 {
0045     return QLatin1String("");
0046 }
0047 
0048 
0049 //some convenience functions, but normally backends have a special command to create
0050 //these matrices/vectors.
0051 
0052 QString LinearAlgebraExtension::nullVector(int size, VectorType type)
0053 {
0054     QStringList values;
0055     for (int i=0;i<size;i++)
0056         values<<QStringLiteral("0");
0057     return createVector(values, type);
0058 }
0059 
0060 QString LinearAlgebraExtension::identityMatrix(int size)
0061 {
0062     Matrix m;
0063     for(int i=0;i<size;i++)
0064     {
0065         QStringList column;
0066         for(int j=0;j<size;j++)
0067             column<<((i==j) ? QStringLiteral("1"): QStringLiteral("0"));
0068 
0069         m<<column;
0070     }
0071 
0072     return createMatrix(m);
0073 }
0074 
0075 QString LinearAlgebraExtension::nullMatrix(int rows, int columns)
0076 {
0077     Matrix m;
0078     for(int i=0;i<rows;i++)
0079     {
0080         QStringList column;
0081         for(int j=0;j<columns;j++)
0082             column<<QStringLiteral("0");
0083 
0084         m<<column;
0085     }
0086 
0087     return createMatrix(m);
0088 }
0089 
0090 QString AdvancedPlotExtension::plotFunction2d(const QString& expression, const QVector<PlotDirective*>& directives) const
0091 {
0092     QString params = QLatin1String("");
0093     foreach (PlotDirective* dir, directives)
0094     {
0095         QString param=dispatchDirective(*dir);
0096         if (param.length()>0)
0097             params+=separatorSymbol()+param;
0098     }
0099     return plotCommand() + QLatin1String("(") + expression + params + QLatin1String(")");
0100 }
0101 
0102 QString AdvancedPlotExtension::dispatchDirective(const PlotDirective& directive) const
0103 {
0104     const AcceptorBase* acceptor=dynamic_cast<const AcceptorBase*>(this);
0105     if (acceptor==nullptr)
0106     {
0107         qDebug()<<"Plotting extension does not support any directives, but was asked to process one";
0108         return QLatin1String("");
0109     }
0110     return directive.dispatch(*acceptor);
0111 }
0112 
0113 QString AdvancedPlotExtension::separatorSymbol() const
0114 {
0115     return QStringLiteral(",");
0116 }
0117 
0118 QWidget* AdvancedPlotExtension::PlotDirective::widget(QWidget* parent)
0119 {
0120     return new QWidget(parent);
0121 }
0122 
0123 AdvancedPlotExtension::AcceptorBase::AcceptorBase() : m_widgets()
0124 {
0125 }
0126 
0127 const QVector<AdvancedPlotExtension::AcceptorBase::widgetProc>& AdvancedPlotExtension::AcceptorBase::widgets() const
0128 {
0129     return m_widgets;
0130 }
0131 
0132 AdvancedPlotExtension::DirectiveProducer::DirectiveProducer(QWidget* parent) : QWidget(parent)
0133 {
0134 }