summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/qalculator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/qalculator.cpp')
-rw-r--r--plugin/src/Caelestia/qalculator.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/qalculator.cpp b/plugin/src/Caelestia/qalculator.cpp
new file mode 100644
index 0000000..2e18033
--- /dev/null
+++ b/plugin/src/Caelestia/qalculator.cpp
@@ -0,0 +1,49 @@
+#include "qalculator.hpp"
+
+#include <QObject>
+#include <libqalculate/qalculate.h>
+
+Qalculator::Qalculator(QObject* parent)
+ : QObject(parent) {
+ if (!CALCULATOR) {
+ new Calculator();
+ CALCULATOR->loadExchangeRates();
+ CALCULATOR->loadGlobalDefinitions();
+ CALCULATOR->loadLocalDefinitions();
+ }
+}
+
+QString Qalculator::eval(const QString& expr, bool printExpr) const {
+ if (expr.isEmpty()) {
+ return QString();
+ }
+
+ EvaluationOptions eo;
+ PrintOptions po;
+
+ std::string parsed;
+ std::string result = CALCULATOR->calculateAndPrint(
+ CALCULATOR->unlocalizeExpression(expr.toStdString(), eo.parse_options), 100, eo, po, &parsed);
+
+ std::string error;
+ while (CALCULATOR->message()) {
+ if (!CALCULATOR->message()->message().empty()) {
+ if (CALCULATOR->message()->type() == MESSAGE_ERROR) {
+ error += "error: ";
+ } else if (CALCULATOR->message()->type() == MESSAGE_WARNING) {
+ error += "warning: ";
+ }
+ error += CALCULATOR->message()->message();
+ }
+ CALCULATOR->nextMessage();
+ }
+ if (!error.empty()) {
+ return QString::fromStdString(error);
+ }
+
+ if (printExpr) {
+ return QString("%1 = %2").arg(parsed).arg(result);
+ }
+
+ return QString::fromStdString(result);
+}