Compare commits

...

31 Commits

Author SHA1 Message Date
Laury
51fd990c31 [geometry] Start of graph 2022-01-25 21:15:57 +01:00
Laury
7af2b45f1d [geometry] Make the app multi-tabs 2022-01-23 21:11:02 +01:00
Laury
d95785ba42 [geometry] Finished V1 of the first menu 2022-01-22 12:44:40 +01:00
Laury
d108b76a32 [geometry] Added text field in FigureParametersController 2021-12-19 14:54:54 +01:00
Laury
a3d3cbbfa5 [geometry] WIP 2021-12-13 20:39:57 +01:00
Laury
3a41cbdc85 [geometry] Some progress but don't compile 2021-12-11 21:21:18 +01:00
Laury
3ccfdf0365 [geometry] Also not working 2021-12-06 20:43:13 +01:00
Laury
6aad7d2279 [geometry] Not working third menu 2021-11-11 17:46:45 +01:00
Laury
5c1f192228 [geometry] Base app and firsts two menu (WIP) 2021-11-05 13:49:01 +01:00
Laury
84d88a3e8d [Apps] Updated submodules 2021-10-31 21:58:49 +01:00
lolocomotive
00b5d4b9fe Make gutter view background the right width (#70) 2021-10-31 21:43:29 +01:00
Lauryy06
2aee07ae55 [github] Updated issue templates 2021-10-31 21:40:52 +01:00
Yaya-Cout
41b2b64d80 Fix somes Upsilon name in somes files (#61) 2021-10-28 22:23:10 +02:00
Mino1289
473b0bbfcb [apps/settings|code] Add a Flag to remove Code option in settings if code app is not compiled (#67) 2021-10-28 22:20:00 +02:00
Mino1289
58ef8cb95d [apps/code] Remove import of mathsup (residue of #50) (#63) 2021-10-28 19:15:53 +02:00
Mino1289
5dce215165 [build/config.mak] Update of base theme (#64) 2021-10-28 19:15:26 +02:00
lolocomotive
f2f44f0f6f Make use theme colors instead of hard-coded ones (#65) 2021-10-28 19:13:21 +02:00
Laury
fbe542e5bf [python] Fix bug in draw_string 2021-10-28 14:41:33 +02:00
Laury
0a1b3bcaee [theme] Added upsilon light theme 2021-10-28 14:38:32 +02:00
Laury
f6e937a927 [settings] Bug fix in code options controller 2021-10-27 19:35:19 +02:00
Laporte
c4ed8f84d3 Custom themes script (#46) 2021-10-27 19:30:35 +02:00
Yaya-Cout
8e1b311be0 [apps/settings] Fix gamma selector (#60) 2021-10-27 19:29:53 +02:00
lolocomotive
89e51166e7 Make battery background use appropriate colors (#59) 2021-10-27 10:10:14 +02:00
Mino1289
e4961563e9 [apps/code] Remove base python script and add mathsup.py (#50) 2021-10-25 16:27:21 +02:00
Laury
e72b0f633e [calculation] Fix bug in second degree list controller 2021-10-24 19:31:14 +02:00
Hector
0550b66c03 Dark Theme changes (#42)
* Dark Theme changes

* added reader icon for dark mode

* epsilon Dark Theme changes
2021-10-20 23:11:30 +02:00
Lauryy06
e41910e2f8 [workflow] Re-update SDK version of emscripten 2021-10-20 22:38:49 +02:00
Lauryy06
d91ae29607 [workflow] Change sdk of emscripten for tests 2021-10-20 22:36:18 +02:00
ArtichautCosmique
3b90969b42 [mpy] Enabled property/etc decorators (#52) 2021-10-20 22:26:01 +02:00
lolocomotive
bd207cb845 Replace hard-coded color values with Palette colors and use the correct palette colors (#51) 2021-10-20 22:25:27 +02:00
lolocomotive
917ba7ce83 Allow themes to override default colors (#49) 2021-10-20 22:20:19 +02:00
135 changed files with 2178 additions and 288 deletions

View File

@@ -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]

View File

@@ -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: ''

View File

@@ -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: ..........#....

View File

@@ -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}

View File

@@ -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
View File

@@ -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

View File

@@ -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
``` ```

View File

@@ -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:

View File

@@ -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

View File

@@ -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) {

View File

@@ -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;
}; };

View File

@@ -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 {

View File

@@ -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 \

View File

@@ -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);
} }
} }

View File

@@ -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

View File

@@ -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() {

View File

@@ -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 &parabolaScriptTemplate;
}
} }

View File

@@ -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; }

View File

@@ -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
View 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
View 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
View 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

View 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"

View 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"

View 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"

View 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"

View 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"

View 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"

View 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"

View 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"

View 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"

View File

@@ -0,0 +1 @@
#include "figure_store.h"

View 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

View 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

View 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

View File

@@ -0,0 +1,6 @@
#ifndef FIGURES_H
#define FIGURES_H
#include "point_by_coordinates.h"
#endif

View File

@@ -0,0 +1 @@
#include "point.h"

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,15 @@
#include "banner_view.h"
namespace Geometry {
BannerView::BannerView(
Responder * parentResponder,
InputEventHandlerDelegate * inputEventHandlerDelegate,
TextFieldDelegate * textFieldDelegate
) :
Shared::XYBannerView(parentResponder, inputEventHandlerDelegate, textFieldDelegate)
{
}
}

View 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

View 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... */
}
}

View 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

View 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;
}
}
}

View 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

View 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;
}
}

View 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

View 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]);
}
}

View 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

View 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;
}
}

View 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

View 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;
}
}

View 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

View 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;
}
}

View 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

View 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

View File

@@ -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
1 Default geometry calculation rpn graph code statistics probability solver atomic sequence regression reader settings
2 HidePython geometry calculation rpn graph code statistics probability solver atomic sequence regression reader settings

View File

@@ -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();
} }

View File

@@ -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)};

View File

@@ -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)};

View File

@@ -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)};

View File

@@ -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)};

View File

@@ -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;
} }

View File

@@ -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
} }
} }

View File

@@ -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;
}; };
} }

View File

@@ -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);
} }
} }

View File

@@ -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

View File

@@ -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();

View File

@@ -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 {

View File

@@ -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);
} }

View File

@@ -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:

View File

@@ -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>

View File

@@ -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());

View File

@@ -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,

View File

@@ -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"

View File

@@ -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 &);
} }

View File

@@ -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)

View File

@@ -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);

View File

@@ -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) },

View File

@@ -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)

View File

@@ -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());
} }

View File

@@ -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
View 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

View File

@@ -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
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -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": {

View File

@@ -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": {

View 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"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 851 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Some files were not shown because too many files have changed in this diff Show More