Index: general.ui
===================================================================
--- general.ui
+++ general.ui
@@ -193,6 +193,16 @@
+ -
+
+
+ Repeat operation for each result
+
+
+ true
+
+
+
Index: kcalc.kcfg
===================================================================
--- kcalc.kcfg
+++ kcalc.kcfg
@@ -103,6 +103,10 @@
true
+
+
+ false
+
Index: kcalc_core.h
===================================================================
--- kcalc_core.h
+++ 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();
Index: kcalc_core.cpp
===================================================================
--- kcalc_core.cpp
+++ 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 {
@@ -823,7 +825,7 @@
void CalcEngine::enterOperation(const KNumber &number, Operation func)
{
- Node tmp_node;
+ Node tmp_node, repeat_node;
if (func == FUNC_BRACKET) {
tmp_node.number = KNumber::Zero;
@@ -841,6 +843,25 @@
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 {
+ 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 +898,8 @@
void CalcEngine::Reset()
{
percent_mode_ = false;
+ repeat_mode_ = false;
+ last_operation_ = FUNC_EQUAL;
error_ = false;
last_number_ = KNumber::Zero;