Skip to content

Commit 3db3ded

Browse files
calculator_qalculate
- Add option: Units in global query - Add option: Functions in global query
1 parent 553cdca commit 3db3ded

File tree

6 files changed

+131
-51
lines changed

6 files changed

+131
-51
lines changed

calculator_qalculate/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.16)
22
find_package(Albert REQUIRED)
33

4-
project(calculator_qalculate VERSION 5.3)
4+
project(calculator_qalculate VERSION 6.0)
55

66
find_package(PkgConfig REQUIRED)
77
pkg_check_modules(LIBQALCULATE REQUIRED libqalculate)

calculator_qalculate/i18n/calculator_qalculate.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ The global handler evaluates basic math expressions. Use the trigger handler to
6363
<source>Precision for approximate calculations.</source>
6464
<translation></translation>
6565
</message>
66+
<message>
67+
<source>Functions in global query</source>
68+
<translation></translation>
69+
</message>
70+
<message>
71+
<source>Units in global query</source>
72+
<translation></translation>
73+
</message>
6674
</context>
6775
<context>
6876
<name>Plugin</name>

calculator_qalculate/i18n/calculator_qalculate_de.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ Der globale Handler wertet grundlegende mathematische Ausdrücke aus. Verwenden
6767
<source>Precision for approximate calculations.</source>
6868
<translation>Präzision für ungefähre Berechnungen.</translation>
6969
</message>
70+
<message>
71+
<source>Functions in global query</source>
72+
<translation>Funktionen in globaler Abfrage</translation>
73+
</message>
74+
<message>
75+
<source>Units in global query</source>
76+
<translation>Einheiten in globaler Abfrage</translation>
77+
</message>
7078
</context>
7179
<context>
7280
<name>Plugin</name>

calculator_qalculate/src/configwidget.ui

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,26 @@ The global handler evaluates basic math expressions. Use the trigger handler to
137137
</property>
138138
</widget>
139139
</item>
140+
<item row="3" column="0">
141+
<widget class="QLabel" name="functionsInGlobalQueryLabel">
142+
<property name="text">
143+
<string>Functions in global query</string>
144+
</property>
145+
</widget>
146+
</item>
147+
<item row="3" column="1">
148+
<widget class="QCheckBox" name="functionsInGlobalQueryCheckBox"/>
149+
</item>
150+
<item row="4" column="0">
151+
<widget class="QLabel" name="unitsInGlobalQueryLabel">
152+
<property name="text">
153+
<string>Units in global query</string>
154+
</property>
155+
</widget>
156+
</item>
157+
<item row="4" column="1">
158+
<widget class="QCheckBox" name="unitsInGlobalQueryCheckBox"/>
159+
</item>
140160
</layout>
141161
</item>
142162
<item>

calculator_qalculate/src/plugin.cpp

Lines changed: 87 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ const char* CFG_PARSINGMODE = "parsing_mode";
1919
const uint DEF_PARSINGMODE = (int)PARSING_MODE_CONVENTIONAL;
2020
const char* CFG_PRECISION = "precision";
2121
const uint DEF_PRECISION = 16;
22+
const char* CFG_UNITS = "units_in_global_query";
23+
const bool DEF_UNITS = false;
24+
const char* CFG_FUNCS = "functions_in_global_query";
25+
const bool DEF_FUNCS = false;
26+
2227
}
2328

2429
const QStringList Plugin::icon_urls = {"xdg:calc", ":qalculate"};
@@ -41,10 +46,10 @@ Plugin::Plugin()
4146

4247
// parse options
4348
eo.parse_options.angle_unit = static_cast<AngleUnit>(s->value(CFG_ANGLEUNIT, DEF_ANGLEUNIT).toInt());
44-
eo.parse_options.functions_enabled = false;
49+
eo.parse_options.functions_enabled = s->value(CFG_FUNCS, DEF_FUNCS).toBool();
4550
eo.parse_options.limit_implicit_multiplication = true;
4651
eo.parse_options.parsing_mode = static_cast<ParsingMode>(s->value(CFG_PARSINGMODE, DEF_PARSINGMODE).toInt());
47-
eo.parse_options.units_enabled = false;
52+
eo.parse_options.units_enabled = s->value(CFG_UNITS, DEF_UNITS).toBool();
4853
eo.parse_options.unknowns_enabled = false;
4954

5055
// print options
@@ -101,6 +106,24 @@ QWidget *Plugin::buildConfigWidget()
101106
qalc->setPrecision(value);
102107
});
103108

109+
// Units in global query
110+
ui.unitsInGlobalQueryCheckBox->setChecked(eo.parse_options.units_enabled);
111+
connect(ui.unitsInGlobalQueryCheckBox, &QCheckBox::toggled, this, [this](bool checked)
112+
{
113+
settings()->setValue(CFG_UNITS, checked);
114+
lock_guard locker(qalculate_mutex);
115+
eo.parse_options.units_enabled = checked;
116+
});
117+
118+
// Functions in global query
119+
ui.functionsInGlobalQueryCheckBox->setChecked(eo.parse_options.functions_enabled);
120+
connect(ui.functionsInGlobalQueryCheckBox, &QCheckBox::toggled, this, [this](bool checked)
121+
{
122+
settings()->setValue(CFG_FUNCS, checked);
123+
lock_guard locker(qalculate_mutex);
124+
eo.parse_options.functions_enabled = checked;
125+
});
126+
104127
return widget;
105128
}
106129

@@ -125,38 +148,62 @@ shared_ptr<Item> Plugin::buildItem(const QString &query, const MathStructure &ms
125148
);
126149
}
127150

128-
vector<RankItem> Plugin::handleGlobalQuery(const Query *query)
151+
std::variant<QStringList, MathStructure>
152+
Plugin::runQalculateLocked(const albert::Query *query, const EvaluationOptions &eo_)
129153
{
130-
vector<RankItem> results;
131-
132-
auto trimmed = query->string().trimmed();
133-
if (trimmed.isEmpty())
134-
return results;
135-
136-
lock_guard locker(qalculate_mutex);
137-
138154
auto expression = qalc->unlocalizeExpression(query->string().toStdString(), eo.parse_options);
139155

140156
qalc->startControl();
141157
MathStructure mstruct;
142-
qalc->calculate(&mstruct, expression, 0, eo);
158+
qalc->calculate(&mstruct, expression, 0, eo_);
143159
for (; qalc->busy(); QThread::msleep(10))
144160
if (!query->isValid())
145161
qalc->abort();
146162
qalc->stopControl();
147163

148164
if (!query->isValid())
149-
return results;
165+
return QStringList();
150166

151-
if (qalc->message()){
152-
for (auto msg = qalc->message(); msg; msg = qalc->nextMessage())
153-
DEBG << QString::fromUtf8(qalc->message()->c_message());
154-
return results;
167+
QStringList errors;
168+
for (auto msg = qalc->message(); msg; msg = qalc->nextMessage())
169+
errors << QString::fromUtf8(qalc->message()->c_message());
170+
171+
if (errors.empty())
172+
{
173+
mstruct.format(po);
174+
return mstruct;
155175
}
176+
else
177+
return errors;
178+
}
179+
180+
vector<RankItem> Plugin::handleGlobalQuery(const Query *query)
181+
{
182+
vector<RankItem> results;
156183

157-
mstruct.format(po);
184+
auto trimmed = query->string().trimmed();
185+
if (trimmed.isEmpty())
186+
return results;
158187

159-
results.emplace_back(buildItem(trimmed, mstruct), 1.0f);
188+
lock_guard locker(qalculate_mutex);
189+
190+
auto ret = runQalculateLocked(query, eo);
191+
192+
if (!query->isValid())
193+
return results;
194+
195+
try {
196+
auto mstruct = std::get<MathStructure>(ret);
197+
results.emplace_back(buildItem(trimmed, mstruct), 1.0f);
198+
} catch (const std::bad_variant_access &) {
199+
try {
200+
auto errors = std::get<QStringList>(ret);
201+
for (const auto & e : errors)
202+
DEBG << e;
203+
} catch (const std::bad_variant_access &) {
204+
CRIT << "Unhandled bad_variant_access";
205+
}
206+
}
160207

161208
return results;
162209
}
@@ -167,47 +214,37 @@ void Plugin::handleTriggerQuery(Query *query)
167214
if (trimmed.isEmpty())
168215
return;
169216

170-
lock_guard locker(qalculate_mutex);
171-
172217
auto eo_ = eo;
173218
eo_.parse_options.functions_enabled = true;
174219
eo_.parse_options.units_enabled = true;
175220
eo_.parse_options.unknowns_enabled = true;
176221

177-
auto expression = qalc->unlocalizeExpression(query->string().toStdString(), eo_.parse_options);
222+
lock_guard locker(qalculate_mutex);
178223

179-
qalc->startControl();
180-
MathStructure mstruct;
181-
qalc->calculate(&mstruct, expression, 0, eo_);
182-
for (; qalc->busy(); QThread::msleep(10))
183-
if (!query->isValid())
184-
qalc->abort();
185-
qalc->stopControl();
224+
auto ret = runQalculateLocked(query, eo_);
186225

187226
if (!query->isValid())
188227
return;
189228

190-
QStringList errors;
191-
for (auto msg = qalc->message(); msg; msg = qalc->nextMessage())
192-
errors << QString::fromUtf8(qalc->message()->c_message());
193-
194-
if (errors.empty())
195-
{
196-
mstruct.format(po);
229+
try {
230+
auto mstruct = std::get<MathStructure>(ret);
197231
query->add(buildItem(trimmed, mstruct));
198-
}
199-
else
200-
{
201-
static const auto tr_e = tr("Evaluation error.");
202-
static const auto tr_d = tr("Visit documentation");
203-
query->add(
204-
StandardItem::make(
205-
"qalc-err",
206-
tr_e,
207-
errors.join(" "),
208-
icon_urls,
209-
{{"manual", tr_d, [=](){ openUrl(URL_MANUAL); }}}
210-
)
211-
);
232+
} catch (const std::bad_variant_access &) {
233+
try {
234+
auto errors = std::get<QStringList>(ret);
235+
static const auto tr_e = tr("Evaluation error.");
236+
static const auto tr_d = tr("Visit documentation");
237+
query->add(
238+
StandardItem::make(
239+
"qalc-err",
240+
tr_e,
241+
errors.join(", "),
242+
icon_urls,
243+
{{"manual", tr_d, [=](){ openUrl(URL_MANUAL); }}}
244+
)
245+
);
246+
} catch (const std::bad_variant_access &) {
247+
CRIT << "Unhandled bad_variant_access";
248+
}
212249
}
213250
}

calculator_qalculate/src/plugin.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ class Plugin : public albert::ExtensionPlugin,
1111
public albert::GlobalQueryHandler
1212
{
1313
ALBERT_PLUGIN
14+
1415
public:
16+
1517
Plugin();
1618

1719
QString defaultTrigger() const override;
@@ -21,6 +23,10 @@ class Plugin : public albert::ExtensionPlugin,
2123
QWidget* buildConfigWidget() override;
2224

2325
private:
26+
27+
std::variant<QStringList, MathStructure>
28+
runQalculateLocked(const albert::Query *query, const EvaluationOptions &eo) ;
29+
2430
std::shared_ptr<albert::Item> buildItem(const QString &query, const MathStructure &mstruct) const;
2531

2632
QString iconPath;
@@ -29,4 +35,5 @@ class Plugin : public albert::ExtensionPlugin,
2935
PrintOptions po;
3036
std::mutex qalculate_mutex;
3137
static const QStringList icon_urls;
38+
3239
};

0 commit comments

Comments
 (0)