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

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2020 Sirgienko Nikita <warquark@gmail.com>
0004 */
0005 
0006 #ifndef _GRAPHICPACKAGE_H
0007 #define _GRAPHICPACKAGE_H
0008 
0009 #include <QList>
0010 #include <QString>
0011 
0012 #include "cantor_export.h"
0013 
0014 namespace Cantor
0015 {
0016 class GraphicPackagePrivate;
0017 class Session;
0018 class Expression;
0019 
0020 /**
0021  * This class represents of embedded graphic handler for certaion graphical package some of @c Backend
0022  * It provides access to native backend code (octave code for Octave backend, python code for Python backend, etc)
0023  * for few operations, which need for embedded graphics.
0024  *
0025  * @author Nikita Sirgienko
0026  */
0027 
0028 class CANTOR_EXPORT GraphicPackage {
0029 public:
0030     /// @c GraphicPackage can be only copied or load from disk via loadFromFile() function. Direct construction prohibited.
0031     GraphicPackage(const GraphicPackage&);
0032     ~GraphicPackage();
0033 
0034     /// This is id of graphical package. Must be unique, because the id used in search operations
0035     QString id() const;
0036 
0037     /// Name of package, which will be shown to user in some situation. Can be nonunique.
0038     QString name() const;
0039 
0040     /**
0041      * @brief This methor return @c Expression object, which will check requirements of the package.
0042      *
0043      * For example, using "matplotlib" graphic package for Python backend have sense only if Python module "matplotlib" installed.
0044      * So, the expression from @c isAvailable for "matplotlib" graphic package will check, if this module installed
0045      * @return Expression, which will have output @c "1" if requirements are fulfilled and "0" or just an error if they aren't fulfilled
0046      */
0047     Expression* isAvailable(Session*) const;
0048 
0049     /**
0050      * @brief This command should return code, which will enable capturing images.
0051      *
0052      * The command must be revertable, see disableSupportCommand().
0053      * @c additionalInfo This is additional parameter from backend, which go to @c "%1" template. This is optional.
0054      */
0055     QString enableSupportCommand(QString additionalInfo = QString()) const;
0056 
0057     /// This command should return code, which will disable capturing images.
0058     QString disableSupportCommand() const;
0059 
0060     /**
0061      * @brief The method return @c true if plot command empty and @c false otherwise
0062      *
0063      * The packages can have two realization of capturing.
0064      * 1. Need only enable/disable commands. Capturing is realising via plot function changing, etc.
0065      * 2. Need also additional run plot command after each entry with some arguments from @c Cantor::Expression object, see savePlotCommand()
0066      *
0067      * If the package is implemented in the first way, it must have empty plot command template (see savePlotCommand()), then isHavePlotCommand() will return @c true.
0068      * Otherwise, isHavePlotCommand() will return @c false.
0069      */
0070     bool isHavePlotCommand() const;
0071 
0072     /**
0073      * @brief This function return command for saving image result(s) from expression (if results are existed).
0074      * @param filenamePrefix Prefix of files with plots. Can be something like @c "/tmp/cantor_octave_2432_plot". Optional parameter.
0075      * @param plotNumber Currect plot number, should be used for full filename construction. Optional parameter.
0076      * @param additionalInfo This is additional parameter from backend, which go to @c "%3" template. Optional parameter.
0077      * @return Command which will save plot to certain file or empty string (see isHavePlotCommand())
0078      */
0079     QString savePlotCommand(QString filenamePrefix = QString(), int plotNumber = -1, QString additionalInfo = QString()) const;
0080 
0081     /**
0082      * Some graphic package can't capture plots correctly, for example, some packages can't test precense of created plot.
0083      * So, the package handling need some code for testing of plot command precense
0084      * This method return list of some strings, which should be in plot command.
0085      * @return List of strings, which should be in plot command or empty list.
0086      */
0087     const QStringList& plotCommandPrecentsKeywords() const;
0088 
0089     /**
0090      * @brief Load graphic packages from XML file.
0091      *
0092      * The file should have @c "GraphicPackages" root element with one or more @c "GraphicPackage" XML elements.
0093      * @code{.xml}
0094      * <GraphicPackages>
0095      *   <GraphicPackage>
0096      *     ..
0097      *   </GraphicPackage>
0098      *   ...
0099      * </GraphicPackages>
0100      * @endcode
0101      *
0102      * Scheme of the @c GraphicPackage element:
0103      * @code{.xml}
0104      * <GraphicPackage>
0105      *   <Id>...</Id>
0106      *   <Name>...</Name>
0107      *   <TestPresenceCommand>...</TestPresenceCommand>
0108      *   <EnableCommand>...</EnableCommand>
0109      *   <DisableCommand>...</DisableCommand>
0110      *   <ToFileCommandTemplate>...</ToFileCommandTemplate>
0111      * </GraphicPackage>
0112      * @endcode
0113      */
0114     static QList<GraphicPackage> loadFromFile(const QString& filename);
0115 
0116     /**
0117      * Some helper for searching @c package inside @c list of packages.
0118      */
0119     static int findById(const GraphicPackage& package, const QList<GraphicPackage>& list);
0120 
0121 private:
0122     GraphicPackage();
0123 
0124     GraphicPackagePrivate* d;
0125 };
0126 
0127 }
0128 #endif /* _GRAPHICPACKAGE_H */