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;