Skip to content

Commit 22b2475

Browse files
committed
First Commit
0 parents  commit 22b2475

10 files changed

+1923
-0
lines changed

.gitignore

Lines changed: 477 additions & 0 deletions
Large diffs are not rendered by default.

CalculatorModel.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
2+
const DEFAULT_START_VALUE = 0;
3+
class CalculatorModel
4+
{
5+
static Numbers = [];
6+
static Operators = [];
7+
static MostRecentNumber = DEFAULT_START_VALUE;
8+
static MostRecentOperator = "";
9+
static MostRecentResult = DEFAULT_START_VALUE;
10+
11+
static CalculateResult()
12+
{
13+
return this.Calculate(this.Numbers, this.Operators);
14+
}
15+
16+
static Calculate(numbers, operators)
17+
{
18+
var tempNumbers = numbers.slice();
19+
var currentValue = tempNumbers[0];
20+
var currentOperator = "";
21+
tempNumbers.shift();
22+
for(var i = 0; i < operators.length && tempNumbers.length > 0; i++)
23+
{
24+
currentOperator = operators[i];
25+
switch(ElementEvaluator.EvaluateValue(currentOperator))
26+
{
27+
case ElementEnum.PLUS:
28+
currentValue += tempNumbers[0];
29+
break;
30+
case ElementEnum.MINUS:
31+
currentValue -= tempNumbers[0];
32+
break;
33+
case ElementEnum.MULTIPLICATION:
34+
currentValue *= tempNumbers[0];
35+
break;
36+
case ElementEnum.DIVISION:
37+
currentValue /= tempNumbers[0];
38+
break;
39+
default:
40+
currentValue = DEFAULT_START_VALUE;
41+
break;
42+
}
43+
tempNumbers.shift();
44+
}
45+
return currentValue;
46+
}
47+
48+
static AddOperatorToCalculation(tempOperator)
49+
{
50+
this.Operators.push(tempOperator);
51+
this.MostRecentOperator = tempOperator;
52+
}
53+
54+
static AddNumberToCalculation(number)
55+
{
56+
this.Numbers.push(number);
57+
this.MostRecentNumber = number;
58+
}
59+
60+
static GetResult()
61+
{
62+
var result = 0;
63+
if (this.Numbers.length > this.Operators.length && this.Numbers.length > 1 && this.Operators.length > 0)
64+
result = this.CalculateResult();
65+
else
66+
result = DEFAULT_START_VALUE;
67+
this.MostRecentResult = result;
68+
return result;
69+
}
70+
71+
static Clear()
72+
{
73+
this.Numbers = [];
74+
this.Operators = [];
75+
}
76+
77+
static GetAmountOfNumbers()
78+
{
79+
return this.Numbers.length;
80+
}
81+
82+
static GetAmountOfOperators()
83+
{
84+
return this.Operators.length;
85+
}
86+
}

Element.js

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
2+
const ZERO_VALUE = "0";
3+
const ONE_VALUE = "1";
4+
const TWO_VALUE = "2";
5+
const THREE_VALUE = "3";
6+
const FOUR_VALUE = "4";
7+
const FIVE_VALUE = "5";
8+
const SIX_VALUE = "6";
9+
const SEVEN_VALUE = "7";
10+
const EIGHT_VALUE = "8";
11+
const NINE_VALUE = "9";
12+
const DECIMAL_VALUE = ".";
13+
const SIGN_CHANGE_VALUE = "+/-";
14+
const PLUS_VALUE = "+";
15+
const MINUS_VALUE = "-";
16+
const MULTIPLICATION_VALUE = "*";
17+
const DIVISION_VALUE = "/";
18+
const DEFAULT_VALUE = "";
19+
20+
const ElementEnum =
21+
{
22+
NONE: 0,
23+
ZERO: 1,
24+
ONE: 2,
25+
TWO: 3,
26+
THREE: 4,
27+
FOUR: 5,
28+
FIVE: 6,
29+
SIX: 7,
30+
SEVEN: 8,
31+
EIGHT: 9,
32+
NINE: 10,
33+
SIGN_CHANGE: 11,
34+
DECIMAL: 12,
35+
PLUS: 13,
36+
MINUS: 14,
37+
MULTIPLICATION: 15,
38+
DIVISION: 16
39+
}
40+
41+
Object.freeze(ElementEnum);
42+
43+
class ElementEvaluator
44+
{
45+
46+
static EvaluateElement(element)
47+
{
48+
switch(element)
49+
{
50+
case ElementEnum.ZERO:
51+
return ZERO_VALUE;
52+
case ElementEnum.ONE:
53+
return ONE_VALUE;
54+
case ElementEnum.TWO:
55+
return TWO_VALUE;
56+
case ElementEnum.THREE:
57+
return THREE_VALUE;
58+
case ElementEnum.FOUR:
59+
return FOUR_VALUE;
60+
case ElementEnum.FIVE:
61+
return FIVE_VALUE;
62+
case ElementEnum.SIX:
63+
return SIX_VALUE;
64+
case ElementEnum.SEVEN:
65+
return SEVEN_VALUE;
66+
case ElementEnum.EIGHT:
67+
return EIGHT_VALUE;
68+
case ElementEnum.NINE:
69+
return NINE_VALUE;
70+
case ElementEnum.DECIMAL:
71+
return DECIMAL_VALUE;
72+
case ElementEnum.SIGN_CHANGE:
73+
return SIGN_CHANGE_VALUE;
74+
case ElementEnum.PLUS:
75+
return PLUS_VALUE;
76+
case ElementEnum.MINUS:
77+
return MINUS_VALUE;
78+
case ElementEnum.MULTIPLICATION:
79+
return MULTIPLICATION_VALUE;
80+
case ElementEnum.DIVISION:
81+
return DIVISION_VALUE;
82+
case ElementEnum.NONE:
83+
return DEFAULT_VALUE;
84+
default:
85+
return DEFAULT_VALUE;
86+
}
87+
}
88+
89+
static EvaluateValue(value)
90+
{
91+
switch (value)
92+
{
93+
case ZERO_VALUE:
94+
return ElementEnum.ZERO;
95+
case ONE_VALUE:
96+
return ElementEnum.ONE;
97+
case TWO_VALUE:
98+
return ElementEnum.TWO;
99+
case THREE_VALUE:
100+
return ElementEnum.THREE;
101+
case FOUR_VALUE:
102+
return ElementEnum.FOUR;
103+
case FIVE_VALUE:
104+
return ElementEnum.FIVE;
105+
case SIX_VALUE:
106+
return ElementEnum.SIX;
107+
case SEVEN_VALUE:
108+
return ElementEnum.SEVEN;
109+
case EIGHT_VALUE:
110+
return ElementEnum.EIGHT;
111+
case NINE_VALUE:
112+
return ElementEnum.NINE;
113+
case DECIMAL_VALUE:
114+
return ElementEnum.DECIMAL;
115+
case SIGN_CHANGE_VALUE:
116+
return ElementEnum.SIGN_CHANGE;
117+
case PLUS_VALUE:
118+
return ElementEnum.PLUS;
119+
case MINUS_VALUE:
120+
return ElementEnum.MINUS;
121+
case MULTIPLICATION_VALUE:
122+
return ElementEnum.MULTIPLICATION;
123+
case DIVISION_VALUE:
124+
return ElementEnum.DIVISION;
125+
default:
126+
return ElementEnum.NONE;
127+
}
128+
}
129+
130+
131+
static ElementIsNumber(element)
132+
{
133+
return this.ValueIsNumber(EvaluateElement(element));
134+
}
135+
136+
static ValueIsNumber(value)
137+
{
138+
return !isNaN(value);
139+
140+
}
141+
142+
static ElementIsOperator(element)
143+
{
144+
return this.ValueIsOperator(EvaluateElement(element));
145+
}
146+
147+
static ValueIsOperator(value)
148+
{
149+
return !this.ValueIsNumber(value) && value !== DECIMAL_VALUE && value !== SIGN_CHANGE_VALUE;
150+
}
151+
}

NumberBuilder.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
2+
const DEFAULT_FLOAT_VALUE = 0;
3+
const DEFAULT_STRING_VALUE = "";
4+
class NumberBuilder
5+
{
6+
static NumberAsString = DEFAULT_STRING_VALUE;
7+
8+
static NewNumber()
9+
{
10+
this.NumberAsString = DEFAULT_STRING_VALUE;
11+
}
12+
13+
static GetNumberFromString()
14+
{
15+
var conversionPossible = ElementEvaluator.ValueIsNumber(this.NumberAsString);
16+
if (conversionPossible) return parseFloat(this.NumberAsString);
17+
var numberWithoutDecimal = this.NumberAsString.slice(0,this.NumberAsString.indexOf(ElementEvaluator.EvaluateElement(ElementEnum.DECIMAL)));
18+
conversionPossible = ElementEvaluator.ValueIsNumber(numberWithoutDecimal);
19+
if (conversionPossible) return parseFloat(numberWithoutDecimal);
20+
return DEFAULT_FLOAT_VALUE;
21+
}
22+
23+
static Append(addedCharacters)
24+
{
25+
if (ElementEvaluator.ValueIsOperator(addedCharacters)) return;
26+
if (ElementEvaluator.EvaluateValue(addedCharacters) == ElementEnum.DECIMAL && this.NumberAsString.includes(ElementEvaluator.EvaluateElement(ElementEnum.DECIMAL)))
27+
return;
28+
29+
var multiplication = 1;
30+
var tempAddedCharacters = addedCharacters;
31+
for(var i = 0; i < tempAddedCharacters.length; i++)
32+
{
33+
if(tempAddedCharacters.includes(ElementEvaluator.EvaluateElement(ElementEnum.SIGN_CHANGE)))
34+
{
35+
multiplication *= -1;
36+
var foundIndex = tempAddedCharacters.indexOf(ElementEvaluator.EvaluateElement(ElementEnum.SIGN_CHANGE));
37+
var foundLength = ElementEvaluator.EvaluateElement(ElementEnum.SIGN_CHANGE).length;
38+
tempAddedCharacters = tempAddedCharacters.slice(0,foundIndex);
39+
}
40+
}
41+
42+
this.NumberAsString += tempAddedCharacters;
43+
var temp = this.NumberAsString;
44+
this.NumberAsString = (multiplication * this.GetNumberFromString()).toString();
45+
if (temp !== this.NumberAsString)
46+
{
47+
if (this.NumberAsString.includes("-"))
48+
{
49+
var signChanged = "-" + temp;
50+
if (signChanged !== this.NumberAsString)
51+
this.NumberAsString += ".";
52+
}
53+
else if (temp.includes("-"))
54+
{
55+
var tempNumberAsString = "-" + this.NumberAsString;
56+
if (temp !== tempNumberAsString)
57+
this.NumberAsString += ".";
58+
}
59+
else
60+
{
61+
this.NumberAsString += ".";
62+
}
63+
64+
}
65+
}
66+
67+
static BuildNumber()
68+
{
69+
return this.GetNumberFromString();
70+
}
71+
72+
}

index.html

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>Calculator</title>
6+
<!-- https://electronjs.org/docs/tutorial/security#csp-meta-tag -->
7+
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
8+
<link rel="stylesheet" href="styles.css">
9+
</head>
10+
<body>
11+
<p id="Result" class="resultSize resultFont resultMargin resultBackgroundColor resultAlignment defaultPosition resultBorder resultOverflow">0</p>
12+
<button id="SignChangeButton" class="defaultSize signChangeFont signChangeButtonMargin defaultAlignment defaultPosition">+/-</button>
13+
<button id="DecimalButton" class="defaultSize defaultFont decimalButtonMargin defaultAlignment defaultPosition">,</button>
14+
<button id="ZeroButton" class="defaultSize defaultFont zeroButtonMargin defaultAlignment defaultPosition">0</button>
15+
<button id="OneButton" class="defaultSize defaultFont oneButtonMargin defaultAlignment defaultPosition">1</button>
16+
<button id="TwoButton" class="defaultSize defaultFont twoButtonMargin defaultAlignment defaultPosition">2</button>
17+
<button id="ThreeButton" class="defaultSize defaultFont threeButtonMargin defaultAlignment defaultPosition">3</button>
18+
<button id="FourButton" class="defaultSize defaultFont fourButtonMargin defaultAlignment defaultPosition">4</button>
19+
<button id="FiveButton" class="defaultSize defaultFont fiveButtonMargin defaultAlignment defaultPosition">5</button>
20+
<button id="SixButton" class="defaultSize defaultFont sixButtonMargin defaultAlignment defaultPosition">6</button>
21+
<button id="SevenButton" class="defaultSize defaultFont sevenButtonMargin defaultAlignment defaultPosition">7</button>
22+
<button id="EightButton" class="defaultSize defaultFont eightButtonMargin defaultAlignment defaultPosition">8</button>
23+
<button id="NineButton" class="defaultSize defaultFont nineButtonMargin defaultAlignment defaultPosition">9</button>
24+
<button id="MinusButton" class="defaultSize defaultFont minusButtonMargin defaultAlignment defaultPosition">-</button>
25+
<button id="PlusButton" class="defaultSize defaultFont plusButtonMargin defaultAlignment defaultPosition">+</button>
26+
<button id="DivisionButton" class="defaultSize defaultFont divisionButtonMargin defaultAlignment defaultPosition">/</button>
27+
<button id="MultiplicationButton" class="defaultSize defaultFont multiplicationButtonMargin defaultAlignment defaultPosition">*</button>
28+
<button id="ClearButton" class="defaultSize signChangeFont clearButtonMargin defaultAlignment defaultPosition">CE</button>
29+
<button id="ClearAllButton" class="defaultSize signChangeFont clearAllButtonMargin defaultAlignment defaultPosition">C</button>
30+
<button id="EqualButton" class="defaultSize defaultFont equalButtonMargin defaultAlignment defaultPosition">=</button>
31+
<script src="mainWindow.js"></script>
32+
<script src="Element.js"></script>
33+
<script src="NumberBuilder.js"></script>
34+
<script src="CalculatorModel.js"></script>
35+
</body>
36+
</html>

main.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const electron = require('electron');
2+
const app = electron.app;
3+
const BrowserWindow = electron.BrowserWindow;
4+
5+
function createWindow () {
6+
// Create the browser window.
7+
let win = new BrowserWindow({
8+
height: 640,
9+
width: 480,
10+
webPreferences: {
11+
nodeIntegration: true
12+
}
13+
})
14+
15+
// and load the index.html of the app.
16+
win.loadFile('index.html');
17+
win.webContents.openDevTools();
18+
win.removeMenu();
19+
}
20+
21+
app.whenReady().then(createWindow)

0 commit comments

Comments
 (0)