Bug 454835 - Entering operators repeatedly without a number in between results in history/result mismatch
Summary: Entering operators repeatedly without a number in between results in history/...
Status: RESOLVED FIXED
Alias: None
Product: kcalc
Classification: Applications
Component: general (show other bugs)
Version: 21.12.2
Platform: Fedora RPMs Linux
: NOR normal
Target Milestone: ---
Assignee: Gabriel Barrantes
URL:
Keywords:
: 467967 472597 (view as bug list)
Depends on:
Blocks:
 
Reported: 2022-06-04 13:36 UTC by Furkan
Modified: 2024-01-25 17:28 UTC (History)
6 users (show)

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Furkan 2022-06-04 13:36:58 UTC
SUMMARY
***
NOTE: If you are reporting a crash, please try to attach a backtrace with debug symbols.
See https://community.kde.org/Guidelines_and_HOWTOs/Debugging/How_to_create_useful_crash_reports
***


STEPS TO REPRODUCE
1. Enable 'Show History'
2. Enter a number
3. Press '+' repeatedly
4. Press '='

OBSERVED RESULT
History Panel shows 5+5+5+5=10

EXPECTED RESULT
Either 5+5=10 or 5+5+5+5=20

SOFTWARE/OS VERSIONS
Windows: 
macOS: 
Linux/KDE Plasma:  Fedora 36
(available in About System)
KDE Plasma Version: 5.24.5
KDE Frameworks Version: 5.93.0
Qt Version: 5.15.3
Comment 1 Timothy Pederick 2022-07-13 06:52:11 UTC
Most likely related, entering a square root as an intermediate step produces incorrect history.

Steps to reproduce:
1. Ensure History is open
2. Enter "2 × 2 Shift √ =" using the on-screen buttons (physical keys also work for 2, ×, and =, but I don't know if there are shortcuts for the square root)

Observed result:
History adds these two lines, the first after the square root and the second after the equals. Both lines are mathematically incorrect, and they do not accurately reflect user entry.
> 1.41421356237 = 2.82842712475
> 2 ×  √ 2 = 1.41421356237

Expected result:
History should show correct figures, either one for the whole process such as:
> 2 ×  √ 2 = 2.82842712475

...or two separate ones like so:
> 2 × 1.41421356237 = 2.82842712475
> √ 2 = 1.41421356237
Comment 2 Paul Worrall 2023-04-01 11:39:44 UTC
*** Bug 467967 has been marked as a duplicate of this bug. ***
Comment 3 Paul Worrall 2023-07-25 06:33:10 UTC
*** Bug 472597 has been marked as a duplicate of this bug. ***
Comment 4 Antonio Prcela 2023-08-06 14:13:33 UTC
Can confirm and did the initial history implementation. will take a look after i finish some spectacle stuff
Comment 5 Gabriel Barrantes 2023-11-22 22:30:27 UTC
https://invent.kde.org/utilities/kcalc/-/merge_requests/67
Comment 6 Carl Schwan 2024-01-25 17:28:12 UTC
Git commit c7864e9547b2ef2e9e318a88c78ba51f10fbc5e3 by Carl Schwan, on behalf of Gabriel Barrantes.
Committed on 25/01/2024 at 18:27.
Pushed by carlschwan into branch 'master'.

Add display for user's input

Add display to keep the user's entries visible during the whole calculation process, this allows editing the expression at any point to make any correction the user considers opportune. This display allows coping/pasting an expression to be calculated, that can also be edited as required.

All currently implemented functions are supported and also was added support for 0x, 0b and 0 as prefixes for hex, binary and octal numbers.

Before:![image.png](/uploads/bfd53d4ddb462c995181547c24f3ecbc/image.png){width="225" height="211"}

After:

![image.png](/uploads/0b1e83cff41409c5d925e8014cf6f988/image.png){width="258" height="258"}![image.png](/uploads/e6cb88f4492ca0b98f9ebb08e669bc9f/image.png){width=262 height=262}

New classes added:

* KCalcToken: contains a given valid token such as an operation (+, -, ...), a function (cos, ln, ...), a parenthesis or a number.
* KCalcParser: provides an API to convert a given string (for example "1+cos(4.5)") to a Queue of KCalcToken objects.
* KCalcInputDisplay: this is a customized QLineEdit widget, it holds the user's input.
* KCalcDisplayFrame: holds the input display, result display and some labels.
* CalcEngine_p: encapsulates the functionality that used to be available in CalcEngine class, to be only visible for KCalcToken objects.

Modified classes:

* CalcEngine: added the main algorithm to process the calculation, based on common Operator-precedence parsers.

@teams/qa @teams/vdg @teams/usability
Related: bug 461010, bug 470371, bug 470591, bug 142728, bug 459999, bug 443276, bug 447347

M  +17   -1    CMakeLists.txt
A  +20   -0    autotests/CMakeLists.txt
A  +239  -0    autotests/kcalc_parser_core_test.cpp     [License: GPL(v2.0+)]
M  +352  -363  kcalc.cpp
M  +39   -19   kcalc.h
M  +600  -300  kcalc.ui
M  +1    -19   kcalc_const_menu.cpp
M  +2    -1    kcalc_const_menu.h
M  +411  -828  kcalc_core.cpp
M  +24   -107  kcalc_core.h
A  +713  -0    kcalc_core_p.cpp     [License: GPL(v2.0+)]
A  +92   -0    kcalc_core_p.h     [License: GPL(v2.0+)]
A  +57   -0    kcalc_display_frame.cpp     [License: GPL(v2.0+)]
A  +24   -0    kcalc_display_frame.h     [License: GPL(v2.0+)]
A  +101  -0    kcalc_input_display.cpp     [License: GPL(v2.0+)]
A  +36   -0    kcalc_input_display.h     [License: GPL(v2.0+)]
A  +776  -0    kcalc_parser.cpp     [License: GPL(v2.0+)]
A  +155  -0    kcalc_parser.h     [License: GPL(v2.0+)]
A  +64   -0    kcalc_priority_levels_p.h     [License: GPL(v2.0+)]
A  +412  -0    kcalc_token.cpp     [License: GPL(v2.0+)]
A  +175  -0    kcalc_token.h     [License: GPL(v2.0+)]
M  +3    -72   kcalcdisplay.cpp
M  +0    -1    kcalcdisplay.h
M  +1    -42   kcalchistory.cpp
M  +0    -3    kcalchistory.h
M  +9    -1    knumber/knumber.cpp
M  +2    -0    knumber/knumber.h
M  +4    -4    scienceconstants.xml

https://invent.kde.org/utilities/kcalc/-/commit/c7864e9547b2ef2e9e318a88c78ba51f10fbc5e3