plugin: add qalculator
For launcher >calc instead of qalc proc
This commit is contained in:
parent
bcba9f6d73
commit
050ddf7c3e
5 changed files with 77 additions and 41 deletions
|
|
@ -1,8 +1,8 @@
|
|||
import qs.components
|
||||
import qs.services
|
||||
import qs.config
|
||||
import Caelestia
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
|
||||
|
|
@ -13,7 +13,7 @@ Item {
|
|||
readonly property string math: list.search.text.slice(`${Config.launcher.actionPrefix}calc `.length)
|
||||
|
||||
function onClicked(): void {
|
||||
Quickshell.execDetached(["sh", "-c", `qalc -t -m 100 '${root.math}' | wl-copy`]);
|
||||
Quickshell.execDetached(["wl-copy", Qalculator.eval(math, false)]);
|
||||
root.list.visibilities.launcher = false;
|
||||
}
|
||||
|
||||
|
|
@ -22,13 +22,6 @@ Item {
|
|||
anchors.left: parent?.left
|
||||
anchors.right: parent?.right
|
||||
|
||||
onMathChanged: {
|
||||
if (math) {
|
||||
qalcProc.command = ["qalc", "-m", "100", math];
|
||||
qalcProc.running = true;
|
||||
}
|
||||
}
|
||||
|
||||
StateLayer {
|
||||
radius: Appearance.rounding.full
|
||||
|
||||
|
|
@ -37,22 +30,6 @@ Item {
|
|||
}
|
||||
}
|
||||
|
||||
Binding {
|
||||
id: binding
|
||||
|
||||
when: root.math.length > 0
|
||||
target: metrics
|
||||
property: "text"
|
||||
}
|
||||
|
||||
Process {
|
||||
id: qalcProc
|
||||
|
||||
stdout: StdioCollector {
|
||||
onStreamFinished: binding.value = text.trim()
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
|
@ -71,28 +48,18 @@ Item {
|
|||
id: result
|
||||
|
||||
color: {
|
||||
if (metrics.text.includes("error: "))
|
||||
if (text.includes("error: ") || text.includes("warning: "))
|
||||
return Colours.palette.m3error;
|
||||
if (!root.math)
|
||||
return Colours.palette.m3onSurfaceVariant;
|
||||
return Colours.palette.m3onSurface;
|
||||
}
|
||||
|
||||
text: metrics.elidedText
|
||||
font.pointSize: Appearance.font.size.normal
|
||||
text: root.math.length > 0 ? Qalculator.eval(root.math) : qsTr("Type an expression to calculate")
|
||||
elide: Text.ElideLeft
|
||||
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
|
||||
TextMetrics {
|
||||
id: metrics
|
||||
|
||||
text: qsTr("Type an expression to calculate")
|
||||
font.family: result.font.family
|
||||
font.pointSize: result.font.pointSize
|
||||
elide: Text.ElideRight
|
||||
elideWidth: result.width
|
||||
}
|
||||
}
|
||||
|
||||
StyledRect {
|
||||
|
|
|
|||
|
|
@ -95,8 +95,8 @@
|
|||
fileset = lib.fileset.union ./../CMakeLists.txt ./../plugin;
|
||||
};
|
||||
|
||||
nativeBuildInputs = [cmake ninja];
|
||||
buildInputs = [qt6.qtbase qt6.qtdeclarative];
|
||||
nativeBuildInputs = [cmake ninja pkg-config];
|
||||
buildInputs = [qt6.qtbase qt6.qtdeclarative libqalculate];
|
||||
|
||||
dontWrapQtApps = true;
|
||||
cmakeFlags =
|
||||
|
|
|
|||
|
|
@ -1,3 +1,6 @@
|
|||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(QALCULATE REQUIRED libqalculate)
|
||||
|
||||
qt_add_qml_module(caelestia
|
||||
URI Caelestia
|
||||
VERSION 0.1
|
||||
|
|
@ -5,6 +8,7 @@ qt_add_qml_module(caelestia
|
|||
cutils.hpp cutils.cpp
|
||||
cachingimagemanager.hpp cachingimagemanager.cpp
|
||||
filesystemmodel.hpp filesystemmodel.cpp
|
||||
qalculator.hpp qalculator.cpp
|
||||
)
|
||||
|
||||
qt_query_qml_module(caelestia
|
||||
|
|
@ -24,4 +28,5 @@ install(TARGETS "${module_plugin_target}" LIBRARY DESTINATION "${module_dir}" RU
|
|||
install(FILES "${module_qmldir}" DESTINATION "${module_dir}")
|
||||
install(FILES "${module_typeinfo}" DESTINATION "${module_dir}")
|
||||
|
||||
target_link_libraries(caelestia PRIVATE Qt::Core Qt::Qml Qt::Gui Qt::Concurrent)
|
||||
target_include_directories(caelestia SYSTEM PRIVATE ${QALCULATE_INCLUDE_DIRS})
|
||||
target_link_libraries(caelestia PRIVATE Qt::Core Qt::Qml Qt::Gui Qt::Concurrent ${QALCULATE_LIBRARIES})
|
||||
|
|
|
|||
49
plugin/src/Caelestia/qalculator.cpp
Normal file
49
plugin/src/Caelestia/qalculator.cpp
Normal file
|
|
@ -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);
|
||||
}
|
||||
15
plugin/src/Caelestia/qalculator.hpp
Normal file
15
plugin/src/Caelestia/qalculator.hpp
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
|
||||
#include <QObject>
|
||||
#include <qqmlintegration.h>
|
||||
|
||||
class Qalculator : public QObject {
|
||||
Q_OBJECT
|
||||
QML_ELEMENT
|
||||
QML_SINGLETON
|
||||
|
||||
public:
|
||||
explicit Qalculator(QObject* parent = nullptr);
|
||||
|
||||
Q_INVOKABLE QString eval(const QString& expr, bool printExpr = true) const;
|
||||
};
|
||||
Loading…
Add table
Reference in a new issue