Compare commits
31 Commits
upsilon-de
...
upsilon-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51fd990c31 | ||
|
|
7af2b45f1d | ||
|
|
d95785ba42 | ||
|
|
d108b76a32 | ||
|
|
a3d3cbbfa5 | ||
|
|
3a41cbdc85 | ||
|
|
3ccfdf0365 | ||
|
|
6aad7d2279 | ||
|
|
5c1f192228 | ||
|
|
84d88a3e8d | ||
|
|
00b5d4b9fe | ||
|
|
2aee07ae55 | ||
|
|
41b2b64d80 | ||
|
|
473b0bbfcb | ||
|
|
58ef8cb95d | ||
|
|
5dce215165 | ||
|
|
f2f44f0f6f | ||
|
|
fbe542e5bf | ||
|
|
0a1b3bcaee | ||
|
|
f6e937a927 | ||
|
|
c4ed8f84d3 | ||
|
|
8e1b311be0 | ||
|
|
89e51166e7 | ||
|
|
e4961563e9 | ||
|
|
e72b0f633e | ||
|
|
0550b66c03 | ||
|
|
e41910e2f8 | ||
|
|
d91ae29607 | ||
|
|
3b90969b42 | ||
|
|
bd207cb845 | ||
|
|
917ba7ce83 |
4
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Bug report
|
name: Bug report
|
||||||
about: Omega is not working like it should? Let us know!
|
about: Upsilon is not working like it should? Let us know!
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Bug'
|
labels: 'Status: Triage, Type: Bug'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
@@ -24,4 +24,4 @@ A clear and concise description of what you expected to happen.
|
|||||||
If applicable, add screenshots to help explain your problem.
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
**Desktop (please complete the following information):**
|
||||||
- Omega Version: [go to settings > about > Omega Version and type the version here]
|
- Upsilon Version: [go to settings > about > Upsilon Version and type the version here]
|
||||||
|
|||||||
2
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for Omega
|
about: Suggest an idea for Upsilon
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Feature'
|
labels: 'Status: Triage, Type: Feature'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
name: OMEGA BETA ONLY - Bug report
|
|
||||||
about: Omega 1.21 is not working like it should? Let us know!
|
|
||||||
title: "[BETA-1.21] …"
|
|
||||||
labels: 'Status: Triage, Type: Bug'
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
|
||||||
- Omega Version: [go to settings > about > Omega Version and type the version here]
|
|
||||||
- Discord username: ..........#....
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: Problems during installation
|
name: Problems during installation
|
||||||
about: Need help to install Omega?
|
about: Need help to install Upsilon?
|
||||||
title: ''
|
title: ''
|
||||||
labels: 'Status: Triage, Type: Installation issue'
|
labels: 'Status: Triage, Type: Installation issue'
|
||||||
assignees: ''
|
assignees: ''
|
||||||
@@ -16,4 +16,4 @@ Copy/paste the logs here (If you have some)
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Environment**
|
**Environment**
|
||||||
- Omega Version: {go to settings > about > Omega Version and type the version here}
|
- Upsilon Version: {go to settings > about > Upsilon Version and type the version here}
|
||||||
|
|||||||
2
.github/workflows/ci-workflow.yml
vendored
@@ -140,7 +140,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: numworks/setup-emscripten@v1
|
- uses: numworks/setup-emscripten@v1
|
||||||
with:
|
with:
|
||||||
sdk: latest-upstream
|
sdk: 1.40.1-fastcomp
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
|||||||
2
.gitmodules
vendored
@@ -1,6 +1,6 @@
|
|||||||
[submodule "apps/rpn"]
|
[submodule "apps/rpn"]
|
||||||
path = apps/rpn
|
path = apps/rpn
|
||||||
url = https://github.com/Omega-Numworks/Omega-RPN.git
|
url = https://github.com/Lauryy06/Upsilon-RPN.git
|
||||||
[submodule "apps/atomic"]
|
[submodule "apps/atomic"]
|
||||||
path = apps/atomic
|
path = apps/atomic
|
||||||
url = https://github.com/Lauryy06/atomic
|
url = https://github.com/Lauryy06/atomic
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ Vous aurez besoin de devkitPro et de devkitARM disponible dans votre `$PATH` (in
|
|||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Lauryy06/Upsilon.git
|
git clone --recursive https://github.com/Lauryy06/Upsilon.git
|
||||||
cd Upsilon
|
cd Upsilon
|
||||||
git checkout --recursive omega-dev
|
git checkout --recursive upsilon-dev
|
||||||
make PLATFORM=simulator TARGET=3ds -j
|
make PLATFORM=simulator TARGET=3ds -j
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -240,7 +240,7 @@ You need devkitPro and devkitARM installed and in your path (instructions [here]
|
|||||||
```bash
|
```bash
|
||||||
git clone --recursive https://github.com/Lauryy06/Upsilon.git
|
git clone --recursive https://github.com/Lauryy06/Upsilon.git
|
||||||
cd Upsilon
|
cd Upsilon
|
||||||
git checkout --recursive omega-dev
|
git checkout --recursive upsilon-dev
|
||||||
make PLATFORM=simulator TARGET=3ds -j
|
make PLATFORM=simulator TARGET=3ds -j
|
||||||
```
|
```
|
||||||
You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink to launch it over the network:
|
You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink to launch it over the network:
|
||||||
|
|||||||
@@ -75,13 +75,13 @@ void BatteryView::drawRect(KDContext * ctx, KDRect rect) const {
|
|||||||
assert(!m_isPlugged);
|
assert(!m_isPlugged);
|
||||||
// Low: Quite empty battery
|
// Low: Quite empty battery
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, 2*k_elementWidth, k_batteryHeight), Palette::BatteryLow);
|
ctx->fillRect(KDRect(batteryInsideX, 0, 2*k_elementWidth, k_batteryHeight), Palette::BatteryLow);
|
||||||
ctx->fillRect(KDRect(3*k_elementWidth+k_separatorThickness, 0, k_batteryWidth-5*k_elementWidth-2*k_separatorThickness, k_batteryHeight), Palette::BatteryInCharge);
|
ctx->fillRect(KDRect(3*k_elementWidth+k_separatorThickness, 0, k_batteryWidth-5*k_elementWidth-2*k_separatorThickness, k_batteryHeight), KDColor::blend(Palette::Toolbar, Palette::Battery, 128));
|
||||||
} else if (m_chargeState == Ion::Battery::Charge::SOMEWHERE_INBETWEEN) {
|
} else if (m_chargeState == Ion::Battery::Charge::SOMEWHERE_INBETWEEN) {
|
||||||
assert(!m_isPlugged);
|
assert(!m_isPlugged);
|
||||||
// Middle: Half full battery
|
// Middle: Half full battery
|
||||||
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
|
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
|
||||||
ctx->fillRect(KDRect(batteryInsideX, 0, middleChargeWidth, k_batteryHeight), Palette::Battery);
|
ctx->fillRect(KDRect(batteryInsideX, 0, middleChargeWidth, k_batteryHeight), Palette::Battery);
|
||||||
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 0, middleChargeWidth, k_batteryHeight), Palette::BatteryInCharge);
|
ctx->fillRect(KDRect(batteryInsideX+middleChargeWidth, 0, middleChargeWidth, k_batteryHeight), KDColor::blend(Palette::Toolbar, Palette::Battery, 128));
|
||||||
} else {
|
} else {
|
||||||
assert(m_chargeState == Ion::Battery::Charge::FULL);
|
assert(m_chargeState == Ion::Battery::Charge::FULL);
|
||||||
// Full but not plugged: Full battery
|
// Full but not plugged: Full battery
|
||||||
|
|||||||
@@ -29,6 +29,12 @@ void SecondDegreeListController::setExpression(Poincare::Expression e) {
|
|||||||
|
|
||||||
Context * context = App::app()->localContext();
|
Context * context = App::app()->localContext();
|
||||||
Preferences * preferences = Preferences::sharedPreferences();
|
Preferences * preferences = Preferences::sharedPreferences();
|
||||||
|
Poincare::ExpressionNode::ReductionContext reductionContext = Poincare::ExpressionNode::ReductionContext(context,
|
||||||
|
preferences->complexFormat(), preferences->angleUnit(),
|
||||||
|
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
|
||||||
|
ExpressionNode::ReductionTarget::SystemForApproximation,
|
||||||
|
ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition,
|
||||||
|
Poincare::ExpressionNode::UnitConversion::Default);
|
||||||
|
|
||||||
PoincareHelpers::Reduce(&m_expression, context, ExpressionNode::ReductionTarget::SystemForAnalysis);
|
PoincareHelpers::Reduce(&m_expression, context, ExpressionNode::ReductionTarget::SystemForAnalysis);
|
||||||
|
|
||||||
@@ -46,60 +52,108 @@ void SecondDegreeListController::setExpression(Poincare::Expression e) {
|
|||||||
Expression a = polynomialCoefficients[2];
|
Expression a = polynomialCoefficients[2];
|
||||||
Expression b = polynomialCoefficients[1];
|
Expression b = polynomialCoefficients[1];
|
||||||
Expression c = polynomialCoefficients[0];
|
Expression c = polynomialCoefficients[0];
|
||||||
|
|
||||||
bool aIsNotOne = !(a.type() == ExpressionNode::Type::Rational && static_cast<const Rational &>(a).isOne());
|
|
||||||
|
|
||||||
Expression delta = Subtraction::Builder(Power::Builder(b.clone(), Rational::Builder(2)), Multiplication::Builder(Rational::Builder(4), a.clone(), c.clone()));
|
Expression delta = Subtraction::Builder(Power::Builder(b.clone(), Rational::Builder(2)), Multiplication::Builder(Rational::Builder(4), a.clone(), c.clone()));
|
||||||
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
|
|
||||||
Expression alpha = Opposite::Builder(Division::Builder(b.clone(), Multiplication::Builder(Rational::Builder(2), a.clone())));
|
// Alpha is -b/2a, but because after we use -α, we immediately store -α=-(-b/2a)=b/2a.
|
||||||
PoincareHelpers::Simplify(&alpha, context, ExpressionNode::ReductionTarget::User);
|
Expression minusAlpha = Division::Builder(b.clone(), Multiplication::Builder(Rational::Builder(2), a.clone()));
|
||||||
|
PoincareHelpers::Reduce(&minusAlpha, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
|
|
||||||
Expression beta = Opposite::Builder(Division::Builder(delta.clone(), Multiplication::Builder(Rational::Builder(4), a.clone())));
|
// Same thing for β
|
||||||
PoincareHelpers::Simplify(&beta, context, ExpressionNode::ReductionTarget::User);
|
Expression minusBeta = Division::Builder(delta.clone(), Multiplication::Builder(Rational::Builder(4), a.clone()));
|
||||||
|
PoincareHelpers::Reduce(&minusBeta, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
|
|
||||||
|
enum MultiplicationTypeForA {
|
||||||
|
Nothing,
|
||||||
|
Minus,
|
||||||
|
Parenthesis,
|
||||||
|
Normal
|
||||||
|
};
|
||||||
|
|
||||||
|
MultiplicationTypeForA multiplicationTypeForA;
|
||||||
|
|
||||||
|
if (a.type() == ExpressionNode::Type::Rational && static_cast<const Rational &>(a).isOne()) {
|
||||||
|
multiplicationTypeForA = MultiplicationTypeForA::Nothing;
|
||||||
|
}
|
||||||
|
else if(a.type() == ExpressionNode::Type::Rational && static_cast<const Rational &>(a).isMinusOne()){
|
||||||
|
multiplicationTypeForA = MultiplicationTypeForA::Minus;
|
||||||
|
}
|
||||||
|
else if (a.type() == ExpressionNode::Type::Addition) {
|
||||||
|
multiplicationTypeForA = MultiplicationTypeForA::Parenthesis;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
multiplicationTypeForA = MultiplicationTypeForA::Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
PoincareHelpers::Simplify(&a, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Because when can't apply reduce or simplify to keep the canonised
|
* Because when can't apply reduce or simplify to keep the
|
||||||
* we must beautify the expression manually
|
* canonized form we must beautify the expression manually
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Expression canonised;
|
Expression xMinusAlphaPowerTwo;
|
||||||
if (alpha.type() == ExpressionNode::Type::Opposite) {
|
Expression alpha = getOppositeIfExists(minusAlpha, &reductionContext);
|
||||||
canonised = Addition::Builder(Symbol::Builder("x", strlen("x")), alpha.childAtIndex(0).clone());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
canonised = Subtraction::Builder(Symbol::Builder("x", strlen("x")), alpha.clone());
|
|
||||||
}
|
|
||||||
canonised = Power::Builder(Parenthesis::Builder(canonised.clone()), Rational::Builder(2));
|
|
||||||
if (aIsNotOne) {
|
|
||||||
canonised = Multiplication::Builder(a.clone(), canonised.clone());
|
|
||||||
}
|
|
||||||
if (beta.type() == ExpressionNode::Type::Opposite) {
|
|
||||||
canonised = Subtraction::Builder(canonised.clone(), beta.childAtIndex(0).clone());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
canonised = Addition::Builder(canonised.clone(), beta.clone());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (alpha.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&minusAlpha, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
xMinusAlphaPowerTwo = Power::Builder(Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), minusAlpha)), Rational::Builder(2));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PoincareHelpers::Simplify(&alpha, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
xMinusAlphaPowerTwo = Power::Builder(Parenthesis::Builder(Subtraction::Builder(Symbol::Builder("x", strlen("x")), alpha)), Rational::Builder(2));
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression xMinusAlphaPowerTwoWithFactor;
|
||||||
|
|
||||||
|
switch (multiplicationTypeForA)
|
||||||
|
{
|
||||||
|
case MultiplicationTypeForA::Nothing:
|
||||||
|
xMinusAlphaPowerTwoWithFactor = xMinusAlphaPowerTwo;
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Minus:
|
||||||
|
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(a.clone(), xMinusAlphaPowerTwo);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Parenthesis:
|
||||||
|
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(Parenthesis::Builder(a.clone()), xMinusAlphaPowerTwo);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Normal:
|
||||||
|
xMinusAlphaPowerTwoWithFactor = Multiplication::Builder(a.clone(), xMinusAlphaPowerTwo);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression canonized;
|
||||||
|
Expression beta = getOppositeIfExists(minusBeta, &reductionContext);
|
||||||
|
if (beta.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&minusBeta, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
canonized = Subtraction::Builder(xMinusAlphaPowerTwoWithFactor, minusBeta);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PoincareHelpers::Simplify(&beta, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
canonized = Addition::Builder(xMinusAlphaPowerTwoWithFactor, beta);
|
||||||
|
}
|
||||||
|
|
||||||
Expression x0;
|
Expression x0;
|
||||||
Expression x1;
|
Expression x1;
|
||||||
|
|
||||||
|
|
||||||
if (delta.nullStatus(context) == ExpressionNode::NullStatus::Null) {
|
if (delta.nullStatus(context) == ExpressionNode::NullStatus::Null) {
|
||||||
// x0 = x1 = -b/(2a)
|
// x0 = x1 = -b/(2a)
|
||||||
x0 = Division::Builder(Opposite::Builder(b), Multiplication::Builder(Rational::Builder(2), a));
|
x0 = Division::Builder(Opposite::Builder(b.clone()), Multiplication::Builder(Rational::Builder(2), a.clone()));
|
||||||
m_numberOfSolutions = 1;
|
m_numberOfSolutions = 1;
|
||||||
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
|
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// x0 = (-b-sqrt(delta))/(2a)
|
// x0 = (-b-sqrt(delta))/(2a)
|
||||||
x0 = Division::Builder(Subtraction::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
|
x0 = Division::Builder(Subtraction::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
|
||||||
// x1 = (-b+sqrt(delta))/(2a)
|
// x1 = (-b+sqrt(delta))/(2a)
|
||||||
x1 = Division::Builder(Addition::Builder(Opposite::Builder(b), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a));
|
x1 = Division::Builder(Addition::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
|
||||||
m_numberOfSolutions = 2;
|
m_numberOfSolutions = 2;
|
||||||
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
|
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::User);
|
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::SystemForApproximation);
|
||||||
if (x0.type() == ExpressionNode::Type::Unreal) {
|
if (x0.type() == ExpressionNode::Type::Unreal) {
|
||||||
assert(x1.type() == ExpressionNode::Type::Unreal);
|
assert(x1.type() == ExpressionNode::Type::Unreal);
|
||||||
m_numberOfSolutions = 0;
|
m_numberOfSolutions = 0;
|
||||||
@@ -109,40 +163,87 @@ void SecondDegreeListController::setExpression(Poincare::Expression e) {
|
|||||||
Expression factorized;
|
Expression factorized;
|
||||||
|
|
||||||
if (m_numberOfSolutions == 2) {
|
if (m_numberOfSolutions == 2) {
|
||||||
|
Expression firstFactor;
|
||||||
|
Expression secondFactor;
|
||||||
|
|
||||||
|
Expression x0Opposite = getOppositeIfExists(x0, &reductionContext);
|
||||||
|
if (x0Opposite.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
firstFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
PoincareHelpers::Simplify(&x0Opposite, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
firstFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite);
|
||||||
|
}
|
||||||
if (x0.type() == ExpressionNode::Type::Opposite) {
|
if (x0.type() == ExpressionNode::Type::Opposite) {
|
||||||
factorized = Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x0.childAtIndex(0).clone()));
|
factorized = Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x0.childAtIndex(0).clone()));
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
factorized = Parenthesis::Builder(Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0.clone()));
|
Expression x1Opposite = getOppositeIfExists(x1, &reductionContext);
|
||||||
}
|
if (x1Opposite.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::User);
|
||||||
if (x1.type() == ExpressionNode::Type::Opposite) {
|
secondFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x1);
|
||||||
factorized = Multiplication::Builder(factorized.clone(), Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x1.childAtIndex(0).clone())));
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
factorized = Multiplication::Builder(factorized.clone(), Parenthesis::Builder(Subtraction::Builder(Symbol::Builder("x", strlen("x")), x1.clone())));
|
PoincareHelpers::Simplify(&x1Opposite, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
secondFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x1Opposite);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aIsNotOne) {
|
Expression solutionProduct = Multiplication::Builder(Parenthesis::Builder(firstFactor), Parenthesis::Builder(secondFactor));
|
||||||
factorized = Multiplication::Builder(a.clone(), factorized.clone());
|
switch (multiplicationTypeForA)
|
||||||
|
{
|
||||||
|
case MultiplicationTypeForA::Nothing:
|
||||||
|
factorized = solutionProduct;
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Minus:
|
||||||
|
factorized = Multiplication::Builder(a.clone(), solutionProduct);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Parenthesis:
|
||||||
|
factorized = Multiplication::Builder(Parenthesis::Builder(a.clone()), solutionProduct);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Normal:
|
||||||
|
factorized = Multiplication::Builder(a.clone(), solutionProduct);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_numberOfSolutions == 1) {
|
else if (m_numberOfSolutions == 1) {
|
||||||
if (x0.type() == ExpressionNode::Type::Opposite) {
|
Expression x0Opposite = getOppositeIfExists(x0, &reductionContext);
|
||||||
factorized = Power::Builder(Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x0.childAtIndex(0).clone())), Rational::Builder(2));
|
Expression factor;
|
||||||
|
if (x0Opposite.isUninitialized()) {
|
||||||
|
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
factor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
factorized = Power::Builder(Parenthesis::Builder(Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0.clone())), Rational::Builder(2));
|
PoincareHelpers::Simplify(&x0Opposite, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
factor = Addition::Builder(Symbol::Builder("x", strlen("x")), x0Opposite);
|
||||||
}
|
}
|
||||||
|
Expression solutionProduct = Power::Builder(Parenthesis::Builder(factor), Rational::Builder(2));
|
||||||
if (aIsNotOne) {
|
switch (multiplicationTypeForA)
|
||||||
factorized = Multiplication::Builder(a.clone(), factorized.clone());
|
{
|
||||||
|
case MultiplicationTypeForA::Nothing:
|
||||||
|
factorized = solutionProduct;
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Minus:
|
||||||
|
factorized = Multiplication::Builder(a.clone(), solutionProduct);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Parenthesis:
|
||||||
|
factorized = Multiplication::Builder(Parenthesis::Builder(a.clone()), solutionProduct);
|
||||||
|
break;
|
||||||
|
case MultiplicationTypeForA::Normal:
|
||||||
|
factorized = Multiplication::Builder(a.clone(), solutionProduct);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::User);
|
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::User);
|
||||||
|
|
||||||
m_layouts[0] = PoincareHelpers::CreateLayout(canonised);
|
m_layouts[0] = PoincareHelpers::CreateLayout(canonized);
|
||||||
if (m_numberOfSolutions > 0) {
|
if (m_numberOfSolutions > 0) {
|
||||||
m_layouts[1] = PoincareHelpers::CreateLayout(factorized);
|
m_layouts[1] = PoincareHelpers::CreateLayout(factorized);
|
||||||
m_layouts[2] = PoincareHelpers::CreateLayout(delta);
|
m_layouts[2] = PoincareHelpers::CreateLayout(delta);
|
||||||
@@ -156,6 +257,27 @@ void SecondDegreeListController::setExpression(Poincare::Expression e) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Expression SecondDegreeListController::getOppositeIfExists(Expression e, Poincare::ExpressionNode::ReductionContext * reductionContext) {
|
||||||
|
if (e.isNumber() && e.sign(reductionContext->context()) == ExpressionNode::Sign::Negative) {
|
||||||
|
Number n = static_cast<Number&>(e);
|
||||||
|
return std::move(n.setSign(ExpressionNode::Sign::Positive));
|
||||||
|
}
|
||||||
|
else if (e.type() == ExpressionNode::Type::Multiplication && e.numberOfChildren() > 0 && e.childAtIndex(0).isNumber() && e.childAtIndex(0).sign(reductionContext->context()) == ExpressionNode::Sign::Negative) {
|
||||||
|
Multiplication m = static_cast<Multiplication&>(e);
|
||||||
|
if (m.childAtIndex(0).type() == ExpressionNode::Type::Rational && static_cast<Rational&>(e).isMinusOne()) {
|
||||||
|
// The negative numeral factor is -1, we just remove it
|
||||||
|
m.removeChildAtIndexInPlace(0);
|
||||||
|
} else {
|
||||||
|
Expression firstChild = m.childAtIndex(0);
|
||||||
|
Number n = static_cast<Number&>(firstChild);
|
||||||
|
m.childAtIndex(0).setChildrenInPlace(n.setSign(ExpressionNode::Sign::Positive));
|
||||||
|
}
|
||||||
|
PoincareHelpers::Simplify(&m, reductionContext->context(), ExpressionNode::ReductionTarget::User);
|
||||||
|
return std::move(m);
|
||||||
|
}
|
||||||
|
return Expression();
|
||||||
|
}
|
||||||
|
|
||||||
I18n::Message SecondDegreeListController::messageAtIndex(int index) {
|
I18n::Message SecondDegreeListController::messageAtIndex(int index) {
|
||||||
if (m_numberOfSolutions > 0) {
|
if (m_numberOfSolutions > 0) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public:
|
|||||||
void setExpression(Poincare::Expression e) override;
|
void setExpression(Poincare::Expression e) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Poincare::Expression getOppositeIfExists(Poincare::Expression e, Poincare::ExpressionNode::ReductionContext * reductionContext);
|
||||||
I18n::Message messageAtIndex(int index) override;
|
I18n::Message messageAtIndex(int index) override;
|
||||||
int m_numberOfSolutions;
|
int m_numberOfSolutions;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ void HistoryViewCell::reloadSubviewHighlight() {
|
|||||||
m_ellipsis.setHighlighted(false);
|
m_ellipsis.setHighlighted(false);
|
||||||
if (isHighlighted()) {
|
if (isHighlighted()) {
|
||||||
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
|
if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Input) {
|
||||||
m_inputView.setExpressionBackgroundColor(Palette::ListCellBackgroundSelected);
|
m_inputView.setExpressionBackgroundColor(Palette::Select);
|
||||||
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
|
} else if (m_dataSource->selectedSubviewType() == HistoryViewCellDataSource::SubviewType::Output) {
|
||||||
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
|
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
apps += Code::App
|
apps += Code::App
|
||||||
app_headers += apps/code/app.h
|
app_headers += apps/code/app.h
|
||||||
|
|
||||||
|
SFLAGS += -DHAS_CODE
|
||||||
|
|
||||||
app_code_src = $(addprefix apps/code/,\
|
app_code_src = $(addprefix apps/code/,\
|
||||||
app.cpp \
|
app.cpp \
|
||||||
console_controller.cpp \
|
console_controller.cpp \
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ void EditorView::GutterView::setOffset(KDCoordinate offset) {
|
|||||||
|
|
||||||
KDSize EditorView::GutterView::minimalSizeForOptimalDisplay() const {
|
KDSize EditorView::GutterView::minimalSizeForOptimalDisplay() const {
|
||||||
int numberOfChars = 2; // TODO: Could be computed
|
int numberOfChars = 2; // TODO: Could be computed
|
||||||
return KDSize(2 * k_margin + numberOfChars * Poincare::Preferences::sharedPreferences()->KDPythonFont()->glyphSize().width(), 0);
|
return KDSize(2 * k_margin + numberOfChars * m_font->glyphSize().width(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ void ScriptNodeCell::ScriptNodeView::drawRect(KDContext * ctx, KDRect rect) cons
|
|||||||
const int nodeNameLength = m_scriptNode->nameLength();
|
const int nodeNameLength = m_scriptNode->nameLength();
|
||||||
KDSize nameSize = k_font->stringSize(nodeName, nodeNameLength);
|
KDSize nameSize = k_font->stringSize(nodeName, nodeNameLength);
|
||||||
const KDCoordinate nodeNameY = k_topMargin;
|
const KDCoordinate nodeNameY = k_topMargin;
|
||||||
ctx->drawString(nodeName, KDPoint(0, nodeNameY), k_font, KDColorBlack, backgroundColor, nodeNameLength);
|
ctx->drawString(nodeName, KDPoint(0, nodeNameY), k_font, Palette::PrimaryText, backgroundColor, nodeNameLength);
|
||||||
// If it is needed, draw the parentheses
|
// If it is needed, draw the parentheses
|
||||||
if (m_scriptNode->type() == ScriptNode::Type::WithParentheses) {
|
if (m_scriptNode->type() == ScriptNode::Type::WithParentheses) {
|
||||||
ctx->drawString(ScriptNodeCell::k_parentheses, KDPoint(nameSize.width(), nodeNameY), k_font, KDColorBlack, backgroundColor);
|
ctx->drawString(ScriptNodeCell::k_parentheses, KDPoint(nameSize.width(), nodeNameY), k_font, Palette::PrimaryText, backgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If it exists, draw the source name. If it did not fit, we would have put
|
/* If it exists, draw the source name. If it did not fit, we would have put
|
||||||
|
|||||||
@@ -8,11 +8,9 @@ bool ScriptStore::ScriptNameIsFree(const char * baseName) {
|
|||||||
return ScriptBaseNamed(baseName).isNull();
|
return ScriptBaseNamed(baseName).isNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Here we add "base" script
|
||||||
ScriptStore::ScriptStore() {
|
ScriptStore::ScriptStore() {
|
||||||
addScriptFromTemplate(ScriptTemplate::Squares());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Parabola());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Mandelbrot());
|
|
||||||
addScriptFromTemplate(ScriptTemplate::Polynomial());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptStore::deleteAllScripts() {
|
void ScriptStore::deleteAllScripts() {
|
||||||
|
|||||||
@@ -5,103 +5,9 @@ namespace Code {
|
|||||||
constexpr ScriptTemplate emptyScriptTemplate(".py", "\x01" R"(from math import *
|
constexpr ScriptTemplate emptyScriptTemplate(".py", "\x01" R"(from math import *
|
||||||
)");
|
)");
|
||||||
|
|
||||||
constexpr ScriptTemplate squaresScriptTemplate("squares.py", "\x01" R"(from math import *
|
|
||||||
from turtle import *
|
|
||||||
def squares(angle=0.5):
|
|
||||||
reset()
|
|
||||||
L=330
|
|
||||||
speed(10)
|
|
||||||
penup()
|
|
||||||
goto(-L/2,-L/2)
|
|
||||||
pendown()
|
|
||||||
for i in range(660):
|
|
||||||
forward(L)
|
|
||||||
left(90+angle)
|
|
||||||
L=L-L*sin(angle*pi/180)
|
|
||||||
hideturtle())");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate mandelbrotScriptTemplate("mandelbrot.py", "\x01" R"(# This script draws a Mandelbrot fractal set
|
|
||||||
# N_iteration: degree of precision
|
|
||||||
import kandinsky
|
|
||||||
def mandelbrot(N_iteration):
|
|
||||||
for x in range(320):
|
|
||||||
for y in range(222):
|
|
||||||
# Compute the mandelbrot sequence for the point c = (c_r, c_i) with start value z = (z_r, z_i)
|
|
||||||
z = complex(0,0)
|
|
||||||
# Rescale to fit the drawing screen 320x222
|
|
||||||
c = complex(3.5*x/319-2.5, -2.5*y/221+1.25)
|
|
||||||
i = 0
|
|
||||||
while (i < N_iteration) and abs(z) < 2:
|
|
||||||
i = i + 1
|
|
||||||
z = z*z+c
|
|
||||||
# Choose the color of the dot from the Mandelbrot sequence
|
|
||||||
rgb = int(255*i/N_iteration)
|
|
||||||
col = kandinsky.color(int(rgb*0.82),int(rgb*0.13),int(rgb*0.18))
|
|
||||||
# Draw a pixel colored in 'col' at position (x,y)
|
|
||||||
kandinsky.set_pixel(x,y,col))");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate polynomialScriptTemplate("polynomial.py", "\x01" R"(from math import *
|
|
||||||
# roots(a,b,c) computes the solutions of the equation a*x**2+b*x+c=0
|
|
||||||
def roots(a,b,c):
|
|
||||||
delta = b*b-4*a*c
|
|
||||||
if delta == 0:
|
|
||||||
return -b/(2*a)
|
|
||||||
elif delta > 0:
|
|
||||||
x_1 = (-b-sqrt(delta))/(2*a)
|
|
||||||
x_2 = (-b+sqrt(delta))/(2*a)
|
|
||||||
return x_1, x_2
|
|
||||||
else:
|
|
||||||
return None)");
|
|
||||||
|
|
||||||
constexpr ScriptTemplate parabolaScriptTemplate("parabola.py", "\x01" R"(from matplotlib.pyplot import *
|
|
||||||
from math import *
|
|
||||||
|
|
||||||
g=9.81
|
|
||||||
|
|
||||||
def x(t,v_0,alpha):
|
|
||||||
return v_0*cos(alpha)*t
|
|
||||||
def y(t,v_0,alpha,h_0):
|
|
||||||
return -0.5*g*t**2+v_0*sin(alpha)*t+h_0
|
|
||||||
|
|
||||||
def vx(v_0,alpha):
|
|
||||||
return v_0*cos(alpha)
|
|
||||||
def vy(t,v_0,alpha):
|
|
||||||
return -g*t+v_0*sin(alpha)
|
|
||||||
|
|
||||||
def t_max(v_0,alpha,h_0):
|
|
||||||
return (v_0*sin(alpha)+sqrt((v_0**2)*(sin(alpha)**2)+2*g*h_0))/g
|
|
||||||
|
|
||||||
def simulation(v_0=15,alpha=pi/4,h_0=2):
|
|
||||||
tMax=t_max(v_0,alpha,h_0)
|
|
||||||
accuracy=1/10**(floor(log10(tMax))-1)
|
|
||||||
T_MAX=floor(tMax*accuracy)+1
|
|
||||||
X=[x(t/accuracy,v_0,alpha) for t in range(T_MAX)]
|
|
||||||
Y=[y(t/accuracy,v_0,alpha,h_0) for t in range(T_MAX)]
|
|
||||||
VX=[vx(v_0,alpha) for t in range(T_MAX)]
|
|
||||||
VY=[vy(t/accuracy,v_0,alpha) for t in range(T_MAX)]
|
|
||||||
for i in range(T_MAX):
|
|
||||||
arrow(X[i],Y[i],VX[i]/accuracy,VY[i]/accuracy)
|
|
||||||
grid()
|
|
||||||
show())");
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Empty() {
|
const ScriptTemplate * ScriptTemplate::Empty() {
|
||||||
return &emptyScriptTemplate;
|
return &emptyScriptTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Squares() {
|
|
||||||
return &squaresScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Mandelbrot() {
|
|
||||||
return &mandelbrotScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Polynomial() {
|
|
||||||
return &polynomialScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ScriptTemplate * ScriptTemplate::Parabola() {
|
|
||||||
return ¶bolaScriptTemplate;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,10 +9,6 @@ class ScriptTemplate {
|
|||||||
public:
|
public:
|
||||||
constexpr ScriptTemplate(const char * name, const char * value) : m_name(name), m_value(value) {}
|
constexpr ScriptTemplate(const char * name, const char * value) : m_name(name), m_value(value) {}
|
||||||
static const ScriptTemplate * Empty();
|
static const ScriptTemplate * Empty();
|
||||||
static const ScriptTemplate * Squares();
|
|
||||||
static const ScriptTemplate * Mandelbrot();
|
|
||||||
static const ScriptTemplate * Polynomial();
|
|
||||||
static const ScriptTemplate * Parabola();
|
|
||||||
const char * name() const { return m_name; }
|
const char * name() const { return m_name; }
|
||||||
const char * content() const { return m_value + Script::StatusSize(); }
|
const char * content() const { return m_value + Script::StatusSize(); }
|
||||||
const char * value() const { return m_value; }
|
const char * value() const { return m_value; }
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ namespace Code {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
|
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
|
||||||
ctx->fillRect(rect, Palette::GrayBright);
|
ctx->fillRect(rect, Palette::WallScreen);
|
||||||
ctx->strokeRect(rect, Palette::GrayDark);
|
ctx->strokeRect(rect, Palette::ListCellBorder);
|
||||||
ctx->drawString(I18n::translate(I18n::Message::PressAKey),KDPoint(rect.left()+80, rect.top()+20));
|
ctx->drawString(I18n::translate(I18n::Message::PressAKey),KDPoint(rect.left()+80, rect.top()+20),KDFont::LargeFont,Palette::PrimaryText,Palette::WallScreen);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
View * toolboxIonKeys::view(){
|
View * toolboxIonKeys::view(){
|
||||||
|
|||||||
23
apps/geometry/Makefile
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
apps += Geometry::App
|
||||||
|
app_headers += apps/geometry/app.h
|
||||||
|
|
||||||
|
app_geometry_src = $(addprefix apps/geometry/,\
|
||||||
|
app.cpp \
|
||||||
|
list/figures_controller.cpp \
|
||||||
|
list/definition_type_controller.cpp \
|
||||||
|
list/figure_type_controller.cpp \
|
||||||
|
list/figure_parameters_controller.cpp \
|
||||||
|
list/objects_controller.cpp \
|
||||||
|
list/message_table_cell_with_selector.cpp \
|
||||||
|
figure_store.cpp \
|
||||||
|
graph/graph_controller.cpp \
|
||||||
|
graph/banner_view.cpp \
|
||||||
|
)
|
||||||
|
|
||||||
|
apps_src += $(app_geometry_src)
|
||||||
|
|
||||||
|
app_images += apps/geometry/geometry_icon.png
|
||||||
|
|
||||||
|
i18n_files += $(call i18n_with_universal_for,geometry/base)
|
||||||
|
|
||||||
|
$(eval $(call depends_on_image,apps/geometry/app.cpp,apps/geometry/geometry_icon.png))
|
||||||
48
apps/geometry/app.cpp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include "app.h"
|
||||||
|
#include "geometry_icon.h"
|
||||||
|
#include "apps/apps_container.h"
|
||||||
|
#include "apps/i18n.h"
|
||||||
|
|
||||||
|
namespace Geometry
|
||||||
|
{
|
||||||
|
|
||||||
|
I18n::Message App::Descriptor::name()
|
||||||
|
{
|
||||||
|
return I18n::Message::GeometryApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
I18n::Message App::Descriptor::upperName()
|
||||||
|
{
|
||||||
|
return I18n::Message::GeometryAppCapital;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Image * App::Descriptor::icon()
|
||||||
|
{
|
||||||
|
return ImageStore::GeometryIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
App * App::Snapshot::unpack(Container * container)
|
||||||
|
{
|
||||||
|
return new (container->currentAppBuffer()) App(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
App::Descriptor * App::Snapshot::descriptor()
|
||||||
|
{
|
||||||
|
static Descriptor descriptor;
|
||||||
|
return &descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
App::App(Snapshot * snapshot) :
|
||||||
|
TextFieldDelegateApp(snapshot, &m_tabViewController),
|
||||||
|
m_figuresController(&m_stackViewController),
|
||||||
|
m_stackViewController(&m_tabViewController, &m_figuresController),
|
||||||
|
m_graphController(&m_graphAlternateEmptyViewController, this, &m_graphHeader, nullptr, nullptr, nullptr),
|
||||||
|
m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController),
|
||||||
|
m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController),
|
||||||
|
m_graphStackViewController(&m_tabViewController, &m_graphHeader),
|
||||||
|
m_otherViewController(&m_tabViewController),
|
||||||
|
m_tabViewController(&m_modalViewController, snapshot, &m_stackViewController, &m_graphAlternateEmptyViewController, &m_otherViewController)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
40
apps/geometry/app.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#ifndef GEOMETRY_H
|
||||||
|
#define GEOMETRY_H
|
||||||
|
|
||||||
|
#include <escher.h>
|
||||||
|
#include "list/figures_controller.h"
|
||||||
|
#include "graph/graph_controller.h"
|
||||||
|
#include "other/other_view_controller.h"
|
||||||
|
#include "../shared/text_field_delegate_app.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class App : public Shared::TextFieldDelegateApp {
|
||||||
|
public:
|
||||||
|
class Descriptor : public ::App::Descriptor {
|
||||||
|
public:
|
||||||
|
I18n::Message name() override;
|
||||||
|
I18n::Message upperName() override;
|
||||||
|
const Image * icon() override;
|
||||||
|
};
|
||||||
|
class Snapshot : public ::App::Snapshot, public TabViewDataSource {
|
||||||
|
public:
|
||||||
|
App * unpack(Container * container) override;
|
||||||
|
Descriptor * descriptor() override;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
App(Snapshot * snapshot);
|
||||||
|
|
||||||
|
FiguresController m_figuresController;
|
||||||
|
StackViewController m_stackViewController;
|
||||||
|
GraphController m_graphController;
|
||||||
|
AlternateEmptyViewController m_graphAlternateEmptyViewController;
|
||||||
|
StackViewController m_graphStackViewController;
|
||||||
|
ButtonRowController m_graphHeader;
|
||||||
|
OtherViewController m_otherViewController;
|
||||||
|
TabViewController m_tabViewController;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
6
apps/geometry/base.de.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.en.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.es.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.fr.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.hu.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.it.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.nl.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
6
apps/geometry/base.pt.i18n
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
GeometryApp = "Geometry"
|
||||||
|
GeometryAppCapital = "GEOMETRY"
|
||||||
|
AddFigure = "Ajouter une figure"
|
||||||
|
FigureType = "Type de figure"
|
||||||
|
DefinitionType = "Définition de la figure"
|
||||||
|
ParametersChoice = "Choix des paramètres"
|
||||||
24
apps/geometry/base.universal.i18n
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
FiguresTab = "Figures"
|
||||||
|
NoFigures = "Aucune figure à afficher"
|
||||||
|
OtherTab = "TODO"
|
||||||
|
Coordinates = "Coordonnées"
|
||||||
|
Middle = "Milieu"
|
||||||
|
VectorProject = "Projeté vectoriel"
|
||||||
|
OrthogonalProject = "Projeté orthogonal"
|
||||||
|
CartesianEquation = "Equation cartésienne"
|
||||||
|
LinearEquation = "Equation linéaire"
|
||||||
|
Points = "Points"
|
||||||
|
PointAndVector = "Point et vecteur"
|
||||||
|
Parallele = "Parallèle"
|
||||||
|
Perpendicular = "Perpendiculaire"
|
||||||
|
PointAndRadius = "Point et rayon"
|
||||||
|
Diameter = "Diamètre"
|
||||||
|
TwoPoints = "Deux points"
|
||||||
|
Segment = "Segment"
|
||||||
|
Angle = "Angle"
|
||||||
|
Area = "Surface"
|
||||||
|
Point = "Point"
|
||||||
|
Line = "Droite"
|
||||||
|
Circle = "Cercle"
|
||||||
|
Vector = "Vecteur"
|
||||||
|
Indicator = "Indicateur"
|
||||||
1
apps/geometry/figure_store.cpp
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#include "figure_store.h"
|
||||||
14
apps/geometry/figure_store.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#ifndef FIGURE__STORE__H
|
||||||
|
#define FIGURE__STORE__H
|
||||||
|
|
||||||
|
#include "../shared/expression_model_store.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class FigureStore: Shared::ExpressionModelStore {
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
27
apps/geometry/figures/figure.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef POINCARE_FIGURE_H
|
||||||
|
#define POINCARE_FIGURE_H
|
||||||
|
|
||||||
|
#include "figure_type.h"
|
||||||
|
|
||||||
|
using namespace Poincare;
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class FigureNode : public TreeNode {
|
||||||
|
public:
|
||||||
|
virtual size_t size() const override = 0;
|
||||||
|
|
||||||
|
virtual int numberOfChildren() const override { return 0; }
|
||||||
|
|
||||||
|
virtual FigureType type() const = 0;
|
||||||
|
virtual FigureDefinitionType definitionType() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Figure : public TreeHandle {
|
||||||
|
public:
|
||||||
|
Figure(const FigureNode * node) : TreeHandle(node) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
24
apps/geometry/figures/figure_type.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#ifndef GEOMETRY_FIGURE_TYPE_H
|
||||||
|
#define GEOMETRY_FIGURE_TYPE_H
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
enum class FigureType {
|
||||||
|
None = 0, // Used to trigger assert in debug mode
|
||||||
|
Expression, // It's not a real figure type but we use it to build figures like points
|
||||||
|
|
||||||
|
Point,
|
||||||
|
|
||||||
|
Line,
|
||||||
|
Circle,
|
||||||
|
Vector,
|
||||||
|
Indicator
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class FigureDefinitionType {
|
||||||
|
PointByCoordinates
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
6
apps/geometry/figures/figures.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef FIGURES_H
|
||||||
|
#define FIGURES_H
|
||||||
|
|
||||||
|
#include "point_by_coordinates.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
1
apps/geometry/figures/point.cpp
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#include "point.h"
|
||||||
18
apps/geometry/figures/point.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef GEOMETRY_POINT_H
|
||||||
|
#define GEOMETRY_POINT_H
|
||||||
|
|
||||||
|
#include "figure.h"
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class PointNode : public FigureNode {
|
||||||
|
virtual FigureType type() const override { return FigureType::Point; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class Point : public Figure {
|
||||||
|
public:
|
||||||
|
Point(const PointNode * n) : Figure(n) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
31
apps/geometry/figures/point_by_coordinates.h
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#ifndef POINT_BY_COORDINATES_H
|
||||||
|
#define POINT_BY_COORDINATES_H
|
||||||
|
|
||||||
|
#include <poincare/expression.h>
|
||||||
|
#include "point.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class PointByCoordinatesNode : public PointNode {
|
||||||
|
public:
|
||||||
|
virtual size_t size() const override { return sizeof(PointByCoordinatesNode); }
|
||||||
|
virtual int numberOfChildren() const override { return 2; }
|
||||||
|
virtual FigureDefinitionType definitionType() const override { return FigureDefinitionType::PointByCoordinates; }
|
||||||
|
#if POINCARE_TREE_LOG
|
||||||
|
void logNodeName(std::ostream & stream) const override {
|
||||||
|
stream << "PointByCoordinates";
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
class PointByCoordinates : public Figure {
|
||||||
|
public:
|
||||||
|
PointByCoordinates(const PointByCoordinatesNode * n) : Figure(n) {}
|
||||||
|
static PointByCoordinates Builder(Expression x, Expression y) { return TreeHandle::FixedArityBuilder<PointByCoordinates, PointByCoordinatesNode>({x, x}); }
|
||||||
|
static int numberOfParameters() { return 2; }
|
||||||
|
static FigureType parameterTypeAtIndex(int i) { return FigureType::Expression; }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
BIN
apps/geometry/geometry_icon.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
15
apps/geometry/graph/banner_view.cpp
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "banner_view.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
BannerView::BannerView(
|
||||||
|
Responder * parentResponder,
|
||||||
|
InputEventHandlerDelegate * inputEventHandlerDelegate,
|
||||||
|
TextFieldDelegate * textFieldDelegate
|
||||||
|
) :
|
||||||
|
Shared::XYBannerView(parentResponder, inputEventHandlerDelegate, textFieldDelegate)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
15
apps/geometry/graph/banner_view.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef GEOMETRY_BANNER_VIEW_H
|
||||||
|
#define GEOMETRY_BANNER_VIEW_H
|
||||||
|
|
||||||
|
#include "../../shared/xy_banner_view.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class BannerView : public Shared::XYBannerView {
|
||||||
|
public:
|
||||||
|
BannerView(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, TextFieldDelegate * textFieldDelegate);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
11
apps/geometry/graph/graph_controller.cpp
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include "graph_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
GraphController::GraphController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header, Shared::InteractiveCurveViewRange/*TODO -> Store*/ * store, Shared::CurveViewCursor * cursor, uint32_t * rangeVersion) :
|
||||||
|
InteractiveCurveViewController(parentResponder, inputEventHandlerDelegate, header, store, nullptr, cursor, rangeVersion)
|
||||||
|
{
|
||||||
|
/* WHEREIWAS: Now i must make the app launch again without crash, by replacing the multiples nullptr that I used... */
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
33
apps/geometry/graph/graph_controller.h
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef GRAPH_VIEW_CONTROLLER_H
|
||||||
|
#define GRAPH_VIEW_CONTROLLER_H
|
||||||
|
|
||||||
|
#include "../shared/interactive_curve_view_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class GraphController : public Shared::InteractiveCurveViewController {
|
||||||
|
public:
|
||||||
|
GraphController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, ButtonRowController * header, Shared::InteractiveCurveViewRange * store, Shared::CurveViewCursor * cursor, uint32_t * rangeVersion);
|
||||||
|
|
||||||
|
virtual Shared::InteractiveCurveViewRange * interactiveCurveViewRange() override { return nullptr; } //TOIMPLEMENT
|
||||||
|
virtual Shared::CurveView * curveView() override { return nullptr; } //TOIMPLEMENT
|
||||||
|
virtual void reloadBannerView() override { } //TOIMPLEMENT
|
||||||
|
virtual bool handleEnter() override { return false; } //TOIMPLEMENT
|
||||||
|
virtual void initCursorParameters() override { } //TOIMPLEMENT
|
||||||
|
virtual bool moveCursorVertically(int direction) override { return false; } //TOIMPLEMENT
|
||||||
|
virtual uint32_t rangeVersion() override { return 0; } //TOIMPLEMENT
|
||||||
|
virtual bool cursorMatchesModel() override { return false; } //TOIMPLEMENT
|
||||||
|
virtual Poincare::Coordinate2D<double> xyValues(int curveIndex, double t, Poincare::Context * context) const override { return Poincare::Coordinate2D<double>(0, 0); } //TOIMPLEMENT
|
||||||
|
virtual bool closestCurveIndexIsSuitable(int newIndex, int currentIndex) const override { return false; }
|
||||||
|
virtual int selectedCurveIndex() const override { return 0; }
|
||||||
|
virtual int numberOfCurves() const override { return 0; }
|
||||||
|
|
||||||
|
/* AlternateEmptyViewDefaultDelegate */
|
||||||
|
virtual bool isEmpty() const override { return false; }
|
||||||
|
virtual I18n::Message emptyMessage() override { return I18n::Message::NoFigures; }
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
147
apps/geometry/list/definition_type_controller.cpp
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
#include "figure_type_controller.h"
|
||||||
|
#include "../figures/figures.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
static constexpr I18n::Message sPointDefinitionsMessages[] = {
|
||||||
|
I18n::Message::Coordinates,
|
||||||
|
I18n::Message::Middle,
|
||||||
|
I18n::Message::VectorProject,
|
||||||
|
I18n::Message::OrthogonalProject
|
||||||
|
};
|
||||||
|
static const uint8_t sPointDefinitionsMessagesCount = sizeof(sPointDefinitionsMessages) / sizeof(I18n::Message);
|
||||||
|
|
||||||
|
|
||||||
|
static constexpr I18n::Message sLineDefinitionMessages[] = {
|
||||||
|
I18n::Message::CartesianEquation,
|
||||||
|
I18n::Message::LinearEquation,
|
||||||
|
I18n::Message::Points,
|
||||||
|
I18n::Message::PointAndVector,
|
||||||
|
I18n::Message::Parallele,
|
||||||
|
I18n::Message::Perpendicular
|
||||||
|
};
|
||||||
|
static const uint8_t sLineDefinitionsMessagesCount = sizeof(sLineDefinitionMessages) / sizeof(I18n::Message);
|
||||||
|
|
||||||
|
|
||||||
|
static constexpr I18n::Message sCircleDefinitionsMessages[] = {
|
||||||
|
I18n::Message::PointAndRadius,
|
||||||
|
I18n::Message::Diameter,
|
||||||
|
I18n::Message::CartesianEquation,
|
||||||
|
};
|
||||||
|
static const uint8_t sCircleDefinitionsMessagesCount = sizeof(sCircleDefinitionsMessages) / sizeof(I18n::Message);
|
||||||
|
|
||||||
|
|
||||||
|
static constexpr I18n::Message sVectorDefinitionsMessages[] = {
|
||||||
|
I18n::Message::Coordinates,
|
||||||
|
I18n::Message::TwoPoints
|
||||||
|
};
|
||||||
|
static const uint8_t sVectorDefinitionsMessagesCount = sizeof(sVectorDefinitionsMessages) / sizeof(I18n::Message);
|
||||||
|
|
||||||
|
|
||||||
|
static constexpr I18n::Message sIndicatorDefinitionsMessages[] = {
|
||||||
|
I18n::Message::Segment,
|
||||||
|
I18n::Message::Angle,
|
||||||
|
I18n::Message::Area,
|
||||||
|
};
|
||||||
|
static const uint8_t sIndicatorDefinitionsMessagesCount = sizeof(sIndicatorDefinitionsMessages) / sizeof(I18n::Message);
|
||||||
|
|
||||||
|
|
||||||
|
DefinitionTypeController::DefinitionTypeController(Responder * parentResponder, FigureParametersController * parametersController):
|
||||||
|
ViewController(parentResponder),
|
||||||
|
m_lastSelectedRow(0),
|
||||||
|
m_selectableTableView(this),
|
||||||
|
m_messages(nullptr),
|
||||||
|
m_figureType(FigureType::None),
|
||||||
|
m_parametersController(parametersController)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < k_numberOfCells; i ++) {
|
||||||
|
m_cells[i].setMessageFont(KDFont::LargeFont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefinitionTypeController::viewWillAppear() {
|
||||||
|
assert(m_figureType != FigureType::None && m_messages != nullptr);
|
||||||
|
selectRow(m_lastSelectedRow);
|
||||||
|
m_selectableTableView.reloadData(); // We reload the cell of the table view to update their message
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefinitionTypeController::didBecomeFirstResponder() {
|
||||||
|
//App::app()->snapshot()->setActivePage(App::Snapshot::Page::Distribution);
|
||||||
|
Container::activeApp()->setFirstResponder(&m_selectableTableView);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DefinitionTypeController::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
|
||||||
|
m_lastSelectedRow = selectedRow();
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
m_parametersController->setParametersInfoFunctions(PointByCoordinates::numberOfParameters, PointByCoordinates::parameterTypeAtIndex);
|
||||||
|
stack->push(m_parametersController);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (event == Ion::Events::Back) {
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
stack->pop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * DefinitionTypeController::reusableCell(int index) {
|
||||||
|
assert(index >= 0);
|
||||||
|
assert(index < k_numberOfCells);
|
||||||
|
return &m_cells[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefinitionTypeController::willDisplayCellForIndex(HighlightCell * cell, int index) {
|
||||||
|
MessageTableCellWithChevron * myCell = (MessageTableCellWithChevron *)cell;
|
||||||
|
myCell->setMessage(m_messages[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DefinitionTypeController::numberOfRows() const {
|
||||||
|
switch (m_figureType) {
|
||||||
|
case FigureType::Point:
|
||||||
|
return sPointDefinitionsMessagesCount;
|
||||||
|
break;
|
||||||
|
case FigureType::Line:
|
||||||
|
return sLineDefinitionsMessagesCount;
|
||||||
|
break;
|
||||||
|
case FigureType::Circle:
|
||||||
|
return sCircleDefinitionsMessagesCount;
|
||||||
|
break;
|
||||||
|
case FigureType::Vector:
|
||||||
|
return sVectorDefinitionsMessagesCount;
|
||||||
|
break;
|
||||||
|
case FigureType::Indicator:
|
||||||
|
return sIndicatorDefinitionsMessagesCount;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefinitionTypeController::setFigureType(FigureType figureType) {
|
||||||
|
m_figureType = figureType;
|
||||||
|
switch (m_figureType) {
|
||||||
|
case FigureType::Point:
|
||||||
|
m_messages = sPointDefinitionsMessages;
|
||||||
|
break;
|
||||||
|
case FigureType::Line:
|
||||||
|
m_messages = sLineDefinitionMessages;
|
||||||
|
break;
|
||||||
|
case FigureType::Circle:
|
||||||
|
m_messages = sCircleDefinitionsMessages;
|
||||||
|
break;
|
||||||
|
case FigureType::Vector:
|
||||||
|
m_messages = sVectorDefinitionsMessages;
|
||||||
|
break;
|
||||||
|
case FigureType::Indicator:
|
||||||
|
m_messages = sIndicatorDefinitionsMessages;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
53
apps/geometry/list/definition_type_controller.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
#ifndef GEOMETRY_DEFINITION_TYPE_CONTROLLER_H
|
||||||
|
#define GEOMETRY_DEFINITION_TYPE_CONTROLLER_H
|
||||||
|
|
||||||
|
#include <escher.h>
|
||||||
|
#include "apps/i18n.h"
|
||||||
|
#include "../figures/figure_type.h"
|
||||||
|
#include "figure_parameters_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
/**
|
||||||
|
* \brief DefinitionTypeController is a controller to choose how the figure is defined
|
||||||
|
*/
|
||||||
|
class DefinitionTypeController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource {
|
||||||
|
public:
|
||||||
|
DefinitionTypeController(Responder * parentResponder, FigureParametersController * parametersController);
|
||||||
|
|
||||||
|
/* ViewController */
|
||||||
|
View * view() override { return &m_selectableTableView; }
|
||||||
|
// We want to avoid using half of the screen just for titles
|
||||||
|
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
|
||||||
|
const char * title() override { return I18n::translate(I18n::Message::DefinitionType); }
|
||||||
|
|
||||||
|
/* Responder */
|
||||||
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
|
|
||||||
|
/* ViewController */
|
||||||
|
void didBecomeFirstResponder() override;
|
||||||
|
void viewWillAppear() override;
|
||||||
|
TELEMETRY_ID("FigureType");
|
||||||
|
|
||||||
|
/* SelectableTableViewDataSource */
|
||||||
|
int numberOfRows() const override;
|
||||||
|
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
||||||
|
KDCoordinate cellHeight() override { return k_cellHeight; }
|
||||||
|
HighlightCell * reusableCell(int index) override;
|
||||||
|
int reusableCellCount() const override { return k_numberOfCells; }
|
||||||
|
|
||||||
|
/* Customs methods */
|
||||||
|
void setFigureType(FigureType type);
|
||||||
|
private:
|
||||||
|
constexpr static KDCoordinate k_cellHeight = Metric::ParameterCellHeight;
|
||||||
|
constexpr static int k_numberOfCells = 6;
|
||||||
|
int m_lastSelectedRow;
|
||||||
|
MessageTableCellWithChevron m_cells[k_numberOfCells];
|
||||||
|
SelectableTableView m_selectableTableView;
|
||||||
|
const I18n::Message * m_messages;
|
||||||
|
FigureType m_figureType;
|
||||||
|
FigureParametersController * m_parametersController;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
114
apps/geometry/list/figure_parameters_controller.cpp
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
#include "figure_parameters_controller.h"
|
||||||
|
#include "../app.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
FigureParametersController::FigureParametersController(Responder * parentResponder):
|
||||||
|
ViewController(parentResponder),
|
||||||
|
m_lastSelectedRow(0),
|
||||||
|
m_selectableTableView(this),
|
||||||
|
m_okButton(&m_selectableTableView, I18n::Message::Ok, Invocation([](void * context, void * sender) {
|
||||||
|
FigureParametersController * parameterController = (FigureParametersController *) context;
|
||||||
|
parameterController->returnToMenu();
|
||||||
|
return true;
|
||||||
|
}, this))
|
||||||
|
{
|
||||||
|
for (int i = 0; i < k_choiceCells; i++) {
|
||||||
|
m_choicesCells[i].setParentResponder(&m_selectableTableView);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < k_textCells; i++) {
|
||||||
|
m_textCells[i].setParentResponder(&m_selectableTableView);
|
||||||
|
m_textCells[i].textField()->setDelegates(this, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FigureParametersController::setParametersInfoFunctions(NumberOfParametersFunction numberOfParametersFunction, TypeOfParametersAtIndexFunction typeOfParametersAtIndexFunction) {
|
||||||
|
m_numberOfParametersFunction = numberOfParametersFunction;
|
||||||
|
m_typeOfParametersAtIndexFunction = typeOfParametersAtIndexFunction;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureParametersController::didBecomeFirstResponder() {
|
||||||
|
Container::activeApp()->setFirstResponder(&m_selectableTableView);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureParametersController::viewWillAppear() {
|
||||||
|
selectRow(m_lastSelectedRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureParametersController::returnToMenu() {
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
stack->pop();
|
||||||
|
stack->pop();
|
||||||
|
stack->pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ListViewDataSource */
|
||||||
|
int FigureParametersController::typeAtLocation(int i, int j) {
|
||||||
|
if (j == m_numberOfParametersFunction()) {
|
||||||
|
return 0; // It's equivalent to "None", so we can use it for button cell
|
||||||
|
}
|
||||||
|
return (int) m_typeOfParametersAtIndexFunction(j);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FigureParametersController::reusableCellCount(int type) {
|
||||||
|
if (type == 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return type == (int) FigureType::Expression ? k_textCells: k_choiceCells;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * FigureParametersController::reusableCell(int index, int type) {
|
||||||
|
if (type == 0) {
|
||||||
|
return &m_okButton;
|
||||||
|
}
|
||||||
|
if (type == (int) FigureType::Expression) {
|
||||||
|
return &m_textCells[index];
|
||||||
|
}
|
||||||
|
return &m_choicesCells[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
int FigureParametersController::numberOfRows() const {
|
||||||
|
return m_numberOfParametersFunction() + 1;
|
||||||
|
}
|
||||||
|
KDCoordinate FigureParametersController::rowHeight(int j) {
|
||||||
|
if (j == numberOfRows()-1) {
|
||||||
|
return Metric::ParameterCellHeight+k_buttonMargin;
|
||||||
|
}
|
||||||
|
return Metric::ParameterCellHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
KDCoordinate FigureParametersController::cumulatedHeightFromIndex(int j) {
|
||||||
|
if (j == numberOfRows()) {
|
||||||
|
return j*Metric::ParameterCellHeight+k_buttonMargin;
|
||||||
|
}
|
||||||
|
return Metric::ParameterCellHeight*j;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FigureParametersController::indexFromCumulatedHeight(KDCoordinate offsetY) {
|
||||||
|
return (offsetY - 1) / Metric::ParameterCellHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureParametersController::willDisplayCellForIndex(HighlightCell * cell, int index) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FigureParametersController::textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) {
|
||||||
|
return (event == Ion::Events::Down && selectedRow() < numberOfRows()-1)
|
||||||
|
|| (event == Ion::Events::Up && selectedRow() > 0)
|
||||||
|
|| TextFieldDelegate::textFieldShouldFinishEditing(textField, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FigureParametersController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) {
|
||||||
|
m_selectableTableView.reloadCellAtLocation(0, selectedRow());
|
||||||
|
m_selectableTableView.reloadData();
|
||||||
|
textField->setText(text);
|
||||||
|
if (event == Ion::Events::EXE || event == Ion::Events::OK) {
|
||||||
|
m_selectableTableView.selectCellAtLocation(selectedColumn(), selectedRow() + 1);
|
||||||
|
} else {
|
||||||
|
m_selectableTableView.handleEvent(event);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
64
apps/geometry/list/figure_parameters_controller.h
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
#ifndef GEOMETRY_FIGURE_PARAMETERS_CONTROLLER_H
|
||||||
|
#define GEOMETRY_FIGURE_PARAMETERS_CONTROLLER_H
|
||||||
|
|
||||||
|
#include <escher.h>
|
||||||
|
#include "apps/i18n.h"
|
||||||
|
#include "message_table_cell_with_selector.h"
|
||||||
|
#include "../figures/figure.h"
|
||||||
|
#include "../../shared/parameter_text_field_delegate.h"
|
||||||
|
#include "../../shared/input_event_handler_delegate.h"
|
||||||
|
#include "../../shared/button_with_separator.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
typedef int (*NumberOfParametersFunction)();
|
||||||
|
typedef FigureType (*TypeOfParametersAtIndexFunction)(int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Controller returning the parameter choosen by the user to define the figure
|
||||||
|
*/
|
||||||
|
class FigureParametersController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource, public Shared::ParameterTextFieldDelegate, public Shared::InputEventHandlerDelegate {
|
||||||
|
public:
|
||||||
|
FigureParametersController(Responder * parentResponder);
|
||||||
|
void setParametersInfoFunctions(NumberOfParametersFunction numberOfParametersFunction, TypeOfParametersAtIndexFunction typeOfParametersAtIndexFunction);
|
||||||
|
void returnToMenu();
|
||||||
|
/* ViewController */
|
||||||
|
const char * title() override { return I18n::translate(I18n::Message::ParametersChoice); }
|
||||||
|
// We want to avoid using half of the screen just for titles
|
||||||
|
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
|
||||||
|
View * view() override { return &m_selectableTableView; };
|
||||||
|
|
||||||
|
/* Responder */
|
||||||
|
void didBecomeFirstResponder() override;
|
||||||
|
void viewWillAppear() override;
|
||||||
|
|
||||||
|
/* ListViewDataSource */
|
||||||
|
int typeAtLocation(int i, int j) override;
|
||||||
|
int reusableCellCount(int type) override; // TO IMPLEMENT
|
||||||
|
HighlightCell * reusableCell(int index, int type) override;
|
||||||
|
int numberOfRows() const override;
|
||||||
|
KDCoordinate rowHeight(int j) override;
|
||||||
|
KDCoordinate cumulatedHeightFromIndex(int j) override;
|
||||||
|
int indexFromCumulatedHeight(KDCoordinate offsetY) override;
|
||||||
|
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
||||||
|
|
||||||
|
/* InputEventHandlerDelegate */
|
||||||
|
bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override;
|
||||||
|
bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SelectableTableView m_selectableTableView;
|
||||||
|
constexpr static int k_textCells = 2;
|
||||||
|
constexpr static int k_choiceCells = 3;
|
||||||
|
constexpr static int k_buttonMargin = 6;
|
||||||
|
int m_lastSelectedRow;
|
||||||
|
MessageTableCellWithEditableText m_textCells[k_textCells];
|
||||||
|
MessageTableCellWithSelector m_choicesCells[k_choiceCells];
|
||||||
|
ButtonWithSeparator m_okButton;
|
||||||
|
NumberOfParametersFunction m_numberOfParametersFunction;
|
||||||
|
TypeOfParametersAtIndexFunction m_typeOfParametersAtIndexFunction;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
70
apps/geometry/list/figure_type_controller.cpp
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#include "figure_type_controller.h"
|
||||||
|
#include "apps/i18n.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
static FigureType sTypes[] = {
|
||||||
|
FigureType::Point,
|
||||||
|
FigureType::Line,
|
||||||
|
FigureType::Circle,
|
||||||
|
FigureType::Vector,
|
||||||
|
FigureType::Indicator
|
||||||
|
};
|
||||||
|
|
||||||
|
static I18n::Message sMessages[] = {
|
||||||
|
I18n::Message::Point,
|
||||||
|
I18n::Message::Line,
|
||||||
|
I18n::Message::Circle,
|
||||||
|
I18n::Message::Vector,
|
||||||
|
I18n::Message::Indicator
|
||||||
|
};
|
||||||
|
|
||||||
|
FigureTypeController::FigureTypeController(Responder * parentResponder, DefinitionTypeController * definitionTypeController) :
|
||||||
|
ViewController(parentResponder),
|
||||||
|
m_lastSelectedRow(0),
|
||||||
|
m_selectableTableView(this),
|
||||||
|
m_definitionTypeController(definitionTypeController),
|
||||||
|
m_messages(sMessages)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < k_numberOfCells; i ++) {
|
||||||
|
m_cells[i].setMessageFont(KDFont::LargeFont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureTypeController::viewWillAppear() {
|
||||||
|
selectRow(m_lastSelectedRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureTypeController::didBecomeFirstResponder() {
|
||||||
|
//App::app()->snapshot()->setActivePage(App::Snapshot::Page::Distribution);
|
||||||
|
Container::activeApp()->setFirstResponder(&m_selectableTableView);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FigureTypeController::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
|
||||||
|
m_lastSelectedRow = selectedRow();
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
m_definitionTypeController->setFigureType(sTypes[selectedRow()]);
|
||||||
|
stack->push(m_definitionTypeController);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (event == Ion::Events::Back ) {
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
stack->pop();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * FigureTypeController::reusableCell(int index) {
|
||||||
|
assert(index >= 0);
|
||||||
|
assert(index < k_numberOfCells);
|
||||||
|
return &m_cells[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
void FigureTypeController::willDisplayCellForIndex(HighlightCell * cell, int index) {
|
||||||
|
MessageTableCellWithChevron * myCell = (MessageTableCellWithChevron *)cell;
|
||||||
|
myCell->setMessage(m_messages[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
49
apps/geometry/list/figure_type_controller.h
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#ifndef GEOMETRY_FIGURE_TYPE_CONTROLLER_H
|
||||||
|
#define GEOMETRY_FIGURE_TYPE_CONTROLLER_H
|
||||||
|
|
||||||
|
#include <escher.h>
|
||||||
|
#include "definition_type_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
/**
|
||||||
|
* \brief FigureTypeController is a controller that is used to select the type of
|
||||||
|
* figure to be created.
|
||||||
|
*/
|
||||||
|
class FigureTypeController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource {
|
||||||
|
public:
|
||||||
|
FigureTypeController(Responder * parentResponder, DefinitionTypeController * definitionController);
|
||||||
|
|
||||||
|
/* ViewController */
|
||||||
|
View * view() override { return &m_selectableTableView; }
|
||||||
|
// We want to avoid using half of the screen just for titles
|
||||||
|
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
|
||||||
|
const char * title() override { return I18n::translate(I18n::Message::FigureType); }
|
||||||
|
|
||||||
|
/* Responder */
|
||||||
|
bool handleEvent(Ion::Events::Event event) override;
|
||||||
|
void didBecomeFirstResponder() override;
|
||||||
|
|
||||||
|
/* ViewController */
|
||||||
|
void viewWillAppear() override;
|
||||||
|
TELEMETRY_ID("FigureType");
|
||||||
|
|
||||||
|
/* TableViewDataSource */
|
||||||
|
int numberOfRows() const override { return k_numberOfRows; }
|
||||||
|
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
||||||
|
KDCoordinate cellHeight() override { return k_cellHeight; }
|
||||||
|
HighlightCell * reusableCell(int index) override;
|
||||||
|
int reusableCellCount() const override { return k_numberOfCells; }
|
||||||
|
private:
|
||||||
|
constexpr static KDCoordinate k_cellHeight = Metric::ParameterCellHeight;
|
||||||
|
constexpr static int k_numberOfCells = 5;
|
||||||
|
constexpr static int k_numberOfRows = 5;
|
||||||
|
int m_lastSelectedRow;
|
||||||
|
MessageTableCellWithChevron m_cells[k_numberOfCells];
|
||||||
|
SelectableTableView m_selectableTableView;
|
||||||
|
DefinitionTypeController * m_definitionTypeController;
|
||||||
|
I18n::Message * m_messages;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
77
apps/geometry/list/figures_controller.cpp
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#include "figures_controller.h"
|
||||||
|
#include "definition_type_controller.h"
|
||||||
|
#include <apps/i18n.h>
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
FiguresController::FiguresController(Responder * parentResponder):
|
||||||
|
ViewController(parentResponder),
|
||||||
|
m_selectableTableView(this, this, this, this),
|
||||||
|
m_addFigureCell(),
|
||||||
|
m_emptyCell(),
|
||||||
|
m_figureTypeController(this, &m_definitionTypeController),
|
||||||
|
m_definitionTypeController(&m_figureTypeController, &m_parametersController),
|
||||||
|
m_parametersController(&m_definitionTypeController)
|
||||||
|
{
|
||||||
|
m_addFigureCell.setMessage(I18n::Message::AddFigure);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FiguresController::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
|
||||||
|
if (isAddFigureRow(selectedRow())) {
|
||||||
|
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
|
||||||
|
stack->push(&m_figureTypeController);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (event == Ion::Events::Up && selectedRow() == 0) {
|
||||||
|
m_selectableTableView.deselectTable();
|
||||||
|
assert(selectedRow() == -1);
|
||||||
|
Container::activeApp()->setFirstResponder(parentResponder()->parentResponder());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FiguresController::didBecomeFirstResponder() {
|
||||||
|
Container::activeApp()->setFirstResponder(&m_selectableTableView);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HighlightCell * FiguresController::reusableCell(int index, int type) {
|
||||||
|
assert(index >= 0);
|
||||||
|
if (type == 2) {
|
||||||
|
return &m_emptyCell;
|
||||||
|
}
|
||||||
|
return &m_addFigureCell;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FiguresController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
|
||||||
|
if (i == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EvenOddCell * myCell = (EvenOddCell *)cell;
|
||||||
|
myCell->setEven(j%2 == 0);
|
||||||
|
myCell->setHighlighted(i == selectedColumn() && j == selectedRow());
|
||||||
|
myCell->reloadCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FiguresController::isAddFigureRow(int j) {
|
||||||
|
return j == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FiguresController::reusableCellCount(int type) {
|
||||||
|
if (type > 1) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int FiguresController::typeAtLocation(int i, int j) {
|
||||||
|
if (isAddFigureRow(j)) {
|
||||||
|
return i + 2;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
47
apps/geometry/list/figures_controller.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#ifndef FIGURES_CONTROLLER_H
|
||||||
|
#define FIGURES_CONTROLLER_H
|
||||||
|
|
||||||
|
#include <escher.h>
|
||||||
|
#include "figure_type_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* \brief FiguresController is a controller to show the list of the figures
|
||||||
|
*/
|
||||||
|
class FiguresController : public ViewController, public SelectableTableViewDataSource, public SelectableTableViewDelegate, public TableViewDataSource {
|
||||||
|
public:
|
||||||
|
FiguresController(Responder * parentResponder);
|
||||||
|
|
||||||
|
/* ViewController */
|
||||||
|
View * view() override { return &m_selectableTableView; }
|
||||||
|
const char * title() override { return I18n::translate(I18n::Message::FiguresTab); }
|
||||||
|
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
|
||||||
|
/* Responder */
|
||||||
|
bool handleEvent(Ion::Events::Event event) override; // TO IMPLEMENT
|
||||||
|
void didBecomeFirstResponder() override;
|
||||||
|
|
||||||
|
/* TableView */
|
||||||
|
int numberOfRows() const override { return 1; } // TO IMPLEMENT
|
||||||
|
int numberOfColumns() const override { return 2; } // TO IMPLEMENT
|
||||||
|
KDCoordinate columnWidth(int i) { return i == 0 ? 50 : 150; } // TO IMPLEMENT
|
||||||
|
KDCoordinate rowHeight(int j) { return 50; } // TO IMPLEMENT
|
||||||
|
HighlightCell * reusableCell(int index, int type); // TO IMPLEMENT
|
||||||
|
void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; // TO IMPLEMENT
|
||||||
|
int reusableCellCount(int type);
|
||||||
|
int typeAtLocation(int i, int j); // TO IMPLEMENT
|
||||||
|
|
||||||
|
private:
|
||||||
|
/* Customs methods */
|
||||||
|
bool isAddFigureRow(int j); // TO IMPLEMENT
|
||||||
|
|
||||||
|
SelectableTableView m_selectableTableView;
|
||||||
|
EvenOddMessageTextCell m_addFigureCell;
|
||||||
|
EvenOddCell m_emptyCell;
|
||||||
|
FigureTypeController m_figureTypeController;
|
||||||
|
DefinitionTypeController m_definitionTypeController;
|
||||||
|
FigureParametersController m_parametersController;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
24
apps/geometry/list/message_table_cell_with_selector.cpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#include "message_table_cell_with_selector.h"
|
||||||
|
#include <escher/container.h>
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
MessageTableCellWithSelector::MessageTableCellWithSelector(ToolboxMessageTree * root, const KDFont * font) :
|
||||||
|
Responder(nullptr),
|
||||||
|
MessageTableCell((I18n::Message)0, font),
|
||||||
|
m_objectsRoot(root),
|
||||||
|
m_selectedMessage(nullptr),
|
||||||
|
m_toolbox(this)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MessageTableCellWithSelector::handleEvent(Ion::Events::Event event) {
|
||||||
|
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
|
||||||
|
Container::activeApp()->displayModalViewController(&m_toolbox, 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
26
apps/geometry/list/message_table_cell_with_selector.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#ifndef ESHER_MESSAGE_TABLE_CELL_WITH_OBJECT_SELECTOR_H_
|
||||||
|
#define ESHER_MESSAGE_TABLE_CELL_WITH_OBJECT_SELECTOR_H_
|
||||||
|
|
||||||
|
#include <escher/message_table_cell_with_buffer.h>
|
||||||
|
#include <escher/toolbox_message_tree.h>
|
||||||
|
#include "objects_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class MessageTableCellWithSelector : public Responder, public MessageTableCell {
|
||||||
|
public:
|
||||||
|
MessageTableCellWithSelector(ToolboxMessageTree * root = nullptr, const KDFont * font = KDFont::SmallFont);
|
||||||
|
ToolboxMessageTree * getSelectedMessage() const { return m_selectedMessage; };
|
||||||
|
bool handleEvent(Ion::Events::Event event);
|
||||||
|
Responder * responder() override {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
ToolboxMessageTree * m_objectsRoot;
|
||||||
|
ToolboxMessageTree * m_selectedMessage;
|
||||||
|
ObjectsController m_toolbox;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
35
apps/geometry/list/objects_controller.cpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#include "objects_controller.h"
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
ObjectsController::ObjectsController(Responder * responder) :
|
||||||
|
NestedMenuController(this)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObjectsController::numberOfRows() const {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObjectsController::reusableCellCount(int type) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObjectsController::typeAtLocation(int i, int j) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ObjectsController::selectLeaf(int type) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * ObjectsController::leafCellAtIndex(int index) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HighlightCell * ObjectsController::nodeCellAtIndex(int index) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
21
apps/geometry/list/objects_controller.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef GEOMETRY_OBJECTS_CONTROLLER_H
|
||||||
|
#define GEOMETRY_OBJECTS_CONTROLLER_H
|
||||||
|
|
||||||
|
#include <escher/nested_menu_controller.h>
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class ObjectsController : public NestedMenuController {
|
||||||
|
public:
|
||||||
|
ObjectsController(Responder * parentResponder);
|
||||||
|
virtual int numberOfRows() const override;
|
||||||
|
virtual int reusableCellCount(int type) override;
|
||||||
|
virtual int typeAtLocation(int i, int j) override;
|
||||||
|
virtual bool selectLeaf(int selectedRow) override;
|
||||||
|
virtual HighlightCell * leafCellAtIndex(int index) override;
|
||||||
|
virtual HighlightCell * nodeCellAtIndex(int index) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
16
apps/geometry/other/other_view_controller.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef OTHER_VIEW_CONTROLLER_H
|
||||||
|
#define OTHER_VIEW_CONTROLLER_H
|
||||||
|
|
||||||
|
namespace Geometry {
|
||||||
|
|
||||||
|
class OtherViewController : public ViewController {
|
||||||
|
public:
|
||||||
|
OtherViewController(Responder * parentResponder):
|
||||||
|
ViewController(parentResponder) {}
|
||||||
|
View * view() override { return nullptr; }
|
||||||
|
const char * title() override { return I18n::translate(I18n::Message::OtherTab); }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
Default,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,reader,settings
|
Default,geometry,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,reader,settings
|
||||||
HidePython,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,reader,settings
|
HidePython,geometry,calculation,rpn,graph,code,statistics,probability,solver,atomic,sequence,regression,reader,settings
|
||||||
|
|||||||
|
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
MathVariableBoxEmptyController::MathVariableBoxEmptyView::MathVariableBoxEmptyView() :
|
MathVariableBoxEmptyController::MathVariableBoxEmptyView::MathVariableBoxEmptyView() :
|
||||||
ModalViewEmptyView(),
|
ModalViewEmptyView(),
|
||||||
m_layoutExample(0.5f, 0.5f, KDColorBlack, Palette::WallScreen)
|
m_layoutExample(0.5f, 0.5f, Palette::PrimaryText, Palette::WallScreen)
|
||||||
{
|
{
|
||||||
initMessageViews();
|
initMessageViews();
|
||||||
}
|
}
|
||||||
|
|||||||
2
apps/rpn
@@ -21,7 +21,9 @@ constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(
|
|||||||
constexpr SettingsMessageTree s_contributorsChildren[23] = {SettingsMessageTree(I18n::Message::Developers), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::SandraSimmons), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::CharlotteThomas), SettingsMessageTree(I18n::Message::AntoninLoubiere), SettingsMessageTree(I18n::Message::CyprienMejat), SettingsMessageTree(I18n::Message::BetaTesters), SettingsMessageTree(I18n::Message::TimeoArnouts), SettingsMessageTree(I18n::Message::JulieC), SettingsMessageTree(I18n::Message::LelahelHideux), SettingsMessageTree(I18n::Message::Madil), SettingsMessageTree(I18n::Message::HilaireLeRoux), SettingsMessageTree(I18n::Message::HectorNussbaumer), SettingsMessageTree(I18n::Message::RaphaelDyda), SettingsMessageTree(I18n::Message::ThibautC)};
|
constexpr SettingsMessageTree s_contributorsChildren[23] = {SettingsMessageTree(I18n::Message::Developers), SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::MaximeFriess), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::SandraSimmons), SettingsMessageTree(I18n::Message::David), SettingsMessageTree(I18n::Message::DamienNicolet), SettingsMessageTree(I18n::Message::EvannDreumont), SettingsMessageTree(I18n::Message::SzaboLevente), SettingsMessageTree(I18n::Message::VenceslasDuet), SettingsMessageTree(I18n::Message::CharlotteThomas), SettingsMessageTree(I18n::Message::AntoninLoubiere), SettingsMessageTree(I18n::Message::CyprienMejat), SettingsMessageTree(I18n::Message::BetaTesters), SettingsMessageTree(I18n::Message::TimeoArnouts), SettingsMessageTree(I18n::Message::JulieC), SettingsMessageTree(I18n::Message::LelahelHideux), SettingsMessageTree(I18n::Message::Madil), SettingsMessageTree(I18n::Message::HilaireLeRoux), SettingsMessageTree(I18n::Message::HectorNussbaumer), SettingsMessageTree(I18n::Message::RaphaelDyda), SettingsMessageTree(I18n::Message::ThibautC)};
|
||||||
|
|
||||||
// Code Settings
|
// Code Settings
|
||||||
|
#ifdef HAS_CODE
|
||||||
constexpr SettingsMessageTree s_codeChildren[2] = {SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren), SettingsMessageTree(I18n::Message::Autocomplete)};
|
constexpr SettingsMessageTree s_codeChildren[2] = {SettingsMessageTree(I18n::Message::FontSizes, s_modelFontChildren), SettingsMessageTree(I18n::Message::Autocomplete)};
|
||||||
|
#endif
|
||||||
constexpr SettingsMessageTree s_modelFontChildren[2] = {SettingsMessageTree(I18n::Message::LargeFont), SettingsMessageTree(I18n::Message::SmallFont)};
|
constexpr SettingsMessageTree s_modelFontChildren[2] = {SettingsMessageTree(I18n::Message::LargeFont), SettingsMessageTree(I18n::Message::SmallFont)};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ constexpr SettingsMessageTree s_modelMenu[] =
|
|||||||
SettingsMessageTree(I18n::Message::Language),
|
SettingsMessageTree(I18n::Message::Language),
|
||||||
SettingsMessageTree(I18n::Message::Country),
|
SettingsMessageTree(I18n::Message::Country),
|
||||||
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
||||||
|
#ifdef HAS_CODE
|
||||||
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
||||||
|
#endif
|
||||||
SettingsMessageTree(I18n::Message::BetaPopUp),
|
SettingsMessageTree(I18n::Message::BetaPopUp),
|
||||||
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren),
|
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren),
|
||||||
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren)};
|
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren)};
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ constexpr SettingsMessageTree s_modelMenu[] =
|
|||||||
SettingsMessageTree(I18n::Message::Language),
|
SettingsMessageTree(I18n::Message::Language),
|
||||||
SettingsMessageTree(I18n::Message::Country),
|
SettingsMessageTree(I18n::Message::Country),
|
||||||
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
||||||
|
#ifdef HAS_CODE
|
||||||
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
||||||
|
#endif
|
||||||
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
|
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
|
||||||
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};
|
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};
|
||||||
|
|
||||||
|
|||||||
@@ -13,8 +13,9 @@ constexpr SettingsMessageTree s_modelMenu[] =
|
|||||||
SettingsMessageTree(I18n::Message::Language),
|
SettingsMessageTree(I18n::Message::Language),
|
||||||
SettingsMessageTree(I18n::Message::Country),
|
SettingsMessageTree(I18n::Message::Country),
|
||||||
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
SettingsMessageTree(I18n::Message::ExamMode, ExamModeConfiguration::s_modelExamChildren),
|
||||||
|
#ifdef HAS_CODE
|
||||||
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
SettingsMessageTree(I18n::Message::CodeApp, s_codeChildren),
|
||||||
SettingsMessageTree(I18n::Message::UpdatePopUp),
|
#endif SettingsMessageTree(I18n::Message::UpdatePopUp),
|
||||||
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
|
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren),
|
||||||
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};
|
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren)};
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ bool AccessibilityController::handleEvent(Ion::Events::Event event) {
|
|||||||
int redGamma, greenGamma, blueGamma;
|
int redGamma, greenGamma, blueGamma;
|
||||||
KDIonContext::sharedContext()->gamma.gamma(redGamma, greenGamma, blueGamma);
|
KDIonContext::sharedContext()->gamma.gamma(redGamma, greenGamma, blueGamma);
|
||||||
|
|
||||||
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
|
if ((event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) && (selectedRow() <= 2)) {
|
||||||
if (selectedRow() == 0) {
|
if (selectedRow() == 0) {
|
||||||
invertEnabled = !invertEnabled;
|
invertEnabled = !invertEnabled;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,12 +10,8 @@ CodeOptionsController::CodeOptionsController(Responder * parentResponder) :
|
|||||||
GenericSubController(parentResponder),
|
GenericSubController(parentResponder),
|
||||||
m_preferencesController(this)
|
m_preferencesController(this)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < k_totalNumberOfCell; i++) {
|
m_chevronCell.setMessageFont(KDFont::LargeFont);
|
||||||
m_cells[i].setMessageFont(KDFont::LargeFont);
|
m_switchCell.setMessageFont(KDFont::LargeFont);
|
||||||
}
|
|
||||||
for (int i = 0; i < k_totalNumberOfSwitchCells; i++) {
|
|
||||||
m_switchCells[i].setMessageFont(KDFont::LargeFont);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CodeOptionsController::handleEvent(Ion::Events::Event event) {
|
bool CodeOptionsController::handleEvent(Ion::Events::Event event) {
|
||||||
@@ -44,7 +40,10 @@ bool CodeOptionsController::handleEvent(Ion::Events::Event event) {
|
|||||||
HighlightCell * CodeOptionsController::reusableCell(int index, int type) {
|
HighlightCell * CodeOptionsController::reusableCell(int index, int type) {
|
||||||
assert(type == 0);
|
assert(type == 0);
|
||||||
assert(index >= 0 && index < k_totalNumberOfCell);
|
assert(index >= 0 && index < k_totalNumberOfCell);
|
||||||
return &m_cells[index];
|
if (index == 0) {
|
||||||
|
return &m_chevronCell;
|
||||||
|
}
|
||||||
|
return &m_switchCell;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CodeOptionsController::reusableCellCount(int type) {
|
int CodeOptionsController::reusableCellCount(int type) {
|
||||||
@@ -62,11 +61,14 @@ void CodeOptionsController::willDisplayCellForIndex(HighlightCell * cell, int in
|
|||||||
GlobalPreferences::sharedGlobalPreferences()->font() == KDFont::LargeFont
|
GlobalPreferences::sharedGlobalPreferences()->font() == KDFont::LargeFont
|
||||||
? myTextCell->setSubtitle(I18n::Message::LargeFont)
|
? myTextCell->setSubtitle(I18n::Message::LargeFont)
|
||||||
: myTextCell->setSubtitle(I18n::Message::SmallFont);
|
: myTextCell->setSubtitle(I18n::Message::SmallFont);
|
||||||
} else if (thisLabel == I18n::Message::Autocomplete) {
|
}
|
||||||
|
#ifdef HAS_CODE
|
||||||
|
else if (thisLabel == I18n::Message::Autocomplete) {
|
||||||
MessageTableCellWithSwitch * mySwitchCell = (MessageTableCellWithSwitch *)cell;
|
MessageTableCellWithSwitch * mySwitchCell = (MessageTableCellWithSwitch *)cell;
|
||||||
SwitchView * mySwitch = (SwitchView *)mySwitchCell->accessoryView();
|
SwitchView * mySwitch = (SwitchView *)mySwitchCell->accessoryView();
|
||||||
mySwitch->setState(GlobalPreferences::sharedGlobalPreferences()->autocomplete());
|
mySwitch->setState(GlobalPreferences::sharedGlobalPreferences()->autocomplete());
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,11 +14,10 @@ public:
|
|||||||
int reusableCellCount(int type) override;
|
int reusableCellCount(int type) override;
|
||||||
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
|
||||||
private:
|
private:
|
||||||
constexpr static int k_totalNumberOfCell = 1;
|
constexpr static int k_totalNumberOfCell = 2;
|
||||||
constexpr static int k_totalNumberOfSwitchCells = 1;
|
|
||||||
PreferencesController m_preferencesController;
|
PreferencesController m_preferencesController;
|
||||||
MessageTableCellWithChevronAndMessage m_cells[k_totalNumberOfCell];
|
MessageTableCellWithChevronAndMessage m_chevronCell;
|
||||||
MessageTableCellWithSwitch m_switchCells[k_totalNumberOfCell];
|
MessageTableCellWithSwitch m_switchCell;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,13 +24,13 @@ void AbstractScrollableMultipleExpressionsView::ContentCell::setHighlighted(bool
|
|||||||
// Do not call HighlightCell::setHighlighted to avoid marking all cell as dirty
|
// Do not call HighlightCell::setHighlighted to avoid marking all cell as dirty
|
||||||
m_highlighted = highlight;
|
m_highlighted = highlight;
|
||||||
KDColor defaultColor = backgroundColor();
|
KDColor defaultColor = backgroundColor();
|
||||||
KDColor color = highlight && m_selectedSubviewPosition == SubviewPosition::Center ? Palette::ExpressionInputBackground : defaultColor;
|
KDColor color = highlight && m_selectedSubviewPosition == SubviewPosition::Center ? Palette::Select : defaultColor;
|
||||||
m_centeredExpressionView.setBackgroundColor(color);
|
m_centeredExpressionView.setBackgroundColor(color);
|
||||||
color = highlight && m_selectedSubviewPosition == SubviewPosition::Right ? Palette::ExpressionInputBackground : defaultColor;
|
color = highlight && m_selectedSubviewPosition == SubviewPosition::Right ? Palette::Select : defaultColor;
|
||||||
m_rightExpressionView.setBackgroundColor(color);
|
m_rightExpressionView.setBackgroundColor(color);
|
||||||
m_approximateSign.setBackgroundColor(defaultColor);
|
m_approximateSign.setBackgroundColor(defaultColor);
|
||||||
if (leftExpressionView()) {
|
if (leftExpressionView()) {
|
||||||
color = highlight && m_selectedSubviewPosition == SubviewPosition::Left ? Palette::ExpressionInputBackground : defaultColor;
|
color = highlight && m_selectedSubviewPosition == SubviewPosition::Left ? Palette::Select : defaultColor;
|
||||||
leftExpressionView()->setBackgroundColor(color);
|
leftExpressionView()->setBackgroundColor(color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,12 @@ EPSILON_VERSION ?= 15.5.0
|
|||||||
OMEGA_VERSION ?= 1.22.1
|
OMEGA_VERSION ?= 1.22.1
|
||||||
# OMEGA_USERNAME ?= N/A
|
# OMEGA_USERNAME ?= N/A
|
||||||
OMEGA_STATE ?= public
|
OMEGA_STATE ?= public
|
||||||
EPSILON_APPS ?= calculation rpn graph code statistics probability solver atomic sequence regression reader settings external
|
EPSILON_APPS ?= geometry calculation rpn graph code statistics probability solver atomic sequence regression reader settings external
|
||||||
SUBMODULES_APPS = atomic rpn
|
SUBMODULES_APPS = atomic rpn
|
||||||
EPSILON_I18N ?= en fr nl pt it de es hu
|
EPSILON_I18N ?= en fr nl pt it de es hu
|
||||||
EPSILON_COUNTRIES ?= WW CA DE ES FR GB IT NL PT US
|
EPSILON_COUNTRIES ?= WW CA DE ES FR GB IT NL PT US
|
||||||
EPSILON_GETOPT ?= 0
|
EPSILON_GETOPT ?= 0
|
||||||
ESCHER_LOG_EVENTS_BINARY ?= 0
|
ESCHER_LOG_EVENTS_BINARY ?= 0
|
||||||
THEME_NAME ?= omega_light
|
THEME_NAME ?= upsilon_light
|
||||||
THEME_REPO ?= local
|
THEME_REPO ?= local
|
||||||
INCLUDE_ULAB ?= 1
|
INCLUDE_ULAB ?= 1
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ public:
|
|||||||
virtual void scrollToCell(int i, int j);
|
virtual void scrollToCell(int i, int j);
|
||||||
HighlightCell * cellAtLocation(int i, int j);
|
HighlightCell * cellAtLocation(int i, int j);
|
||||||
void reloadCellAtLocation(int i, int j);
|
void reloadCellAtLocation(int i, int j);
|
||||||
|
void reloadVisibleCells();
|
||||||
protected:
|
protected:
|
||||||
#if ESCHER_VIEW_LOGGING
|
#if ESCHER_VIEW_LOGGING
|
||||||
const char * className() const override;
|
const char * className() const override;
|
||||||
@@ -34,6 +35,7 @@ protected:
|
|||||||
void setHorizontalCellOverlap(KDCoordinate o) { m_horizontalCellOverlap = o; }
|
void setHorizontalCellOverlap(KDCoordinate o) { m_horizontalCellOverlap = o; }
|
||||||
void setVerticalCellOverlap(KDCoordinate o) { m_verticalCellOverlap = o; }
|
void setVerticalCellOverlap(KDCoordinate o) { m_verticalCellOverlap = o; }
|
||||||
|
|
||||||
|
void reloadVisibleCells();
|
||||||
void reloadCellAtLocation(int i, int j);
|
void reloadCellAtLocation(int i, int j);
|
||||||
HighlightCell * cellAtLocation(int i, int j);
|
HighlightCell * cellAtLocation(int i, int j);
|
||||||
TableViewDataSource * dataSource();
|
TableViewDataSource * dataSource();
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ void ModalViewEmptyController::ModalViewEmptyView::setMessages(I18n::Message * m
|
|||||||
|
|
||||||
void ModalViewEmptyController::ModalViewEmptyView::drawRect(KDContext * ctx, KDRect rect) const {
|
void ModalViewEmptyController::ModalViewEmptyView::drawRect(KDContext * ctx, KDRect rect) const {
|
||||||
ctx->fillRect(bounds(), k_backgroundColor);
|
ctx->fillRect(bounds(), k_backgroundColor);
|
||||||
drawBorderOfRect(ctx, bounds(), Palette::GrayBright);
|
drawBorderOfRect(ctx, bounds(), Palette::ListCellBorder);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ModalViewEmptyController::ModalViewEmptyView::numberOfSubviews() const {
|
int ModalViewEmptyController::ModalViewEmptyView::numberOfSubviews() const {
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ void TableView::layoutSubviews(bool force) {
|
|||||||
* otherwise the table's size might be miscomputed...
|
* otherwise the table's size might be miscomputed...
|
||||||
* FIXME:
|
* FIXME:
|
||||||
* Finally, this solution is not optimal at all since
|
* Finally, this solution is not optimal at all since
|
||||||
* layoutSubviews is called twice over m_contentView. */
|
* layoutSubviews is called twice over m_contentView. */
|
||||||
m_contentView.layoutSubviews(force);
|
m_contentView.layoutSubviews(force);
|
||||||
ScrollView::layoutSubviews(force);
|
ScrollView::layoutSubviews(force);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
BasicInfo:
|
BasicInfo:
|
||||||
Title : Omega
|
Title : Upsilon
|
||||||
CompanyCode : "00"
|
CompanyCode : "00"
|
||||||
ProductCode : CTR-E-OMEGA
|
ProductCode : CTR-E-Upsilon
|
||||||
Logo : Homebrew # Nintendo / Licensed / Distributed / iQue / iQueForSystem
|
Logo : Homebrew # Nintendo / Licensed / Distributed / iQue / iQueForSystem
|
||||||
|
|
||||||
RomFs:
|
RomFs:
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>Epsilon</string>
|
<string>Epsilon</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>io.github.omega.simulator</string>
|
<string>io.github.upsilon.simulator</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ static char* pref_path = nullptr;
|
|||||||
static char* file_buffer = nullptr;
|
static char* file_buffer = nullptr;
|
||||||
|
|
||||||
void loadPython(Args * arguments) {
|
void loadPython(Args * arguments) {
|
||||||
pref_path = SDL_GetPrefPath("io.github.omega", "omega-simulator");
|
pref_path = SDL_GetPrefPath("io.github.upsilon", "upsilon-simulator");
|
||||||
std::string path(pref_path);
|
std::string path(pref_path);
|
||||||
printf("Loading from %s\n", (path + "python.dat").c_str());
|
printf("Loading from %s\n", (path + "python.dat").c_str());
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ void init(bool screen_only, bool fullscreen, bool unresizable) {
|
|||||||
if (screen_only) {
|
if (screen_only) {
|
||||||
sScreenOnly = true;
|
sScreenOnly = true;
|
||||||
sWindow = SDL_CreateWindow(
|
sWindow = SDL_CreateWindow(
|
||||||
"Omega",
|
"Upsilon",
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
Ion::Display::Width, Ion::Display::Height,
|
Ion::Display::Width, Ion::Display::Height,
|
||||||
@@ -48,7 +48,7 @@ void init(bool screen_only, bool fullscreen, bool unresizable) {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
sWindow = SDL_CreateWindow(
|
sWindow = SDL_CreateWindow(
|
||||||
"Omega",
|
"Upsilon",
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED,
|
||||||
458, 888,
|
458, 888,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>Omega</title>
|
<title>Upsilon</title>
|
||||||
<style>
|
<style>
|
||||||
#include "calculator.css"
|
#include "calculator.css"
|
||||||
#include "simulator.css"
|
#include "simulator.css"
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
#include <poincare/tree_handle.h>
|
#include <poincare/tree_handle.h>
|
||||||
#include <poincare_nodes.h>
|
#include <poincare_nodes.h>
|
||||||
|
#include <apps/geometry/figures/figures.h>
|
||||||
#include <poincare_layouts.h>
|
#include <poincare_layouts.h>
|
||||||
#include <poincare/ghost.h>
|
#include <poincare/ghost.h>
|
||||||
|
|
||||||
|
using namespace Geometry;
|
||||||
|
|
||||||
namespace Poincare {
|
namespace Poincare {
|
||||||
|
|
||||||
/* Clone */
|
/* Clone */
|
||||||
@@ -377,4 +380,7 @@ template VectorNorm TreeHandle::FixedArityBuilder<VectorNorm, VectorNormNode>(co
|
|||||||
template VectorNormLayout TreeHandle::FixedArityBuilder<VectorNormLayout, VectorNormLayoutNode>(const Tuple &);
|
template VectorNormLayout TreeHandle::FixedArityBuilder<VectorNormLayout, VectorNormLayoutNode>(const Tuple &);
|
||||||
template MatrixLayout TreeHandle::NAryBuilder<MatrixLayout, MatrixLayoutNode>(const Tuple &);
|
template MatrixLayout TreeHandle::NAryBuilder<MatrixLayout, MatrixLayoutNode>(const Tuple &);
|
||||||
|
|
||||||
|
// Geometry templates
|
||||||
|
template PointByCoordinates TreeHandle::FixedArityBuilder<PointByCoordinates, PointByCoordinatesNode>(const Tuple &);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -363,6 +363,11 @@ Q(upper)
|
|||||||
Q(value)
|
Q(value)
|
||||||
Q(values)
|
Q(values)
|
||||||
Q(zip)
|
Q(zip)
|
||||||
|
Q(doc)
|
||||||
|
Q(property)
|
||||||
|
Q(getter)
|
||||||
|
Q(setter)
|
||||||
|
Q(deleter)
|
||||||
|
|
||||||
// Ion QSTR
|
// Ion QSTR
|
||||||
Q(ion)
|
Q(ion)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_color_obj, 1, 3, modkandinsky_color);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_color_obj, 1, 3, modkandinsky_color);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(modkandinsky_get_pixel_obj, modkandinsky_get_pixel);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(modkandinsky_get_pixel_obj, modkandinsky_get_pixel);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(modkandinsky_set_pixel_obj, modkandinsky_set_pixel);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(modkandinsky_set_pixel_obj, modkandinsky_set_pixel);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_string_obj, 3, 5, modkandinsky_draw_string);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_string_obj, 3, 6, modkandinsky_draw_string);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_line_obj, 5, 5, modkandinsky_draw_line);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_line_obj, 5, 5, modkandinsky_draw_line);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_circle_obj, 4, 4, modkandinsky_draw_circle);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_draw_circle_obj, 4, 4, modkandinsky_draw_circle);
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_fill_rect_obj, 5, 5, modkandinsky_fill_rect);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(modkandinsky_fill_rect_obj, 5, 5, modkandinsky_fill_rect);
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(modos_remove_obj, modos_remove);
|
|||||||
MP_DEFINE_CONST_FUN_OBJ_2(modos_rename_obj, modos_rename);
|
MP_DEFINE_CONST_FUN_OBJ_2(modos_rename_obj, modos_rename);
|
||||||
MP_DEFINE_CONST_FUN_OBJ_0(modos_listdir_obj, modos_listdir);
|
MP_DEFINE_CONST_FUN_OBJ_0(modos_listdir_obj, modos_listdir);
|
||||||
|
|
||||||
STATIC const MP_DEFINE_STR_OBJ(modos_sysname_obj, "Omega");
|
STATIC const MP_DEFINE_STR_OBJ(modos_sysname_obj, "Upsilon");
|
||||||
|
|
||||||
STATIC const mp_rom_map_elem_t modos_module_globals_table[] = {
|
STATIC const mp_rom_map_elem_t modos_module_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) },
|
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_os) },
|
||||||
|
|||||||
@@ -61,7 +61,7 @@
|
|||||||
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
#define MICROPY_PY_BUILTINS_FROZENSET (1)
|
||||||
|
|
||||||
// Whether to support property object
|
// Whether to support property object
|
||||||
#define MICROPY_PY_BUILTINS_PROPERTY (0)
|
#define MICROPY_PY_BUILTINS_PROPERTY (1)
|
||||||
|
|
||||||
// Whether to support unicode strings
|
// Whether to support unicode strings
|
||||||
#define MICROPY_PY_BUILTINS_STR_UNICODE (1)
|
#define MICROPY_PY_BUILTINS_STR_UNICODE (1)
|
||||||
|
|||||||
@@ -7,9 +7,7 @@ QUIZ_CASE(python_basics) {
|
|||||||
deinit_environment();
|
deinit_environment();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// "base" scripts to test.
|
||||||
QUIZ_CASE(python_template) {
|
QUIZ_CASE(python_template) {
|
||||||
assert_script_execution_succeeds(Code::ScriptTemplate::Squares()->content());
|
|
||||||
assert_script_execution_succeeds(Code::ScriptTemplate::Mandelbrot()->content());
|
|
||||||
assert_script_execution_succeeds(Code::ScriptTemplate::Polynomial()->content());
|
|
||||||
assert_script_execution_succeeds(Code::ScriptTemplate::Parabola()->content());
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,8 @@ Example:
|
|||||||
make THEME_REPO=https://github.com/Omega-Numworks/Omega-Theme-Example.git THEME_NAME=omega_blue
|
make THEME_REPO=https://github.com/Omega-Numworks/Omega-Theme-Example.git THEME_NAME=omega_blue
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> You can use `./themes/script.sh your_theme_name` to build the icons of your theme from the colors of `themes/logocolors.json`.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Omega-Themes is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode). NumWorks is a registered trademark.
|
Omega-Themes is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode). NumWorks is a registered trademark.
|
||||||
|
|||||||
503
themes/default_icons.svg
Normal file
@@ -0,0 +1,503 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg xmlns:serif="http://www.serif.com/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" sodipodi:docname="Upsilon_icons.svg" id="svg655" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;" xml:space="preserve" version="1.1" viewBox="0 0 366 480" height="100%" width="100%">
|
||||||
|
<metadata id="metadata661">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs id="defs659" />
|
||||||
|
<sodipodi:namedview inkscape:current-layer="g677" inkscape:window-maximized="1" inkscape:window-y="-9" inkscape:window-x="-9" inkscape:cy="377.02493" inkscape:cx="154.62857" inkscape:zoom="5.656854" inkscape:snap-midpoints="true" inkscape:snap-grids="true" showgrid="false" id="namedview657" inkscape:window-height="1007" inkscape:window-width="1920" inkscape:pageshadow="2" inkscape:pageopacity="0" guidetolerance="10" gridtolerance="10" objecttolerance="10" borderopacity="1" bordercolor="#666666" pagecolor="#ffffff" inkscape:document-rotation="0" />
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="0" x="0" id="Calculation" />
|
||||||
|
<clipPath id="_clip1">
|
||||||
|
<rect id="rect11" height="56" width="55" y="0" x="0" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g34" clip-path="url(#_clip1)">
|
||||||
|
<g id="g18">
|
||||||
|
<path id="path14" style="fill:COLOR_ICON_BACKGROUND;" d="M55,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path16" style="fill:COLOR_ICON_BORDER;" d="M55,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path20" style="fill:COLOR_ICON_SECONDARY;" d="M54,28l-26.5,0l0,27l19.5,0c3.863,0 7,-3.137 7,-7l0,-20Z" />
|
||||||
|
<path id="path22" style="fill:none;stroke:COLOR_ICON_BORDER;stroke-width:1px;" d="M0,28l55,0" />
|
||||||
|
<text id="text24" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:30px;fill:COLOR_DRAWINGS;" y="52.124px" x="32.039px">=</text>
|
||||||
|
<text id="text26" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:30px;fill:COLOR_MAIN;" y="25.078px" x="5.827px">+</text>
|
||||||
|
<text id="text28" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:30px;fill:COLOR_MAIN;" y="52.234px" x="6.361px">÷</text>
|
||||||
|
<text id="text30" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:30px;fill:COLOR_MAIN;" y="25.078px" x="35.796px">-</text>
|
||||||
|
<path id="path32" style="fill:none;stroke:COLOR_ICON_BORDER;stroke-width:1px;" d="M27.5,0l0,56" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED" height="56" width="55" y="342" x="80" id="Xcas" />
|
||||||
|
<clipPath id="_clip2">
|
||||||
|
<rect id="rect37" height="56" width="55" y="341.837" x="80.104" />
|
||||||
|
</clipPath>
|
||||||
|
<g transform="translate(0,0.16299438)" id="g52" clip-path="url(#_clip2)">
|
||||||
|
<g id="g44">
|
||||||
|
<path id="path40" style="fill:COLOR_ICON_BACKGROUND" d="m 135.104,349.837 c 0,-4.415 -3.585,-8 -8,-8 h -39 c -4.415,0 -8,3.585 -8,8 v 40 c 0,4.416 3.585,8 8,8 h 39 c 4.415,0 8,-3.584 8,-8 z" />
|
||||||
|
<path id="path42" style="fill:COLOR_ICON_BORDER" d="m 135.104,349.837 c 0,-4.415 -3.585,-8 -8,-8 h -39 c -4.415,0 -8,3.585 -8,8 v 40 c 0,4.416 3.585,8 8,8 h 39 c 4.415,0 8,-3.584 8,-8 z m -1,0 v 40 c 0,3.864 -3.137,7 -7,7 0,0 -39,0 -39,0 -3.864,0 -7,-3.136 -7,-7 0,0 0,-40 0,-40 0,-3.863 3.136,-7 7,-7 h 39 c 3.863,0 7,3.137 7,7 z" />
|
||||||
|
</g>
|
||||||
|
<g id="g50" transform="translate(20.2427,1.61535)">
|
||||||
|
<text id="text46" style="font-size:20px;font-family:ArialMT, Arial, sans-serif;fill:COLOR_ICON_SECONDARY" y="375.263" x="65.472">X</text>
|
||||||
|
<text id="text48" style="font-size:20px;font-family:ArialMT, Arial, sans-serif;fill:COLOR_MAIN" y="375.263" x="78.810997">cas</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="87" x="0" id="Python" />
|
||||||
|
<clipPath id="_clip3">
|
||||||
|
<rect id="rect55" height="56" width="55" y="87" x="0" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g71" clip-path="url(#_clip3)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border">
|
||||||
|
<path id="path58" style="fill:COLOR_ICON_BACKGROUND;" d="M55,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path60" style="fill:COLOR_ICON_BORDER;" d="M55,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7c0,-0 -39,-0 -39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path63" style="fill:COLOR_ICON_SECONDARY;" d="M16.131,125.124l-0,-7c-0,-0 -0.252,-4 4,-4l14,-0c-0,-0 3,-0.077 3,-3l-0,-12c-0,-0 0.049,-3 -3,-3l-14,-0c-0,-0 -3,-0.158 -3,3l-0,5l10.5,-0l-0,2l-16.5,-0c-0,-0 -3,-0.26 -3,3l-0,13c-0,-0 -0.406,3 3,3l5,-0Z" />
|
||||||
|
<path id="path65" style="fill:COLOR_MAIN;" d="M38.869,104.876l0,7c0,0 0.252,4 -4,4l-14,0c0,0 -3,0.077 -3,3l0,12c0,0 -0.049,3 3,3l14,0c0,0 3,0.158 3,-3l0,-5l-10.5,0l0,-2l16.5,0c0,0 3,0.26 3,-3l0,-13c0,0 0.406,-3 -3,-3l-5,0Z" />
|
||||||
|
<circle id="circle67" style="fill:COLOR_DRAWINGS" r="1.312" cy="100.312" cx="21.312" />
|
||||||
|
<circle id="circle69" style="fill:COLOR_DRAWINGS;" r="1.312" cy="129.916" cx="33.585" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="173" x="0" id="Equation" />
|
||||||
|
<clipPath id="_clip4">
|
||||||
|
<rect id="rect74" height="56" width="55" y="173" x="0" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g94" clip-path="url(#_clip4)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border1">
|
||||||
|
<path id="path77" style="fill:COLOR_ICON_BACKGROUND;" d="M55,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path79" style="fill:COLOR_ICON_BORDER;" d="M55,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path82" style="fill:none;stroke:COLOR_ICON_BORDER;stroke-width:1px;" d="M1,201l53,-0" />
|
||||||
|
<text id="text84" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:20px;fill:COLOR_MAIN;" y="194.422px" x="11.274px">x=?</text>
|
||||||
|
<g id="g92" transform="matrix(1,0,0,1,-60.3104,-155.06)">
|
||||||
|
<text id="text86" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:20px;fill:COLOR_ICON_SECONDARY;" y="375.263px" x="71.202px">y</text>
|
||||||
|
<text id="text88" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:20px;fill:COLOR_ICON_SECONDARY;" y="375.263px" x="81.202px">=</text>
|
||||||
|
<text id="text90" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:20px;fill:COLOR_ICON_SECONDARY;" y="375.263px" x="93.081px">?</text>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="258" x="0" id="Regression" />
|
||||||
|
<clipPath id="_clip5">
|
||||||
|
<rect id="rect97" height="56" width="55" y="258" x="0" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g115" clip-path="url(#_clip5)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border2">
|
||||||
|
<path id="path100" style="fill:COLOR_ICON_BACKGROUND;" d="M55,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path102" style="fill:COLOR_ICON_BORDER;" d="M55,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,0c-3.863,0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path105" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M44,300l-33,0l0,-29" />
|
||||||
|
<path id="path107" style="fill:none;stroke:COLOR_REGRESSION_LINE;stroke-width:2px;" d="M17.5,294l20,-20" />
|
||||||
|
<circle id="circle109" style="fill:COLOR_MAIN;" r="2" cy="278.059" cx="19.5" />
|
||||||
|
<circle id="circle111" style="fill:COLOR_MAIN;" r="2" cy="294" cx="31.631" />
|
||||||
|
<circle id="circle113" style="fill:COLOR_MAIN;" r="2" cy="284" cx="37.5" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="342" x="0" id="Upsilon" />
|
||||||
|
<clipPath id="_clip6">
|
||||||
|
<rect id="rect118" height="56" width="55" y="342" x="0" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g127" clip-path="url(#_clip6)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border3">
|
||||||
|
<path id="path121" style="fill:COLOR_MAIN;" d="M55,350c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path123" style="fill:#81a1c1;" d="M55,350c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l-0,40c-0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7c0,-0 -39,-0 -39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path style="fill:COLOR_DRAWINGS;fill-rule:nonzero;" d="M30.31,350.039c4.961,0.603 8.627,2.7 10.998,6.291c2.371,3.59 3.556,7.743 3.557,12.457c-0.001,5.783 -1.727,10.758 -5.181,14.924c-3.453,4.167 -7.578,6.25 -12.375,6.25c-2.659,-0 -5.084,-0.72 -7.277,-2.159c-2.193,-1.439 -3.659,-3.186 -4.399,-5.242c-0.74,-2.055 -1.11,-4.947 -1.11,-8.675l-0,-13.608c-0,-2.467 -0.233,-4.153 -0.699,-5.057c-0.466,-0.905 -1.33,-1.357 -2.59,-1.357c-1.837,-0 -3.043,1.836 -3.618,5.509l-1.481,0c0.357,-6.222 3.029,-9.333 8.018,-9.333c1.699,0 3.104,0.439 4.214,1.316c1.11,0.877 1.877,1.884 2.302,3.022c0.425,1.137 0.637,3.214 0.637,6.229l0,13.814c0,3.234 0.185,5.667 0.555,7.297c0.37,1.631 1.206,2.967 2.508,4.009c1.302,1.042 2.734,1.562 4.297,1.562c2.631,0 4.755,-1.528 6.372,-4.584c1.617,-3.056 2.426,-7.668 2.426,-13.835c0,-5.509 -0.603,-9.572 -1.809,-12.19c-1.206,-2.617 -3.07,-4.337 -5.591,-5.16l0.246,-1.48Z" serif:id="Upsilon" id="Upsilon1" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="258" x="80" id="Settings" />
|
||||||
|
<clipPath id="_clip7">
|
||||||
|
<rect id="rect130" height="56" width="55" y="258" x="80" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g150" clip-path="url(#_clip7)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border4">
|
||||||
|
<path id="path133" style="fill:COLOR_ICON_BACKGROUND;" d="M135,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path135" style="fill:COLOR_ICON_BORDER;" d="M135,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Zm-1,-0l0,40c0,3.863 -3.137,7 -7,7l-39,0c-3.863,0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path138" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M92.482,275l30.036,0" />
|
||||||
|
<path id="path140" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M92.482,286l30.036,0" />
|
||||||
|
<path id="path142" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M92.482,297l30.036,0" />
|
||||||
|
<circle id="circle144" style="fill:COLOR_MAIN;stroke:COLOR_MAIN;stroke-width:2px;" r="2" cy="297" cx="107" />
|
||||||
|
<circle id="circle146" style="fill:COLOR_MAIN;stroke:COLOR_MAIN;stroke-width:2px;" r="2" cy="286" cx="117" />
|
||||||
|
<circle id="circle148" style="fill:COLOR_MAIN;stroke:COLOR_MAIN;stroke-width:2px;" r="2" cy="275" cx="99" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:#fff;" height="33" width="116" y="447" x="0" id="Logo" />
|
||||||
|
<text id="text153" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:35.145px;fill:COLOR_MAIN;" y="472.604px" x="0.271px">Upsilon</text>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="258" x="160" id="External" />
|
||||||
|
<clipPath id="_clip8">
|
||||||
|
<rect id="rect156" height="56" width="55" y="258" x="160" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g172" clip-path="url(#_clip8)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border5">
|
||||||
|
<path id="path159" style="fill:COLOR_ICON_BACKGROUND;" d="M215,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path161" style="fill:COLOR_ICON_BORDER;" d="M215,266c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,0c-3.863,0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path164" style="fill:COLOR_ICON_SECONDARY;" d="M186.226,290.819c-0,-1.966 -1.596,-3.562 -3.562,-3.562l-7.123,0c-1.966,0 -3.562,1.596 -3.562,3.562l0,7.123c0,1.965 1.596,3.561 3.562,3.561l7.123,0c1.966,0 3.562,-1.596 3.562,-3.561l-0,-7.123Z" />
|
||||||
|
<path id="path166" style="fill:COLOR_ICON_SECONDARY;" d="M186.226,274.058c-0,-1.965 -1.596,-3.561 -3.562,-3.561l-7.123,-0c-1.966,-0 -3.562,1.596 -3.562,3.561l0,7.123c0,1.966 1.596,3.562 3.562,3.562l7.123,-0c1.966,-0 3.562,-1.596 3.562,-3.562l-0,-7.123Z" />
|
||||||
|
<path id="path168" style="fill:COLOR_ICON_SECONDARY;" d="M203.021,290.819c-0,-1.966 -1.596,-3.562 -3.562,-3.562l-7.123,0c-1.966,0 -3.562,1.596 -3.562,3.562l0,7.123c0,1.965 1.596,3.561 3.562,3.561l7.123,0c1.966,0 3.562,-1.596 3.562,-3.561l-0,-7.123Z" />
|
||||||
|
<path id="path170" style="fill:COLOR_MAIN;" d="M203.453,280.138c1.39,-1.39 1.39,-3.647 -0,-5.037l-5.037,-5.036c-1.39,-1.39 -3.647,-1.39 -5.037,-0l-5.037,5.036c-1.39,1.39 -1.39,3.647 0,5.037l5.037,5.037c1.39,1.39 3.647,1.39 5.037,0l5.037,-5.037Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="173" x="80" id="Atom" />
|
||||||
|
<clipPath id="_clip9">
|
||||||
|
<rect id="rect175" height="56" width="55" y="173" x="80" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g191" clip-path="url(#_clip9)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border6">
|
||||||
|
<path id="path178" style="fill:COLOR_ICON_BACKGROUND;" d="M135,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path180" style="fill:COLOR_ICON_BORDER;" d="M135,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,-0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<circle id="circle183" style="fill:COLOR_MAIN;" r="2" cy="201" cx="107.5" />
|
||||||
|
<ellipse id="ellipse185" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" ry="6" rx="18" cy="201" cx="107.5" />
|
||||||
|
<path id="path187" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M102.304,198c4.967,-8.604 11.328,-14.244 14.196,-12.588c2.868,1.655 1.163,9.984 -3.804,18.588c-4.967,8.604 -11.328,14.244 -14.196,12.588c-2.868,-1.655 -1.163,-9.984 3.804,-18.588Z" />
|
||||||
|
<path id="path189" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M102.304,204c-4.967,-8.604 -6.672,-16.933 -3.804,-18.588c2.868,-1.656 9.229,3.984 14.196,12.588c4.967,8.604 6.672,16.933 3.804,18.588c-2.868,1.656 -9.229,-3.984 -14.196,-12.588Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="173" x="160" id="Sequence" />
|
||||||
|
<clipPath id="_clip10">
|
||||||
|
<rect id="rect194" height="56" width="55" y="173" x="160" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g206" clip-path="url(#_clip10)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border7">
|
||||||
|
<path id="path197" style="fill:COLOR_ICON_BACKGROUND;" d="M215,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path199" style="fill:COLOR_ICON_BORDER;" d="M215,181c0,-4.415 -3.585,-8 -8,-8l-39,-0c-4.415,-0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path202" style="fill:COLOR_MAIN;" d="M203,215l-32,-0l0,-8l8,-0l-0,-6l8,-0l-0,-6l8,0l-0,-6l8,0l-0,26Z" />
|
||||||
|
<path id="path204" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M204,216l-33,0l0,-29" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="87" x="80" id="Statistics" />
|
||||||
|
<clipPath id="_clip11">
|
||||||
|
<rect id="rect209" height="56" width="55" y="87" x="80" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g223" clip-path="url(#_clip11)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border8">
|
||||||
|
<path id="path212" style="fill:COLOR_ICON_BACKGROUND;" d="M135,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path214" style="fill:COLOR_ICON_BORDER;" d="M135,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,-0l0,40c0,3.863 -3.137,7 -7,7c0,-0 -39,-0 -39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<rect id="rect217" style="fill:COLOR_MAIN;" height="33" width="11" y="100" x="102" />
|
||||||
|
<rect id="rect219" style="fill:COLOR_ICON_SECONDARY;" height="25" width="11" y="108" x="115" />
|
||||||
|
<rect id="rect221" style="fill:COLOR_ICON_SECONDARY;" height="16.5" width="11" y="116.5" x="89" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="87" x="160" id="Probability" />
|
||||||
|
<clipPath id="_clip12">
|
||||||
|
<rect id="rect226" height="56" width="55" y="87" x="160" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g238" clip-path="url(#_clip12)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border9">
|
||||||
|
<path id="path229" style="fill:COLOR_ICON_BACKGROUND;" d="M215,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path231" style="fill:COLOR_ICON_BORDER;" d="M215,95c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7c0,-0 -39,-0 -39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path234" style="fill:COLOR_ICON_SECONDARY;stroke:COLOR_ICON_SECONDARY;stroke-width:1px;" d="M168,132.5c0,0 7.774,-4.662 9,-16.5c0.808,-7.8 3.251,-12.5 9,-12.5l0,29l-18,0Z" />
|
||||||
|
<path id="path236" style="fill:COLOR_MAIN;stroke:COLOR_MAIN;stroke-width:1px;" d="M207,132.5c0,0 -7.774,-4.662 -9,-16.5c-0.808,-7.8 -3.251,-12.5 -9,-12.5l0,29l18,0Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="0" x="80" id="RPN" />
|
||||||
|
<clipPath id="_clip13">
|
||||||
|
<rect id="rect241" height="56" width="55" y="0" x="80" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g259" clip-path="url(#_clip13)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border10">
|
||||||
|
<path id="path244" style="fill:COLOR_ICON_BACKGROUND;" d="M135,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path246" style="fill:COLOR_ICON_BORDER;" d="M135,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,-0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path249" style="fill:COLOR_ICON_SECONDARY;" d="M134,35l-53,0l0,13c0,3.863 3.137,7 7,7l39,0c3.863,0 7,-3.137 7,-7l0,-13Z" />
|
||||||
|
<path id="path251" style="fill:none;stroke:COLOR_ICON_BORDER;stroke-width:1px;" d="M81,34.5l53,0" />
|
||||||
|
<text id="text253" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:16px;fill:COLOR_MAIN;" y="16.263px" x="121.602px">0</text>
|
||||||
|
<text id="text255" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:16px;fill:COLOR_MAIN;" y="30.64px" x="112.594px">16</text>
|
||||||
|
<text id="text257" style="font-family:'ArialMT', 'Arial', sans-serif;font-size:16px;fill:COLOR_DRAWINGS;" y="50.084px" x="103.711px">215</text>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_ICON_CROPPED;" height="56" width="55" y="0" x="160" id="Functions" />
|
||||||
|
<clipPath id="_clip14">
|
||||||
|
<rect id="rect262" height="56" width="55" y="0" x="160" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g274" clip-path="url(#_clip14)">
|
||||||
|
<g serif:id="Icon Border" id="Icon-Border11">
|
||||||
|
<path id="path265" style="fill:COLOR_ICON_BACKGROUND;" d="M215,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,0c4.415,0 8,-3.585 8,-8l0,-40Z" />
|
||||||
|
<path id="path267" style="fill:COLOR_ICON_BORDER;" d="M215,8c0,-4.415 -3.585,-8 -8,-8l-39,0c-4.415,0 -8,3.585 -8,8l0,40c0,4.415 3.585,8 8,8l39,-0c4.415,-0 8,-3.585 8,-8l0,-40Zm-1,0l0,40c0,3.863 -3.137,7 -7,7l-39,-0c-3.863,-0 -7,-3.137 -7,-7l0,-40c0,-3.863 3.137,-7 7,-7l39,0c3.863,0 7,3.137 7,7Z" />
|
||||||
|
</g>
|
||||||
|
<path id="path270" style="fill:COLOR_MAIN;" d="M171,42.5c0,0 3.314,-24.5 28,-24.5l0,24.5l-28,0Z" />
|
||||||
|
<path id="path272" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2px;" d="M204,43l-33,0l0,-29" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="0" x="273" id="Binomial" />
|
||||||
|
<clipPath id="_clip15">
|
||||||
|
<rect id="rect277" height="19" width="35" y="0" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g316" clip-path="url(#_clip15)">
|
||||||
|
<g id="g314">
|
||||||
|
<rect id="rect280" style="fill:COLOR_MAIN;" height="1" width="1" y="18" x="274" />
|
||||||
|
<rect id="rect282" style="fill:COLOR_MAIN;" height="1" width="1" y="18" x="306" />
|
||||||
|
<rect id="rect284" style="fill:COLOR_MAIN;" height="2" width="1" y="17" x="276" />
|
||||||
|
<rect id="rect286" style="fill:COLOR_MAIN;" height="2" width="1" y="17" x="304" />
|
||||||
|
<rect id="rect288" style="fill:COLOR_MAIN;" height="3" width="1" y="16" x="278" />
|
||||||
|
<rect id="rect290" style="fill:COLOR_MAIN;" height="3" width="1" y="16" x="302" />
|
||||||
|
<rect id="rect292" style="fill:COLOR_MAIN;" height="6" width="1" y="13" x="280" />
|
||||||
|
<rect id="rect294" style="fill:COLOR_MAIN;" height="6" width="1" y="13" x="300" />
|
||||||
|
<rect id="rect296" style="fill:COLOR_MAIN;" height="10" width="1" y="9" x="282" />
|
||||||
|
<rect id="rect298" style="fill:COLOR_MAIN;" height="10" width="1" y="9" x="298" />
|
||||||
|
<rect id="rect300" style="fill:COLOR_MAIN;" height="13" width="1" y="6" x="284" />
|
||||||
|
<rect id="rect302" style="fill:COLOR_MAIN;" height="13" width="1" y="6" x="296" />
|
||||||
|
<rect id="rect304" style="fill:COLOR_MAIN;" height="16" width="1" y="3" x="286" />
|
||||||
|
<rect id="rect306" style="fill:COLOR_MAIN;" height="16" width="1" y="3" x="294" />
|
||||||
|
<rect id="rect308" style="fill:COLOR_MAIN;" height="18" width="1" y="1" x="288" />
|
||||||
|
<rect id="rect310" style="fill:COLOR_MAIN;" height="18" width="1" y="1" x="292" />
|
||||||
|
<rect id="rect312" style="fill:COLOR_MAIN;" height="19" width="1" y="-0" x="290" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="0" x="327" serif:id="Binomial Focused" id="Binomial-Focused" />
|
||||||
|
<clipPath id="_clip16">
|
||||||
|
<rect id="rect319" height="19" width="35" y="0" x="327" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g357" clip-path="url(#_clip16)">
|
||||||
|
<g serif:id="Binomial" id="Binomial1">
|
||||||
|
<rect id="rect322" style="fill:COLOR_MAIN;" height="1" width="1" y="18" x="328" />
|
||||||
|
<rect id="rect324" style="fill:COLOR_MAIN;" height="1" width="1" y="18" x="360" />
|
||||||
|
<rect id="rect326" style="fill:COLOR_MAIN;" height="2" width="1" y="17" x="330" />
|
||||||
|
<rect id="rect328" style="fill:COLOR_MAIN;" height="2" width="1" y="17" x="358" />
|
||||||
|
<rect id="rect330" style="fill:COLOR_MAIN;" height="3" width="1" y="16" x="332" />
|
||||||
|
<rect id="rect332" style="fill:COLOR_MAIN;" height="3" width="1" y="16" x="356" />
|
||||||
|
<rect id="rect334" style="fill:COLOR_MAIN;" height="6" width="1" y="13" x="334" />
|
||||||
|
<rect id="rect336" style="fill:COLOR_MAIN;" height="6" width="1" y="13" x="354" />
|
||||||
|
<rect id="rect338" style="fill:COLOR_MAIN;" height="10" width="1" y="9" x="336" />
|
||||||
|
<rect id="rect340" style="fill:COLOR_MAIN;" height="10" width="1" y="9" x="352" />
|
||||||
|
<rect id="rect342" style="fill:COLOR_MAIN;" height="13" width="1" y="6" x="338" />
|
||||||
|
<rect id="rect344" style="fill:COLOR_MAIN;" height="13" width="1" y="6" x="350" />
|
||||||
|
<rect id="rect346" style="fill:COLOR_MAIN;" height="16" width="1" y="3" x="340" />
|
||||||
|
<rect id="rect348" style="fill:COLOR_MAIN;" height="16" width="1" y="3" x="348" />
|
||||||
|
<rect id="rect350" style="fill:COLOR_MAIN;" height="18" width="1" y="1" x="342" />
|
||||||
|
<rect id="rect352" style="fill:COLOR_MAIN;" height="18" width="1" y="1" x="346" />
|
||||||
|
<rect id="rect354" style="fill:COLOR_MAIN;" height="19" width="1" y="-0" x="344" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="29" x="273" serif:id="Chi Squared" id="Chi-Squared" />
|
||||||
|
<g id="g362">
|
||||||
|
<path id="path360" style="fill:COLOR_MAIN;" d="M273,42c0,0 1.512,-6 6,-6c4.488,0 14.504,11 29,11l0,1l-35,0l0,-6" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="29" x="327" serif:id="Chi Squared Focused" id="Chi-Squared-Focused" />
|
||||||
|
<g serif:id="Chi Squared" id="Chi-Squared1">
|
||||||
|
<path id="path365" style="fill:COLOR_MAIN;" d="M327,42c0,0 1.512,-6 6,-6c4.488,0 14.504,11 29,11l0,1l-35,0l0,-6" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="58" x="273" id="Exponential" />
|
||||||
|
<g id="g371">
|
||||||
|
<path id="path369" style="fill:COLOR_MAIN;" d="M308,76l0,1l-35,0l0,-19l1,0c0,0 -0.356,8.136 11,13c11.356,4.864 23,5 23,5Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="58" x="327" serif:id="Exponential Focused" id="Exponential-Focused" />
|
||||||
|
<g serif:id="Exponential" id="Exponential1">
|
||||||
|
<path id="path374" style="fill:COLOR_MAIN;" d="M362,76l0,1l-35,0l0,-19l1,0c0,0 -0.356,8.136 11,13c11.356,4.864 23,5 23,5Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="87" x="273" id="Fisher" />
|
||||||
|
<g id="g380">
|
||||||
|
<path id="path378" style="fill:COLOR_MAIN;" d="M273,106c0,0 1.751,-16 4,-16c2.249,0 0.362,5.694 7,10c6.638,4.306 17.257,6 21,6c3.743,0 -32,0 -32,0Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="87" x="327" serif:id="Fisher Focused" id="Fisher-Focused" />
|
||||||
|
<g serif:id="Fisher" id="Fisher1">
|
||||||
|
<path id="path383" style="fill:COLOR_MAIN;" d="M327,106c0,0 1.751,-16 4,-16c2.249,0 0.362,5.694 7,10c6.638,4.306 17.257,6 21,6c3.743,0 -32,0 -32,0Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="116" x="273" id="Geometric" />
|
||||||
|
<clipPath id="_clip17">
|
||||||
|
<rect id="rect387" height="19" width="35" y="116" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g428" clip-path="url(#_clip17)">
|
||||||
|
<g id="g426">
|
||||||
|
<rect id="rect390" style="fill:COLOR_MAIN;" height="18" width="1" y="117" x="273" />
|
||||||
|
<rect id="rect392" style="fill:COLOR_MAIN;" height="15" width="1" y="120" x="275" />
|
||||||
|
<rect id="rect394" style="fill:COLOR_MAIN;" height="12" width="1" y="123" x="277" />
|
||||||
|
<rect id="rect396" style="fill:COLOR_MAIN;" height="10" width="1" y="125" x="279" />
|
||||||
|
<rect id="rect398" style="fill:COLOR_MAIN;" height="8" width="1" y="127" x="281" />
|
||||||
|
<rect id="rect400" style="fill:COLOR_MAIN;" height="6" width="1" y="129" x="283" />
|
||||||
|
<rect id="rect402" style="fill:COLOR_MAIN;" height="5" width="1" y="130" x="285" />
|
||||||
|
<rect id="rect404" style="fill:COLOR_MAIN;" height="4" width="1" y="131" x="287" />
|
||||||
|
<rect id="rect406" style="fill:COLOR_MAIN;" height="3" width="1" y="132" x="289" />
|
||||||
|
<rect id="rect408" style="fill:COLOR_MAIN;" height="3" width="1" y="132" x="291" />
|
||||||
|
<rect id="rect410" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="295" />
|
||||||
|
<rect id="rect412" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="297" />
|
||||||
|
<rect id="rect414" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="299" />
|
||||||
|
<rect id="rect416" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="301" />
|
||||||
|
<rect id="rect418" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="303" />
|
||||||
|
<rect id="rect420" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="305" />
|
||||||
|
<rect id="rect422" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="307" />
|
||||||
|
<rect id="rect424" style="fill:COLOR_MAIN;" height="2.5" width="1" y="132.5" x="293" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="116" x="327" serif:id="Geometric Focused" id="Geometric-Focused" />
|
||||||
|
<clipPath id="_clip18">
|
||||||
|
<rect id="rect431" height="19" width="35" y="116" x="327" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g471" clip-path="url(#_clip18)">
|
||||||
|
<g serif:id="Geometric" id="Geometric1">
|
||||||
|
<rect id="rect434" style="fill:COLOR_MAIN;" height="18" width="1" y="117" x="327" />
|
||||||
|
<rect id="rect436" style="fill:COLOR_MAIN;" height="15" width="1" y="120" x="329" />
|
||||||
|
<rect id="rect438" style="fill:COLOR_MAIN;" height="12" width="1" y="123" x="331" />
|
||||||
|
<rect id="rect440" style="fill:COLOR_MAIN;" height="10" width="1" y="125" x="333" />
|
||||||
|
<rect id="rect442" style="fill:COLOR_MAIN;" height="8" width="1" y="127" x="335" />
|
||||||
|
<rect id="rect444" style="fill:COLOR_MAIN;" height="6" width="1" y="129" x="337" />
|
||||||
|
<rect id="rect446" style="fill:COLOR_MAIN;" height="5" width="1" y="130" x="339" />
|
||||||
|
<rect id="rect448" style="fill:COLOR_MAIN;" height="4" width="1" y="131" x="341" />
|
||||||
|
<rect id="rect450" style="fill:COLOR_MAIN;" height="3" width="1" y="132" x="343" />
|
||||||
|
<rect id="rect452" style="fill:COLOR_MAIN;" height="3" width="1" y="132" x="345" />
|
||||||
|
<rect id="rect454" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="349" />
|
||||||
|
<rect id="rect456" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="351" />
|
||||||
|
<rect id="rect458" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="353" />
|
||||||
|
<rect id="rect460" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="355" />
|
||||||
|
<rect id="rect462" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="357" />
|
||||||
|
<rect id="rect464" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="359" />
|
||||||
|
<rect id="rect466" style="fill:COLOR_MAIN;" height="2" width="1" y="133" x="361" />
|
||||||
|
<rect id="rect468" style="fill:COLOR_MAIN;" height="2.5" width="1" y="132.5" x="347" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="145" x="273" id="Normal" />
|
||||||
|
<clipPath id="_clip19">
|
||||||
|
<rect id="rect474" height="19" width="35" y="145" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g481" clip-path="url(#_clip19)">
|
||||||
|
<g id="g479">
|
||||||
|
<path id="path477" style="fill:COLOR_MAIN;" d="M290.5,145c1.298,0 3.641,-0.034 7,9.5c3.043,8.639 10.5,8.5 10.5,8.5l0,1l-35,0l0,-1c0,0 7.457,0.139 10.5,-8.5c3.359,-9.534 5.702,-9.5 7,-9.5Z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="145" x="327" serif:id="Normal Focused" id="Normal-Focused" />
|
||||||
|
<clipPath id="_clip20">
|
||||||
|
<rect id="rect484" height="19" width="35" y="145" x="327" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g490" clip-path="url(#_clip20)">
|
||||||
|
<g serif:id="Normal" id="Normal1">
|
||||||
|
<path id="path487" style="fill:COLOR_MAIN;" d="M344.5,145c1.298,0 3.641,-0.034 7,9.5c3.043,8.639 10.5,8.5 10.5,8.5l0,1l-35,0l0,-1c0,0 7.457,0.139 10.5,-8.5c3.359,-9.534 5.702,-9.5 7,-9.5Z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="174" x="273" id="Poisson" />
|
||||||
|
<clipPath id="_clip21">
|
||||||
|
<rect id="rect493" height="19" width="35" y="174" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g534" clip-path="url(#_clip21)">
|
||||||
|
<g id="g532">
|
||||||
|
<rect id="rect496" style="fill:COLOR_MAIN;" height="1" width="1" y="192" x="273" />
|
||||||
|
<rect id="rect498" style="fill:COLOR_MAIN;" height="1" width="1" y="192" x="307" />
|
||||||
|
<rect id="rect500" style="fill:COLOR_MAIN;" height="2" width="1" y="191" x="275" />
|
||||||
|
<rect id="rect502" style="fill:COLOR_MAIN;" height="2" width="1" y="191" x="305" />
|
||||||
|
<rect id="rect504" style="fill:COLOR_MAIN;" height="3" width="1" y="190" x="277" />
|
||||||
|
<rect id="rect506" style="fill:COLOR_MAIN;" height="3" width="1" y="190" x="303" />
|
||||||
|
<rect id="rect508" style="fill:COLOR_MAIN;" height="5" width="1" y="188" x="279" />
|
||||||
|
<rect id="rect510" style="fill:COLOR_MAIN;" height="5" width="1" y="188" x="301" />
|
||||||
|
<rect id="rect512" style="fill:COLOR_MAIN;" height="8" width="1" y="185" x="281" />
|
||||||
|
<rect id="rect514" style="fill:COLOR_MAIN;" height="8" width="1" y="185" x="299" />
|
||||||
|
<rect id="rect516" style="fill:COLOR_MAIN;" height="11" width="1" y="182" x="283" />
|
||||||
|
<rect id="rect518" style="fill:COLOR_MAIN;" height="11" width="1" y="182" x="297" />
|
||||||
|
<rect id="rect520" style="fill:COLOR_MAIN;" height="14" width="1" y="179" x="285" />
|
||||||
|
<rect id="rect522" style="fill:COLOR_MAIN;" height="14" width="1" y="179" x="295" />
|
||||||
|
<rect id="rect524" style="fill:COLOR_MAIN;" height="16" width="1" y="177" x="287" />
|
||||||
|
<rect id="rect526" style="fill:COLOR_MAIN;" height="16" width="1" y="177" x="293" />
|
||||||
|
<rect id="rect528" style="fill:COLOR_MAIN;" height="19" width="1" y="174" x="289" />
|
||||||
|
<rect id="rect530" style="fill:COLOR_MAIN;" height="19" width="1" y="174" x="291" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="174" x="327" serif:id="Poisson Focused" id="Poisson-Focused" />
|
||||||
|
<clipPath id="_clip22">
|
||||||
|
<rect id="rect537" height="19" width="35" y="174" x="327" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g577" clip-path="url(#_clip22)">
|
||||||
|
<g serif:id="Poisson" id="Poisson1">
|
||||||
|
<rect id="rect540" style="fill:COLOR_MAIN;" height="1" width="1" y="192" x="327" />
|
||||||
|
<rect id="rect542" style="fill:COLOR_MAIN;" height="1" width="1" y="192" x="361" />
|
||||||
|
<rect id="rect544" style="fill:COLOR_MAIN;" height="2" width="1" y="191" x="329" />
|
||||||
|
<rect id="rect546" style="fill:COLOR_MAIN;" height="2" width="1" y="191" x="359" />
|
||||||
|
<rect id="rect548" style="fill:COLOR_MAIN;" height="3" width="1" y="190" x="331" />
|
||||||
|
<rect id="rect550" style="fill:COLOR_MAIN;" height="3" width="1" y="190" x="357" />
|
||||||
|
<rect id="rect552" style="fill:COLOR_MAIN;" height="5" width="1" y="188" x="333" />
|
||||||
|
<rect id="rect554" style="fill:COLOR_MAIN;" height="5" width="1" y="188" x="355" />
|
||||||
|
<rect id="rect556" style="fill:COLOR_MAIN;" height="8" width="1" y="185" x="335" />
|
||||||
|
<rect id="rect558" style="fill:COLOR_MAIN;" height="8" width="1" y="185" x="353" />
|
||||||
|
<rect id="rect560" style="fill:COLOR_MAIN;" height="11" width="1" y="182" x="337" />
|
||||||
|
<rect id="rect562" style="fill:COLOR_MAIN;" height="11" width="1" y="182" x="351" />
|
||||||
|
<rect id="rect564" style="fill:COLOR_MAIN;" height="14" width="1" y="179" x="339" />
|
||||||
|
<rect id="rect566" style="fill:COLOR_MAIN;" height="14" width="1" y="179" x="349" />
|
||||||
|
<rect id="rect568" style="fill:COLOR_MAIN;" height="16" width="1" y="177" x="341" />
|
||||||
|
<rect id="rect570" style="fill:COLOR_MAIN;" height="16" width="1" y="177" x="347" />
|
||||||
|
<rect id="rect572" style="fill:COLOR_MAIN;" height="19" width="1" y="174" x="343" />
|
||||||
|
<rect id="rect574" style="fill:COLOR_MAIN;" height="19" width="1" y="174" x="345" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="203" x="273" id="Student" />
|
||||||
|
<clipPath id="_clip23">
|
||||||
|
<rect id="rect580" height="19" width="35" y="203" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g587" clip-path="url(#_clip23)">
|
||||||
|
<g id="g585">
|
||||||
|
<path id="path583" style="fill:COLOR_MAIN;" d="M273,222c0,0 11.784,-0.846 13.5,-8.5c1.75,-7.808 2.629,-10.5 4,-10.5l0.032,0c1.368,0.027 2.224,2.753 3.968,10.5c1.723,7.653 13.5,8.5 13.5,8.5l-35,0Z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="203" x="327" serif:id="Student Focused" id="Student-Focused" />
|
||||||
|
<clipPath id="_clip24">
|
||||||
|
<rect id="rect590" height="19" width="35" y="203" x="327" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g596" clip-path="url(#_clip24)">
|
||||||
|
<g serif:id="Student" id="Student1">
|
||||||
|
<path id="path593" style="fill:COLOR_MAIN;" d="M327,222c0,0 11.784,-0.846 13.5,-8.5c1.75,-7.808 2.629,-10.5 4,-10.5l0.032,0c1.368,0.027 2.224,2.753 3.968,10.5c1.723,7.653 13.5,8.5 13.5,8.5l-35,0Z" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="19" width="35" y="232" x="273" id="Uniform" />
|
||||||
|
<g id="g601">
|
||||||
|
<path id="path599" style="fill:COLOR_MAIN;" d="M273,250l7,0l0,-11l22,0l0,11l6,0l0,1l-7,0l0,-11l-9,0l0,11l-19,0l0,-1Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="19" width="35" y="232" x="327" serif:id="Uniform Focused" id="Uniform-Focused" />
|
||||||
|
<g serif:id="Uniform" id="Uniform1">
|
||||||
|
<path id="path604" style="fill:COLOR_MAIN;" d="M327,250l7,0l0,-11l22,0l0,11l6,0l0,1l-7,0l0,-11l-9,0l0,11l-19,0l0,-1Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="23" width="39" y="261" x="273" serif:id="Calcul 1" id="Calcul-1" />
|
||||||
|
<g id="g610">
|
||||||
|
<path id="path608" style="fill:COLOR_MAIN;" d="M293,282l-16,-0l0,-1c0,-0 8.063,-0.478 10,-8.5c1.937,-8.022 4.044,-9.5 6,-9.5l0.023,0c1.981,0.023 4.055,1.54 5.977,9.5c1.937,8.022 10,8.5 10,8.5l0,1c0,-0 -9.018,-0.333 -11.118,-9.5c-1.01,-3.802 -1.907,-6.138 -2.837,-7.245c-1.032,-1.228 -2.045,-1.01 -2.045,-1.01l0,17.755Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="23" width="39" y="261" x="327" serif:id="Calcul 1 Focused" id="Calcul-1-Focused" />
|
||||||
|
<g serif:id="Calcul 1" id="Calcul-11">
|
||||||
|
<path id="path613" style="fill:COLOR_MAIN;" d="M346.5,282l-16,-0l0,-1c0,-0 8.063,-0.478 10,-8.5c1.937,-8.022 4.044,-9.5 6,-9.5l0.023,0c1.981,0.023 4.055,1.54 5.977,9.5c1.937,8.022 10,8.5 10,8.5l0,1c0,-0 -9.018,-0.333 -11.118,-9.5c-1.01,-3.802 -1.907,-6.138 -2.837,-7.245c-1.032,-1.228 -2.045,-1.01 -2.045,-1.01l0,17.755Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="23" width="39" y="360" x="273" serif:id="Calcul 4" id="Calcul-4" />
|
||||||
|
<g id="g619">
|
||||||
|
<path id="path617" style="fill:COLOR_MAIN;" d="M292.998,363.246c-0.091,-0 -2.799,-0.482 -4.88,8.254c-2.1,9.167 -11.118,9.5 -11.118,9.5l0,-1c0,0 8.063,-0.478 10,-8.5c1.922,-7.96 4.018,-9.477 6,-9.5l0.006,0c1.988,0.03 4.076,1.556 5.994,9.5c1.937,8.022 10,8.5 10,8.5l0,1c0,0 -9.018,-0.333 -11.118,-9.5c-0.603,-2.27 -1.068,-3.915 -1.693,-5.109l-0,14.61l-1,0l-0,-16.202c-0.938,-1.666 -2.189,-1.554 -2.189,-1.554l-0.002,0.001Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="23" width="39" y="360" x="327" serif:id="Calcul 4 Focused" id="Calcul-4-Focused" />
|
||||||
|
<g serif:id="Calcul 4" id="Calcul-41">
|
||||||
|
<path id="path622" style="fill:COLOR_MAIN;" d="M346.498,363.245c-0.091,-0 -2.799,-0.482 -4.88,8.254c-2.1,9.167 -11.118,9.5 -11.118,9.5l0,-1c0,0 8.063,-0.478 10,-8.5c1.922,-7.959 4.018,-9.476 6,-9.5l0.006,0.001c1.988,0.029 4.076,1.555 5.994,9.499c1.937,8.022 10,8.5 10,8.5l0,1c0,0 -9.018,-0.333 -11.118,-9.5c-0.603,-2.27 -1.068,-3.915 -1.693,-5.108l-0,14.61l-1,-0l-0,-16.203c-0.938,-1.666 -2.189,-1.554 -2.189,-1.554l-0.002,0.001Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_MAIN;" height="9" width="18" y="393" x="273" id="Exam" />
|
||||||
|
<clipPath id="_clip25">
|
||||||
|
<rect id="rect626" height="9" width="18" y="393" x="273" />
|
||||||
|
</clipPath>
|
||||||
|
<g id="g635" clip-path="url(#_clip25)">
|
||||||
|
<path id="path629" style="fill:COLOR_DRAWINGS;" d="M282,393l8,3l-8,3l-8,-3l8,-3Z" />
|
||||||
|
<path id="path631" style="fill:COLOR_DRAWINGS;" d="M274,397l2,0.5l-1,3.5l-2,-1l1,-3Z" />
|
||||||
|
<path id="path633" style="fill:COLOR_DRAWINGS;" d="M277,398l4,2l2,0l4,-2l0,2l-4,2l-2,-0l-4,-2l0,-2" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_STATS_ICONS_BACKGROUND;" height="23" width="39" y="327" x="273" serif:id="Calcul 3" id="Calcul-3" />
|
||||||
|
<g id="g640">
|
||||||
|
<path id="path638" style="fill:COLOR_MAIN;" d="M293,348l16,-0l0,-1c0,-0 -8.063,-0.478 -10,-8.5c-1.937,-8.022 -4.044,-9.5 -6,-9.5l-0.023,0c-1.981,0.023 -4.055,1.54 -5.977,9.5c-1.937,8.022 -10,8.5 -10,8.5l0,1c0,-0 9.018,-0.333 11.118,-9.5c2.066,-9.019 4.882,-8.255 4.882,-8.255l0,17.755Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="23" width="39" y="327" x="327" serif:id="Calcul 3 Focused" id="Calcul-3-Focused" />
|
||||||
|
<g serif:id="Calcul 3" id="Calcul-31">
|
||||||
|
<path id="path643" style="fill:COLOR_MAIN;" d="M346.5,348l16,-0l0,-1c0,-0 -8.063,-0.478 -10,-8.5c-1.937,-8.022 -4.044,-9.5 -6,-9.5l-0.023,0c-1.981,0.023 -4.055,1.54 -5.977,9.5c-1.937,8.022 -10,8.5 -10,8.5l0,1c0,-0 9.018,-0.333 11.118,-9.5c2.066,-9.019 4.882,-8.255 4.882,-8.255l0,17.755Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="23" width="39" y="294" x="273" serif:id="Calcul 2" id="Calcul-2" />
|
||||||
|
<g id="g649">
|
||||||
|
<path id="path647" style="fill:COLOR_MAIN;" d="M289,302.336c-0.3,0.814 -0.597,2.09 -0.882,3.164c-2.1,9.167 -11.118,9.5 -11.118,9.5l0,-1c0,-0 8.063,-0.478 10,-8.5c1.922,-7.96 4.018,-9.477 6,-9.5l0.023,0.001c2.007,0.047 4.07,1.601 5.977,9.499c1.937,8.022 10,8.5 10,8.5l0,1c0,-0 -9.018,-0.333 -11.118,-9.5c-0.285,-1.075 -0.582,-2.351 -0.882,-3.164l0,12.664l-8,-0l0,-12.664Z" />
|
||||||
|
</g>
|
||||||
|
<rect style="fill:COLOR_FOCUSED_STATS_ICONS_BACKGROUND;" height="23" width="39" y="294" x="327" serif:id="Calcul 2 Focused" id="Calcul-2-Focused" />
|
||||||
|
<g serif:id="Calcul 2" id="Calcul-21">
|
||||||
|
<path id="path652" style="fill:COLOR_MAIN;" d="M342.5,302.336c-0.3,0.814 -0.597,2.09 -0.882,3.164c-2.1,9.167 -11.118,9.5 -11.118,9.5l0,-1c0,-0 8.063,-0.478 10,-8.5c1.922,-7.96 4.018,-9.477 6,-9.5l0.023,0.001c2.007,0.047 4.07,1.601 5.977,9.499c1.937,8.022 10,8.5 10,8.5l0,1c0,-0 -9.018,-0.333 -11.118,-9.5c-0.285,-1.075 -0.582,-2.351 -0.882,-3.164l0,12.664l-8,-0l0,-12.664Z" />
|
||||||
|
</g>
|
||||||
|
<rect id="rect663" x="160" y="342" width="55" height="56" style="fill:COLOR_ICON_CROPPED;stroke-width:1" />
|
||||||
|
<g transform="translate(79.895996,0.16299438)" clip-path="url(#_clip2)" id="g677">
|
||||||
|
<g id="g669" >
|
||||||
|
<path d="m 135.104,349.837 c 0,-4.415 -3.585,-8 -8,-8 h -39 c -4.415,0 -8,3.585 -8,8 v 40 c 0,4.416 3.585,8 8,8 h 39 c 4.415,0 8,-3.584 8,-8 z" style="fill:COLOR_ICON_BACKGROUND" id="path665" />
|
||||||
|
<path d="m 135.104,349.837 c 0,-4.415 -3.585,-8 -8,-8 h -39 c -4.415,0 -8,3.585 -8,8 v 40 c 0,4.416 3.585,8 8,8 h 39 c 4.415,0 8,-3.584 8,-8 z m -1,0 v 40 c 0,3.864 -3.137,7 -7,7 0,0 -39,0 -39,0 -3.864,0 -7,-3.136 -7,-7 0,0 0,-40 0,-40 0,-3.863 3.136,-7 7,-7 h 39 c 3.863,0 7,3.137 7,7 z" style="fill:COLOR_ICON_BORDER" id="path667" />
|
||||||
|
</g>
|
||||||
|
<g id="g1270" transform="matrix(0.93098276,0,0,0.93098276,5.8044055,28.391253)" >
|
||||||
|
<g transform="matrix(0.90441865,0,0,0.90441865,8.2270653,30.355839)" id="g1240">
|
||||||
|
<g style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.92067557,0,0,1.0569449,35.052162,-19.096722)" id="g675">
|
||||||
|
<path sodipodi:nodetypes="cccsccccsc" d="m 65.747435,347.38108 35.465605,2e-5 v 0 c 0,0 -4.419292,1.10821 -4.419292,5.70345 0,4.56135 4.419292,5.55667 4.419292,5.55667 v 0 H 65.747435 v 0 c 0,0 -5.996537,0.1577 -5.996537,-5.54157 0,-5.7331 5.996537,-5.71857 5.996537,-5.71857 z" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:1.9849;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:59.1496;stroke-opacity:1" id="rect751" />
|
||||||
|
</g>
|
||||||
|
<path style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" d="M 97.899622,354.01697 H 123.64962 Z" id="path1217" />
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.90441865,0,0,0.90441865,14.953685,31.65595)" id="g1245">
|
||||||
|
<g transform="translate(3.5625001,0.2499999)" id="g1255">
|
||||||
|
<g style="fill:COLOR_MAIN;fill-opacity:1;stroke:COLOR_MAIN;stroke-width:2;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.92067557,0,0,1.0569449,29.364662,-2.8467214)" id="g1227">
|
||||||
|
<path sodipodi:nodetypes="cccsccccsc" d="m 65.747435,347.38108 35.465605,2e-5 v 0 c 0,0 -4.419292,1.10821 -4.419292,5.70345 0,4.56135 4.419292,5.55667 4.419292,5.55667 v 0 H 65.747435 v 0 c 0,0 -5.996537,0.1577 -5.996537,-5.54157 0,-5.7331 5.996537,-5.71857 5.996537,-5.71857 z" style="fill:COLOR_MAIN;fill-opacity:1;stroke:COLOR_MAIN;stroke-width:1.9849;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:59.1496;stroke-opacity:1" id="path1225" />
|
||||||
|
</g>
|
||||||
|
<path style="fill:none;stroke:COLOR_ICON_BACKGROUND;stroke-width:2.07307;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" d="M 92.285477,370.26697 H 119.95127 Z" id="path1229" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(0.90441865,0,0,0.90441865,7.6618037,33.577829)" id="g1250">
|
||||||
|
<g style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" transform="matrix(0.92067557,0,0,1.0569449,35.677162,13.215779)" id="g1233">
|
||||||
|
<path sodipodi:nodetypes="cccsccccsc" d="m 65.747435,347.38108 35.465605,2e-5 v 0 c 0,0 -4.419292,1.10821 -4.419292,5.70345 0,4.56135 4.419292,5.55667 4.419292,5.55667 v 0 H 65.747435 v 0 c 0,0 -5.996537,0.1577 -5.996537,-5.54157 0,-5.7331 5.996537,-5.71857 5.996537,-5.71857 z" style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:1.9849;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-dashoffset:59.1496;stroke-opacity:1" id="path1231" />
|
||||||
|
</g>
|
||||||
|
<path style="fill:none;stroke:COLOR_ICON_SECONDARY;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:1.5;stroke-dasharray:none;stroke-opacity:1" d="M 98.524622,386.32947 H 124.27462 Z" id="path1235" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 45 KiB |
@@ -6,6 +6,7 @@
|
|||||||
"apps/calculation/calculation_icon.png" : "apps/calculation_icon.png",
|
"apps/calculation/calculation_icon.png" : "apps/calculation_icon.png",
|
||||||
"apps/code/code_icon.png" : "apps/code_icon.png",
|
"apps/code/code_icon.png" : "apps/code_icon.png",
|
||||||
"apps/external/external_icon.png" : "apps/external_icon.png",
|
"apps/external/external_icon.png" : "apps/external_icon.png",
|
||||||
|
"apps/geometry/geometry_icon.png" : "apps/geometry_icon.png",
|
||||||
"apps/graph/graph_icon.png" : "apps/graph_icon.png",
|
"apps/graph/graph_icon.png" : "apps/graph_icon.png",
|
||||||
"apps/probability/probability_icon.png" : "apps/probability_icon.png",
|
"apps/probability/probability_icon.png" : "apps/probability_icon.png",
|
||||||
"apps/regression/regression_icon.png" : "apps/regression_icon.png",
|
"apps/regression/regression_icon.png" : "apps/regression_icon.png",
|
||||||
|
|||||||
11
themes/logocolors.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"COLOR_MAIN": "#7EA2CE",
|
||||||
|
"COLOR_ICON_SECONDARY": "#4A4A4A",
|
||||||
|
"COLOR_DRAWINGS": "#F2F2F2",
|
||||||
|
"COLOR_REGRESSION_LINE": "#D4D4D4",
|
||||||
|
"COLOR_ICON_BORDER": "#E6E6E6",
|
||||||
|
"COLOR_ICON_BACKGROUND": "#F2F2F2",
|
||||||
|
"COLOR_FOCUSED_STATS_ICONS_BACKGROUND": "#E0E0E0",
|
||||||
|
"COLOR_STATS_ICONS_BACKGROUND": "#FFFFFF",
|
||||||
|
"COLOR_ICON_CROPPED": "#FFFFFF"
|
||||||
|
}
|
||||||
77
themes/script.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Necessary packages: jq, inkscape
|
||||||
|
|
||||||
|
cd themes
|
||||||
|
cp default_icons.svg generated_icons.svg
|
||||||
|
file=generated_icons.svg
|
||||||
|
|
||||||
|
mkdir -p themes/local/$1
|
||||||
|
mkdir -p themes/local/$1/apps
|
||||||
|
mkdir -p themes/local/$1/probability
|
||||||
|
dir=./themes/local/$1
|
||||||
|
|
||||||
|
|
||||||
|
#Checks if jq is installed then assigns returned variables to $k or uses command line args
|
||||||
|
if [ $(which jq | wc -l) -ge 1 ]; then
|
||||||
|
hex=$(jq -r 'to_entries[] | (.key)' logocolors.json | tr -d '\r')
|
||||||
|
for key in $hex; do
|
||||||
|
value=$(jq -r '.'$key'' logocolors.json)
|
||||||
|
echo "$key => $value"
|
||||||
|
sed -i 's%'$key'%'$value'%g' $file
|
||||||
|
done
|
||||||
|
else
|
||||||
|
for param in $@; do
|
||||||
|
echo "COLORID$k => $param"
|
||||||
|
sed -i 's%COLORID'$k'%'$param'%g' $file
|
||||||
|
k=$(($k+1))
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $(which inkscape | wc -l) -ge 1 ]; then
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/calculation_icon.png --export-area=0:0:55:56
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/rpn_icon.png --export-area=80:0:135:56
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/graph_icon.png --export-area=160:0:215:56
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/code_icon.png --export-area=0:87:55:143
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/stat_icon.png --export-area=80:87:135:143
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/probability_icon.png --export-area=160:87:215:143
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/solver_icon.png --export-area=0:173:55:229
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/atomic_icon.png --export-area=80:173:135:229
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/sequence_icon.png --export-area=160:173:215:229
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/graph_icon.png --export-area=160:0:215:56
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/regression_icon.png --export-area=0:258:55:314
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/settings_icon.png --export-area=80:258:135:314
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/external_icon.png --export-area=160:258:215:314
|
||||||
|
# inkscape ./generated_icons.svg -o $dir/apps/xcas_icon.png --export-area=80:342:135:398
|
||||||
|
inkscape ./generated_icons.svg -o $dir/apps/reader_icon.png --export-area=160:342:215:398
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/binomial_icon.png --export-area=273:0:308:19
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/chi_squared_icon.png --export-area=273:29:308:48
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/exponential_icon.png --export-area=273:58:308:77
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/fisher_icon.png --export-area=273:87:308:106
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/geometric_icon.png --export-area=273:116:308:135
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/normal_icon.png --export-area=273:145:308:164
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/poisson_icon.png --export-area=273:174:308:193
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/student_icon.png --export-area=273:203:308:222
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/uniform_icon.png --export-area=273:232:308:251
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/calcul1_icon.png --export-area=273:261:312:284
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/calcul2_icon.png --export-area=273:294:312:317
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/calcul3_icon.png --export-area=273:327:312:350
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/calcul4_icon.png --export-area=273:360:312:383
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_binomial_icon.png --export-area=327:0:362:19
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_chi_squared_icon.png --export-area=327:29:362:48
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_exponential_icon.png --export-area=327:58:362:77
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_fisher_icon.png --export-area=327:87:362:106
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_geometric_icon.png --export-area=327:116:362:135
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_normal_icon.png --export-area=327:145:362:164
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_poisson_icon.png --export-area=327:174:362:193
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_student_icon.png --export-area=327:203:362:222
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_uniform_icon.png --export-area=327:232:362:251
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_calcul1_icon.png --export-area=327:261:366:284
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_calcul2_icon.png --export-area=327:294:366:317
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_calcul3_icon.png --export-area=327:327:366:350
|
||||||
|
inkscape ./generated_icons.svg -o $dir/probability/focused_calcul4_icon.png --export-area=327:360:366:383
|
||||||
|
inkscape ./generated_icons.svg -o $dir/exam_icon.png --export-area=273:393:291:402
|
||||||
|
inkscape ./generated_icons.svg -o $dir/logo_icon.png --export-area=0:447:115:479
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm generated_icons.svg
|
||||||
BIN
themes/themes/local/build/apps/reader_icon.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
@@ -50,11 +50,11 @@
|
|||||||
"BackgroundSelected": "2b281f",
|
"BackgroundSelected": "2b281f",
|
||||||
"Text": "ffffff",
|
"Text": "ffffff",
|
||||||
"Comment": "999988",
|
"Comment": "999988",
|
||||||
"Number": "009999",
|
"Number": "1abc9c",
|
||||||
"Keyword": "ff000c",
|
"Keyword": "c03535",
|
||||||
"Operator": "d73a49",
|
"Operator": "e67e22",
|
||||||
"String": "032f62",
|
"String": "3498db",
|
||||||
"GutterViewBackground": "E4E6E7"
|
"GutterViewBackground": "1f1f1f"
|
||||||
},
|
},
|
||||||
"Probability": {
|
"Probability": {
|
||||||
"Curve": "ffb734",
|
"Curve": "ffb734",
|
||||||
@@ -76,9 +76,9 @@
|
|||||||
"Text": "47443a"
|
"Text": "47443a"
|
||||||
},
|
},
|
||||||
"Toolbox": {
|
"Toolbox": {
|
||||||
"HeaderBackground": "656975",
|
"HeaderBackground": "3b3b3b",
|
||||||
"HeaderText": "000000",
|
"HeaderText": "ffffff",
|
||||||
"HeaderBorder": "414147",
|
"HeaderBorder": "3b3b3b",
|
||||||
"Background": "ffffff"
|
"Background": "ffffff"
|
||||||
},
|
},
|
||||||
"List": {
|
"List": {
|
||||||
@@ -97,11 +97,11 @@
|
|||||||
"Text": "ffffff"
|
"Text": "ffffff"
|
||||||
},
|
},
|
||||||
"Tab": {
|
"Tab": {
|
||||||
"Background": "4a4a4a",
|
"Background": "2e2e2e",
|
||||||
"BackgroundSelected": "2b281f",
|
"BackgroundSelected": "2b281f",
|
||||||
"BackgroundActive": "000000",
|
"BackgroundActive": "000000",
|
||||||
"BackgroundSelectedAndActive": "26272e",
|
"BackgroundSelectedAndActive": "26272e",
|
||||||
"Text": "000000",
|
"Text": "ffffff",
|
||||||
"TextActive": "656975"
|
"TextActive": "656975"
|
||||||
},
|
},
|
||||||
"SubTab": {
|
"SubTab": {
|
||||||
|
|||||||
@@ -50,11 +50,11 @@
|
|||||||
"BackgroundSelected": "1f1f1f",
|
"BackgroundSelected": "1f1f1f",
|
||||||
"Text": "ffffff",
|
"Text": "ffffff",
|
||||||
"Comment": "999988",
|
"Comment": "999988",
|
||||||
"Number": "009999",
|
"Number": "1abc9c",
|
||||||
"Keyword": "ff000c",
|
"Keyword": "c03535",
|
||||||
"Operator": "d73a49",
|
"Operator": "e67E22",
|
||||||
"String": "032f62",
|
"String": "3498db",
|
||||||
"GutterViewBackground": "E4E6E7"
|
"GutterViewBackground": "1f1f1f"
|
||||||
},
|
},
|
||||||
"Probability": {
|
"Probability": {
|
||||||
"Curve": "00857f",
|
"Curve": "00857f",
|
||||||
@@ -76,9 +76,9 @@
|
|||||||
"Text": "ffffff"
|
"Text": "ffffff"
|
||||||
},
|
},
|
||||||
"Toolbox": {
|
"Toolbox": {
|
||||||
"HeaderBackground": "b5b5b5",
|
"HeaderBackground": "3b3b3b",
|
||||||
"HeaderText": "000000",
|
"HeaderText": "ffffff",
|
||||||
"HeaderBorder": "b5b5b5",
|
"HeaderBorder": "3b3b3b",
|
||||||
"Background": "ffffff"
|
"Background": "ffffff"
|
||||||
},
|
},
|
||||||
"List": {
|
"List": {
|
||||||
@@ -97,11 +97,11 @@
|
|||||||
"Text": "ffffff"
|
"Text": "ffffff"
|
||||||
},
|
},
|
||||||
"Tab": {
|
"Tab": {
|
||||||
"Background": "b5b5b5",
|
"Background": "2e2e2e",
|
||||||
"BackgroundSelected": "8a8a8a",
|
"BackgroundSelected": "8a8a8a",
|
||||||
"BackgroundActive": "050505",
|
"BackgroundActive": "050505",
|
||||||
"BackgroundSelectedAndActive": "1c1c1c",
|
"BackgroundSelectedAndActive": "1c1c1c",
|
||||||
"Text": "000000",
|
"Text": "ffffff",
|
||||||
"TextActive": "ffffff"
|
"TextActive": "ffffff"
|
||||||
},
|
},
|
||||||
"SubTab": {
|
"SubTab": {
|
||||||
|
|||||||
150
themes/themes/local/upsilon_light.json
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
{
|
||||||
|
"name": "Upsilon Light",
|
||||||
|
"icons": "upsilon_light",
|
||||||
|
"colors": {
|
||||||
|
"PrimaryText": "000000",
|
||||||
|
"SecondaryText": "6e6e6e",
|
||||||
|
"AccentText": "00857f",
|
||||||
|
"ApproximateSignText": "595959",
|
||||||
|
"ApproximateExpressionText": "595959",
|
||||||
|
"Background": {
|
||||||
|
"Hard": "ffffff",
|
||||||
|
"Apps": "fafafa",
|
||||||
|
"AppsSecondary": "f0f0f0"
|
||||||
|
},
|
||||||
|
"Toolbar": {
|
||||||
|
"": "7EA2CE",
|
||||||
|
"Text": "ffffff"
|
||||||
|
},
|
||||||
|
"ExpressionInput": {
|
||||||
|
"Background": "e0e0e0",
|
||||||
|
"Border": "d9d9d9"
|
||||||
|
},
|
||||||
|
"Grid": {
|
||||||
|
"PrimaryLine": "d9d9d9",
|
||||||
|
"SecondaryLine": "f5f5f5"
|
||||||
|
},
|
||||||
|
"Battery": {
|
||||||
|
"": "ffffff",
|
||||||
|
"InCharge": "179e1f",
|
||||||
|
"Low": "992321"
|
||||||
|
},
|
||||||
|
"ScrollBar": {
|
||||||
|
"Foreground": "4a4a4a",
|
||||||
|
"Background": "d9d9d9"
|
||||||
|
},
|
||||||
|
"Control": {
|
||||||
|
"": "ffad83",
|
||||||
|
"Enabled": "ff8b52",
|
||||||
|
"Disabled": "9e9e9e"
|
||||||
|
},
|
||||||
|
"Calculation": {
|
||||||
|
"BackgroundOdd": "fafafa",
|
||||||
|
"BackgroundEven": "ffffff",
|
||||||
|
"EmptyBox": "c4c4c4",
|
||||||
|
"EmptyBoxNeeded": "ffad83",
|
||||||
|
"TrigoAndComplexForeground": "ff000c"
|
||||||
|
},
|
||||||
|
"Code": {
|
||||||
|
"Background": "ffffff",
|
||||||
|
"BackgroundSelected": "e0e0e0",
|
||||||
|
"Text": "000000",
|
||||||
|
"Comment": "999988",
|
||||||
|
"Number": "009999",
|
||||||
|
"Keyword": "ff000c",
|
||||||
|
"Operator": "d73a49",
|
||||||
|
"String": "032f62",
|
||||||
|
"GutterViewBackground": "E4E6E7"
|
||||||
|
},
|
||||||
|
"Probability": {
|
||||||
|
"Curve": "ff8b52",
|
||||||
|
"CellBorder": "ececec",
|
||||||
|
"HistogramBar": "d9d9d9"
|
||||||
|
},
|
||||||
|
"Statistics": {
|
||||||
|
"Box": "ffad83",
|
||||||
|
"BoxVerticalLine": "d9d9d9",
|
||||||
|
"Selected": "ffad83",
|
||||||
|
"NotSelected": "f5f5f5"
|
||||||
|
},
|
||||||
|
"Graph": {
|
||||||
|
"Tangent": "595959"
|
||||||
|
},
|
||||||
|
"SubMenu": {
|
||||||
|
"Background": "e0e0e0",
|
||||||
|
"Border": "fafafa",
|
||||||
|
"Text": "000000"
|
||||||
|
},
|
||||||
|
"Toolbox": {
|
||||||
|
"HeaderBackground": "4a4a4a",
|
||||||
|
"HeaderText": "ffffff",
|
||||||
|
"HeaderBorder": "4a4a4a",
|
||||||
|
"Background": "000000"
|
||||||
|
},
|
||||||
|
"List": {
|
||||||
|
"CellBackground": "ffffff",
|
||||||
|
"CellBackgroundSelected": "e0e0e0",
|
||||||
|
"CellBorder": "ededef"
|
||||||
|
},
|
||||||
|
"Button": {
|
||||||
|
"Background": "e6e6e6",
|
||||||
|
"BackgroundSelected": "c9c9c9",
|
||||||
|
"BackgroundSelectedHighContrast": "00b2b0",
|
||||||
|
"Border": "adadad",
|
||||||
|
"RowBorder": "d9d9d9",
|
||||||
|
"BorderOut": "f5f5f5",
|
||||||
|
"Shadow": "003833",
|
||||||
|
"Text": "000000"
|
||||||
|
},
|
||||||
|
"Tab": {
|
||||||
|
"Background": "4a4a4a",
|
||||||
|
"BackgroundSelected": "757575",
|
||||||
|
"BackgroundActive": "fafafa",
|
||||||
|
"BackgroundSelectedAndActive": "e3e3e3",
|
||||||
|
"Text": "ffffff",
|
||||||
|
"TextActive": "000000"
|
||||||
|
},
|
||||||
|
"SubTab": {
|
||||||
|
"Background": "e0e0e0",
|
||||||
|
"BackgroundSelected": "d1d1d1",
|
||||||
|
"Text": "000000"
|
||||||
|
},
|
||||||
|
"Banner": {
|
||||||
|
"FirstBackground": "4a4a4a",
|
||||||
|
"FirstBorder": "4a4a4a",
|
||||||
|
"FirstText": "ffffff",
|
||||||
|
"FirstVariantBackground": "4a4a4a",
|
||||||
|
"FirstVariantBorder": "fafafa",
|
||||||
|
"FirstVariantText": "ffffff",
|
||||||
|
"SecondBackground": "e0e0e0",
|
||||||
|
"SecondBorder": "fafafa",
|
||||||
|
"SecondText": "000000"
|
||||||
|
},
|
||||||
|
"Home": {
|
||||||
|
"Background": "ffffff",
|
||||||
|
"CellBackground": "ffffff",
|
||||||
|
"CellBackgroundActive": "4a4a4a",
|
||||||
|
"CellText": "000000",
|
||||||
|
"CellTextActive": "ffffff",
|
||||||
|
"CellTextExternal": "008f87",
|
||||||
|
"CellTextExternalActive": "6fe6df"
|
||||||
|
},
|
||||||
|
"Atom": {
|
||||||
|
"Unknown": "eeeeee",
|
||||||
|
"Text": "000000",
|
||||||
|
"AlkaliMetal": "CC9E7E",
|
||||||
|
"AlkaliEarthMetal": "D69477",
|
||||||
|
"Lanthanide": "A5DDAD",
|
||||||
|
"Actinide": "96D481",
|
||||||
|
"TransitionMetal": "99C6E7",
|
||||||
|
"PostTransitionMetal": "D69877",
|
||||||
|
"Metalloid": "D6B071",
|
||||||
|
"Halogen": "84ABE3",
|
||||||
|
"ReactiveNonmetal": "DBC377",
|
||||||
|
"NobleGas": "8FC2E6",
|
||||||
|
"TableLines": "323532",
|
||||||
|
"Highlight": "000000",
|
||||||
|
"Background": "d9d9d9"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
themes/themes/local/upsilon_light/apps/atomic_icon.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
themes/themes/local/upsilon_light/apps/calculation_icon.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
themes/themes/local/upsilon_light/apps/code_icon.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/themes/local/upsilon_light/apps/external_icon.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
themes/themes/local/upsilon_light/apps/graph_icon.png
Normal file
|
After Width: | Height: | Size: 851 B |
BIN
themes/themes/local/upsilon_light/apps/probability_icon.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
themes/themes/local/upsilon_light/apps/reader_icon.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |