diff --git a/general.ui b/general.ui
--- a/general.ui
+++ b/general.ui
@@ -193,6 +193,16 @@
+ -
+
+
+ Repeat operation for each result
+
+
+ true
+
+
+
diff --git a/kcalc.kcfg b/kcalc.kcfg
--- a/kcalc.kcfg
+++ b/kcalc.kcfg
@@ -103,6 +103,10 @@
true
+
+
+ false
+
diff --git a/kcalc_core.h b/kcalc_core.h
--- a/kcalc_core.h
+++ b/kcalc_core.h
@@ -138,6 +138,10 @@
KNumber last_number_;
+ Operation last_operation_;
+ KNumber last_repeat_number_;
+ bool repeat_mode_;
+
bool percent_mode_;
bool evalStack();
diff --git a/kcalc_core.cpp b/kcalc_core.cpp
--- a/kcalc_core.cpp
+++ b/kcalc_core.cpp
@@ -25,6 +25,7 @@
*/
#include "kcalc_core.h"
+#include "kcalc_settings.h"
#include
@@ -169,10 +170,11 @@
}
-CalcEngine::CalcEngine() : percent_mode_(false) {
+CalcEngine::CalcEngine() : repeat_mode_(false), percent_mode_(false) {
last_number_ = KNumber::Zero;
error_ = false;
+ last_operation_ = FUNC_EQUAL;
}
KNumber CalcEngine::lastOutput(bool &error) const {
@@ -841,6 +843,26 @@
tmp_node.number = number;
tmp_node.operation = func;
+ if (KCalcSettings::repeatLastOperation()) {
+ if (func != FUNC_EQUAL && func != FUNC_PERCENT) {
+ last_operation_ = tmp_node.operation;
+ repeat_mode_ = false;
+ }
+
+ if (func == FUNC_EQUAL || func == FUNC_PERCENT) {
+ if (!repeat_mode_) {
+ repeat_mode_ = last_operation_ != FUNC_EQUAL;
+ last_repeat_number_ = number;
+ } else {
+ Node repeat_node;
+ repeat_node.operation = last_operation_;
+ repeat_node.number = number;
+ tmp_node.number = last_repeat_number_;
+ stack_.push(repeat_node);
+ }
+ }
+ }
+
stack_.push(tmp_node);
evalStack();
@@ -877,6 +899,8 @@
void CalcEngine::Reset()
{
percent_mode_ = false;
+ repeat_mode_ = false;
+ last_operation_ = FUNC_EQUAL;
error_ = false;
last_number_ = KNumber::Zero;