2
import Ubuntu.Components 0.1
3
import "../engine.js" as CALC
7
property string formula_text: '';
8
property string brackets_added: '';
9
property string formula_text_for_engine: '';
10
property var formula: [];
11
property string answer: '';
12
property string angularUnit: 'RAD';
14
function formulaPush(visual, engine, type) {
16
if (formula.length > 0)
17
prev = formula[formula.length-1];
19
var result = CALC.getFormulaTexts(prev, visual, engine, type, brackets_added.length/2)
21
var visual_text = result[0];
22
var engine_text = result[1];
23
var fixed_type = result[2];
24
var brackets_count = result[3];
26
brackets_added = brackets_added.substr(0, brackets_count*2);
28
if (visual_text !== null && engine_text !== null) {
29
formula_text += visual_text;
30
formula_text_for_engine += engine_text;
31
formula.push({'visual': visual_text, 'engine': engine_text, 'type': fixed_type});
36
formulaView.showError();
40
function formulaPop() {
41
if (formula.length > 0) {
42
var prev = formula[formula.length-1];
43
formula_text = formula_text.substring(0, formula_text.length - prev.visual.length);
44
formula_text_for_engine = formula_text_for_engine.substring(0, formula_text_for_engine.length - prev.engine.length);
45
if (prev.type === 'function' || (prev.type === 'group' && prev.engine === '(' || prev.engine === '*('))
46
brackets_added = brackets_added.substring(0, brackets_added.length-2)
47
else if (prev.type === 'group' && prev.engine === ')')
48
brackets_added += " )"
55
function formulaReset() {
57
formula_text_for_engine = '';
63
function calculate() {
65
console.debug('Formula for engine: ' + formula_text_for_engine)
69
result = CALC.parse(angularUnit + formula_text_for_engine + brackets_added);
70
if (result === Number.POSITIVE_INFINITY)
72
else if (result === Number.NEGATIVE_INFINITY)
75
if(exception instanceof CALC.DivisionByZeroError){
76
result = "division by zero error";
77
} else if(exception instanceof SyntaxError){
79
} else if(exception instanceof CALC.ParenthesisError){
80
if(exception.missing === '(')
81
brackets_added = brackets_added.substr(0, brackets_added.length-2);
83
brackets_added+=(' '+exception.missing);
90
function addFromMemory(answerToAdd, formulaData) {
91
if (answerToAdd !== '' && answerToAdd.indexOf('error') === -1 && answerToAdd.indexOf('∞') === -1) {
92
for (var i = 0; i < answerToAdd.length; i++)
93
formulaPush(answerToAdd[i], answerToAdd[i], answerToAdd[i] === '.' ? 'real' : 'number')
96
var fd = JSON.parse(formulaData);
99
if (formula.length > 0)
100
prev = formula[formula.length-1];
102
var result = CALC.getFormulaTexts(prev, fd[0].engine, fd[0].engine, fd[0].type, brackets_added.length/2)
104
if (result[0] !== null && result[1] !== null) {
105
for (var idx = 0; idx < fd.length; idx++) {
106
formula_text += fd[idx].visual;
107
formula_text_for_engine += fd[idx].engine;
108
formula.push({'visual': fd[idx].visual, 'engine': fd[idx].engine, 'type': fd[idx].type});
121
snapMode: ListView.SnapOneItem
124
property string currentFormula: '%1<font color="lightgray">%2</font>'.arg(formula_text).arg(brackets_added)
125
property string currentAnswer: answer
126
property color color: "#FFFFFF";
127
property bool positionedAtEnd: true;
129
function addCurrentToMemory() {
130
if (formula_text !== '') {
131
memory.get(memory.count-1).isLastItem = false
132
memory.get(memory.count-1).formula_data = JSON.stringify(formula)
133
memory.append({'formula': memory.get(memory.count-1).formula, 'answer': memory.get(count-1).answer, 'formula_data': '', 'isLastItem': true})
138
function showError() {
142
PropertyAnimation {id: animateError; target: formulaView; properties: "color"; from: "#FFA0A0"; to: "#FFFFFF"; duration: 100}
145
SequentialAnimation {
146
NumberAnimation {property: "y"; from: formulaView.footerItem.y; to: formulaView.contentY; duration: 200; }
148
NumberAnimation { property: "scale"; from: 0; to: 1.0; duration: 200 }
149
NumberAnimation { property: "y"; from: formulaView.contentY; duration: 0 }
154
onCurrentFormulaChanged: {
155
memory.get(memory.count-1).formula = currentFormula
159
onCurrentAnswerChanged: {
160
memory.get(memory.count-1).answer = currentAnswer
164
positionedAtEnd = formulaView.indexAt(0, contentY+0) == formulaView.model.count-1
173
width: formulaView.width
175
onUseAnswer: addFromMemory(answerToUse, formulaData)
178
footer: KeyboardsView {
179
height: formulaView.height - units.gu(24)
183
flickableItem: formulaView
184
align: Qt.AlignTrailing