Compare commits

..

368 Commits

Author SHA1 Message Date
devdl11
e8a1bc6149 Creation of a protection system against unintentional updates to Epsilon 16 (foundation) + Recovery Improvement (#37) 2021-11-11 18:20:16 +01:00
Lauryy06
b304a2ff7d [github] Update bug_report.md 2021-11-11 17:47:12 +01:00
Mino1289
50ee8021f3 [apps/settings] Fixing newline with Flag checking (#77) 2021-11-09 19:28:45 +01:00
lolocomotive
ed7e0bd915 Show battery percentage in about menu (#69) 2021-11-05 13:46:42 +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
Laury
9c9758fcb6 [reader] update README 2021-10-15 14:50:03 +02:00
Laury
83ce9d5e86 [reader] Rich text support (look at README.md) 2021-10-15 14:47:00 +02:00
ArtichOwO
d4f0c7d3e8 Added sys to the code toolbox 2021-10-15 14:47:00 +02:00
ArtichOwO
2837b240e9 [mpy] Added sys module
Removed useless "path" and "argv"
2021-10-15 14:46:39 +02:00
ArtichautCosmique
0906dc919b [mpy/kandinsky] Fix draw_string() on new line + good colors (#47)
* [mpy/kandinsky] Use good colors

* [kandinsky/context_text] Avoid returning to pos x=0 on new line, use arg's x coordinate instead
2021-10-11 20:25:03 +02:00
Faustin
9cda9d9e59 [apps/code] Add a settings for autocomplete (#36) 2021-10-07 21:48:19 +02:00
Yaya-Cout
553f3fc682 [apps/settings] Use right key to enable setting (#35) 2021-10-07 20:36:03 +02:00
Mino1289
9fdedecbff [apps/toolbox] Order of submenus & New electricity constants (#34) 2021-10-06 18:26:17 +02:00
Lauryy06
83c63a7011 [readme] Update readme 2021-10-01 21:37:44 +02:00
Yolwoocle
9636964cb9 Better English translation (#32) 2021-09-29 18:31:10 +02:00
Yaya-Cout
69d6ad5205 Add get_keys in toolbox and fix setlocaltime description (#33) 2021-09-29 18:30:30 +02:00
Laury
f9a123cc08 [mpy/ulab] Added support of from and to bytes array methods 2021-09-28 20:50:34 +02:00
Lauryy06
56f735e302 [github] update metric-workflow.yml 2021-09-26 20:50:53 +02:00
ArtichautCosmique
0a5e9e0889 [apps/code][mpy][makefile] Fix size error on n0100 (#30) 2021-09-26 20:37:56 +02:00
apoleon33
8c949d7048 [build]changed color of upsilon logo in pimp.mak (#31) 2021-09-26 20:36:13 +02:00
Laporte
2f7edc5024 Update pimp.mak (#29)
* Update pimp.mak

Mise a jour du pimp.mak pour le nouveau slogan et le logo ascii.

* Update pimp.mak
2021-09-26 14:25:00 +02:00
Lauryy06
cd40938b26 [readme] Add a capital line 10 2021-09-25 19:52:14 +02:00
ArtichautCosmique
0b54bf13f4 [storage][apps/code] Change sizes (#28) 2021-09-25 19:49:26 +02:00
Laury
f5f11c6478 [poincare] Added simplification of equals 2021-09-25 19:32:23 +02:00
ArtichautCosmique
efda561425 [ion/device/flasher] Pimp my flasher (light & verbose) (#27) 2021-09-25 18:55:43 +02:00
Lauryy06
15c96cefa6 [readme] Update french readme 2021-09-25 10:29:29 +02:00
Lauryy06
400d03ebdb [readme] Addition of a "useful links" section 2021-09-25 10:25:57 +02:00
Lauryy06
6f48adde7d Merge pull request #25 from Mino1289/upsilon-dev-dev 2021-09-25 10:17:21 +02:00
Mino1289
3a573b1204 [apps/code] fix typo 2021-09-24 11:15:56 +02:00
Mino1289
48598296cf [apps/code] Increase of number of variables loaded in the variable box 2021-09-24 11:09:23 +02:00
Lauryy06
a54d60644f Merge pull request #21 from ArtichOwO/USB-Prompt-Palette-Fix 2021-09-23 21:07:20 +02:00
Lauryy06
d579e9d14c Merge pull request #22 from ArtichOwO/Localisation-Palette-FIx 2021-09-23 21:05:57 +02:00
ArtichOwO
db0ae2f7a0 [apps/shared] Fixed localization text bg 2021-09-23 00:44:53 +02:00
ArtichOwO
2a66fbb75d [apps/usb] Fixed "white bg" text on usb prompt 2021-09-23 00:29:09 +02:00
Lauryy06
feb94af827 Merge pull request #19 from Yaya-Cout/upsilon-dev
[code/time] Add somes functions in python toolbox
2021-09-21 12:49:56 +02:00
Yaya.Cout
0b564510e7 [code/time] Add time in python toolbox 2021-09-20 17:21:41 +02:00
Lauryy06
05227184a1 [readme] Add a space line 152 2021-09-18 21:47:27 +02:00
Lauryy06
e551c69d06 Merge pull request #16 from lemoustachu/upsilon-dev 2021-09-18 21:33:40 +02:00
Laury
37c7b85da8 [reader] Removed unused include 2021-09-18 21:15:28 +02:00
Laury
0bed38576a [reader] Fix bug when changing page 2021-09-18 21:13:45 +02:00
Laury
7c02c9e72f [reader] Binded python font choice to reader files 2021-09-18 21:13:45 +02:00
Lauryy06
a5584634e5 Merge pull request #15 from Yaya-Cout/upsilon-dev 2021-09-18 13:12:02 +02:00
lemoustachu
62e5b3e135 update README.md 2021-09-18 08:49:47 +02:00
lemoustachu
62f43f393d removed abusive double <br> in readme 2021-09-18 08:47:49 +02:00
lemoustachu
3318780d7d update README.md by adding beaks to clearify the code 2021-09-18 08:44:40 +02:00
lemoustachu
a9fc3b7850 update tutorial on readme.md to build Upsilon 2021-09-18 08:41:08 +02:00
Yaya.Cout
959efdc995 [reader] Disabled reader app on N100 2021-09-17 19:28:53 +02:00
Lauryy06
fa278b0d78 Merge pull request #9 from FaustinM/omega-dev-get-battery-data 2021-09-15 18:39:48 +02:00
Lauryy06
e8044f938e Merge branch 'upsilon-dev' into omega-dev-get-battery-data 2021-09-15 18:38:40 +02:00
Lauryy06
02f4f6fe74 Merge pull request #13 from lemoustachu/upsilon-dev 2021-09-15 18:37:34 +02:00
Hugo Berthet-Rambaud
fe973b0535 update README.md
changed cd Omega to cd Upsilon
2021-09-13 08:38:53 +02:00
Hugo Berthet-Rambaud
71a764277f Merge branch 'Lauryy06:upsilon-dev' into upsilon-dev 2021-09-13 07:57:08 +02:00
Hugo Berthet-Rambaud
f6379d16fd Update README.md
just changed cd Omega to cd Upsilon in binpack commmands
2021-09-13 07:54:37 +02:00
Laury
2156ca7e42 [calculation] Added additional output about second degree polynomials 2021-09-12 21:28:07 +02:00
FaustinM
2f3339dff7 Removed a modified file from pull request 2021-09-12 00:15:55 +02:00
FaustinM
48a0da8a95 Add more python functions in ion module
Ion.battery_level() return a int with the current battery level
Ion.battery_ischarging() return a bool with the current battery charging state
bugfix for upsilon
2021-09-12 00:06:44 +02:00
FaustinM
3460e9ffd8 Merge remote-tracking branch 'origin/upsilon-dev' into upsilon-dev-get-battery-data 2021-09-11 21:16:23 +02:00
Laury
1487acbe38 [git] Added .vs to gitignore 2021-09-11 19:57:36 +02:00
Laury
367f64dac8 [reader] Fixed a bug when going backwards 2021-09-08 21:42:39 +02:00
Laury
19ee32986f [reader] Make improve coding style and added empty view message 2021-09-05 21:28:45 +02:00
Laury
7f0b8170d4 Merge OmegaWithReader 2021-09-05 17:44:51 +02:00
Lauryy06
bba7408e6c Merge upsilon-dev-ulab 2021-09-05 17:21:34 +02:00
Lauryy06
838ee83a8c Merge pull request #6 from Yaya-Cout/upsilon-dev
Fix OmegaVersion in settings
2021-09-05 17:01:15 +02:00
Laury
74c500df01 [code/ulab] removed unnecessary module utils 2021-09-05 16:57:50 +02:00
Laury
98b665ac4b [code/ulab] Disabled scipy in toolbox for n0100 + added 2 forgotten numpy functions 2021-09-05 16:57:09 +02:00
Laury
0f4502ebce [code/ulab] Added scipy 2021-09-05 16:27:44 +02:00
Yaya.Cout
9eb81a6daf Fix OmegaVersion in settings 2021-09-05 11:49:42 +02:00
Laury
a15c682e3e [code/ulab] Replaced translations by official documentation 2021-09-04 21:23:23 +02:00
Laury
74635f8d88 [code/ulab] Added ulab to toolbox 2021-09-03 22:57:04 +02:00
Yaya-Cout
ebe6a7cc5f Merge pull request #2 (Update some translations) 2021-09-02 17:58:23 +02:00
Lauryy06
3a4e33a1a7 Merge pull request #2 from ArtichOwO/uLab 2021-09-01 18:03:06 +02:00
Lauryy06
dd757969f3 [readme] Correct readme.fr 2021-09-01 18:00:24 +02:00
Laporte
0df76f1680 [readme] Update readme
* Update README.fr.md

* Update README.md
2021-09-01 17:58:06 +02:00
Laury
788e75eb4a Merge branch 'upsilon-dev' of https://github.com/Lauryy06/Upsilon into upsilon-dev 2021-09-01 17:53:01 +02:00
Laury
7b4a94296b [calculation][poincare] Revert 'b8544e3' and improve equal simplification 2021-09-01 17:31:51 +02:00
Lauryy06
86511cc59d Merge pull request #1 from ArtichOwO/FixMacSrc-StoreScript
[ion/mac] Added missing source
2021-09-01 17:20:53 +02:00
Laury
d90af0323e Merge omega-dev into upsilon dev 2021-08-31 23:03:30 +02:00
Laury
c0739b0e06 [atomic] updated submodule 2021-08-31 19:23:09 +02:00
Laury
210a83b04d [python/kandinsky] Added get_palette() function 2021-08-31 16:17:36 +02:00
Laury
fb4fc4862d [python] Enable operator overload 2021-08-31 15:48:11 +02:00
Laury
74c6bea8f8 Merge commit 'dc8a1d48d9e29fd2fc87ddd8075f6d7047a1aadb' into upsilon-master 2021-08-30 21:09:18 +02:00
Laury
7c1dc4d5c3 [python] merge '6fcab395' and fix a bug in fill_polygon() 2021-08-30 19:40:30 +02:00
ArtichOwO
eb02fb5baa [ion/mac] Added missing source 2021-07-14 19:52:32 +02:00
Laury
6fcab3952f [python] Add some useful functions in kandinsky 2021-07-08 22:34:43 +02:00
M4x1m3
5a6dfd8a20 [ci] Remove duplicate tests action 2021-07-07 12:09:08 +02:00
Hyperengined
c8afdcacab [ion/battery] Doubled hysteresis to avoid sudden fluctuactions 2021-07-07 11:49:19 +02:00
Fevret
ef45fab63d [themes] Improved epsilon-dark icons 2021-07-07 11:43:14 +02:00
Laury
0366c4cd00 [home] Added support for a wallpaper in a special format (.obm) 2021-07-06 16:48:57 +02:00
Maxime FRIESS
dc8a1d48d9 [escher] Remove unnecessary include 2021-07-06 16:23:28 +02:00
Laury
649f48919e [home] Added support for a wallpaper in a special format (.obm) 2021-07-06 14:54:55 +02:00
Maxime FRIESS
c3b752d6cc Merge pull request #544 from ArtichOwO/omega-dev-OS-attributes
[MPY/MOD/OS] Added new function and attribute to OS module
2021-06-29 21:06:11 +02:00
Maxime FRIESS
c5ca1e916a Merge branch 'omega-dev' into omega-dev-OS-attributes 2021-06-29 20:52:29 +02:00
ArtichOwO
24f3ccf007 Removed username from "uname()", and "getlogin()" now uses "Ion::username()" 2021-06-29 20:41:12 +02:00
ArtichOwO
25b74ea2f8 Removed "Omega or Epsilon" check 2021-06-29 20:40:19 +02:00
Maxime FRIESS
0e7db3ce8a Merge pull request #548 from Pixelpunker/omega-dev
Some corrections and many additions to German translation, mostly Python toolbox
2021-06-29 17:52:45 +02:00
Pixelpunker
786a3273da All translated german strings limited to 35 characters 2021-06-29 17:11:10 +02:00
Pixelpunker
ed54927c5b Fix for 4 translation keys 2021-06-28 16:41:40 +02:00
Pixelpunker
2ee86ce52f Fix build error "BetaVersionMessage4" 2021-06-28 16:31:52 +02:00
Pixelpunker
a3720d3d76 Some corrections and many additions to German translation, mostly Python toolbox 2021-06-28 16:09:49 +02:00
ArtichOwO
837fcd9bcc [MPY/MOD/ULAB] Added N100 compatibility
N100:
- doesn't have Scipy;
- uses function pointers
2021-06-23 23:08:46 +02:00
ArtichOwO
b0befbdbc5 [MPY/MOD] Added uLab 2021-06-23 22:40:41 +02:00
FaustinM
cf9142b5a2 Add "ion.battery()" for obtain the current voltage of the battery
Ion.battery() return a float with the current battery voltage

TODO : Update the translation of the toolbox (only FR and EN currently)
2021-06-23 16:57:42 +02:00
FaustinM
80587f35f1 Add a new entry in about menu to see current voltage
- Add a new traduction for this entry
- Add the entry in submenu
2021-06-23 16:55:37 +02:00
ArtichOwO
ba94c7db00 [Code/Toolbox] Added "getlogin()" to code toolbox 2021-06-21 23:24:50 +02:00
ArtichOwO
4c29b05b53 [MPY/MOD/OS] Added "name" attribute, "getlogin()" function and "username" key in "uname()"
"os.name" returns either "Omega" (only if OMEGA_VERSION is defined) or "Epsilon"
"os.getlogin()" returns the calculator owner username
"os.uname()" returns an object which has now the "username" attribute
2021-06-21 19:34:26 +02:00
Maxime FRIESS
85f8f4fedd Merge pull request #538 from RedGl0w/omegaV15-5
Omega with epsilon 15.5
2021-06-20 22:22:26 +02:00
Maxime FRIESS
e62c328661 Merge pull request #536 from RedGl0w/omegaFixCI
[code/tests] Fix issue with toolboxIonKeys
2021-05-27 18:55:16 +02:00
Joachim LF
080ac51aae [Simulator/android] Fix language auto selection 2021-05-15 09:19:01 +02:00
Joachim LF
bf5f24f96c [Simulator/windows] Fix deleted file 2021-05-14 21:10:47 +02:00
Joachim LF
7e24502414 [Simulator] Use std::cout and added dummy store_script 2021-05-14 20:04:59 +02:00
Joachim LF
dd45419006 [Simulator/windows] fix build 2021-05-14 19:45:57 +02:00
Joachim LF
aba2388253 [Ion/web] Fix build 2021-05-14 19:41:37 +02:00
Joachim LF
5fca77a8f8 [Build] Disable telemetry 2021-05-14 14:18:10 +02:00
Joachim LF
f258da16f1 [Build] revert binpack move 2021-05-14 14:16:41 +02:00
Joachim LF
35e4146551 [Workflow/unit] change target name 2021-05-14 13:35:44 +02:00
Joachim LF
76dad83aec [n0110] Disable OTP lock 2021-05-14 13:29:49 +02:00
Joachim LF
f999c796c3 [Upstream] Merged epsilon 15.5 2021-05-14 13:28:22 +02:00
Maxime FRIESS
f86c22f10b Merge pull request #528 from RedGl0w/patch-20
Delete .gitlab-ci.yml
2021-05-12 23:58:36 +02:00
Maxime FRIESS
c841362a63 Merge pull request #535 from RedGl0w/fixLocalization
[shared/localization] Fix theme palette
2021-05-12 23:55:35 +02:00
Joachim LF
33ad74e1be [code/tests] Fix issue with toolboxIonKeys 2021-05-12 19:56:34 +02:00
Joachim Le Fournis
e4aa82e62a [shared/localization] Fix theme palette
this fixes https://github.com/Omega-Numworks/Omega/issues/534
2021-05-12 12:06:18 +02:00
Joachim Le Fournis
f40fe27b68 Delete .gitlab-ci.yml 2021-04-26 12:09:58 +02:00
Gabriel Ozouf
3e071a59fe build: Version 15.5.0 2021-04-16 10:53:34 +02:00
Gabriel Ozouf
f50f22081c [apps/main] Move lockUnlockedPCBVersion to ion_main
Although we always include the on-boarding when releasing a firmware,
moving this method here costs nothing and prevents mistakes if we ever
decide to remove on-boarding.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
313b5ed222 [apps/settings] Add comment on version cycle display 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
f8798aa561 [ion] Move pcbVersion method to its own file 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
46acd4eb61 [ion/device/n0110/internal_flash] Add method OTPLockAddress 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
018ea07796 [ion/device] Add comments and rename variables for clarity 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
d7f41e306c [ion/device/n0100] Add comment on dummy PCB version methods 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
029dc2be5e [build/targets.device.n0110] Move flag before target
This is in keeping with the order set up in build/all.mak.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
bf99a2976b [build] Improve comments 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
03c85c0b0e [ion/device/external_flash] Move model specific code
As the N0100 does not have an external flash chip, the code to handle
the external flash does not need to be compiled on this model.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
bd0c7de2bf [ion] Create method to lock PCB versions on old boards 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
08f351fe31 [settings] Add PCB version to software version / patch level cycle 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
0282104086 [ion] Add getter method for PCB version in string form 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ed95b46c5b [build/n0110] Set PCB_LATEST to proper PCB version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
b8727bc256 [ion/device] Rename some PCB version methods 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
5ccf8d6b97 [ion/device/external_flash] Add dsb instruction in method wait
This mimics the behavior of InternalFlash::wait, and fixes a bug found
on the bench when reading the flashed firmware.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
b80daf70d3 [ion/device/n0110/usb] Consolidate configs of Vbus pin
Even though the configuration of the Vbus pin depends on the hardware
running Epsilon, we do not actually need one VbusPin object for each
configuration. Indeed, an AFGPIOPin object can be used to configure the
pin as a standard GPIO, provided one does not call its init() method.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
36655f1c19 [ion/device/n0110] Change getter for OTPAddress 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ed18f1e95f [ion/device] Lock OTP after writing version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
cbb435d656 [ion/device] Adapt behaviour in factory
When flashing fo the first time, we need Epsilon to know the PCB version
before the OTP are flashed. We also need the to prevent Epsilon from
writing the OTP outside of the factory.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
00b74430cd [build] Add mendatory USE_IN_FACTORY variable to binpack rule
This variable specifies whether the binpack is used for first-time
flashing on assembly-line, or for diagnostic later on.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
8705ddaf8a [ion/device/bench] Add command to write and validate PCB version 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
ddae6607f9 [ion/device/n0110] Deduce Vbus config from PCB version
Revised PCB (version number > 0) should configure Vbus as a GPIO instead
of an alternate function.
2021-04-16 10:46:10 +02:00
Gabriel Ozouf
c4ef2016ba [ion/device/n0110] Methods to read and write PCB version in OTP 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
524a7d9619 [ion/device/n0110] Define OTP blocks in internal flash 2021-04-16 10:46:10 +02:00
Gabriel Ozouf
e456667d5e [ion/device] Add parameter PCB_LATEST
This indicates the latest PCB revision on which this version of Epsilon
can run.
2021-04-16 10:46:10 +02:00
Léa Saviot
3000431f3b build: Version 15.3.6 2021-03-29 10:20:17 +02:00
Léa Saviot
50a32b470d [ion/drivers/external_flash] Remove assertion unvalid on n0100 2021-03-29 10:20:17 +02:00
Léa Saviot
3746354f26 [ion/external_flash] Code cleaning 2021-03-29 09:55:00 +02:00
Léa Saviot
8fae36bcd3 [ion/external_flash] Use both possible commands for QuadPageProgram 2021-03-29 09:55:00 +02:00
Léa Saviot
9e9c088e9e [ion/external_flash] Code cleaning 2021-03-29 09:55:00 +02:00
Léa Saviot
a635ecf59b [ion/external_flash] Make the AT25SF641B work
Main changes are:
- No QPI but QuadSPI
- Use 32 command instead of 33
- Better programming of the instruction/address/data modes, according to
the 641B spec
- Use sOperatingMode instead of DefaultOperatingMode

TODO:
- Support both QPI and QuadSPI, for both flashs
- There is still confusion between sOperatingMode and DefaultOperatingMode
  -> DefaultOperatingMode should not really be used
  -> Read and write commands assume quad operation
2021-03-29 09:55:00 +02:00
Hugo Saint-Vignes
a6ae1957d1 build: Version 15.3.5
Change-Id: I79e237766ba64f1e14b8e2889611153437ee6775
2021-03-24 10:49:08 +01:00
Hugo Saint-Vignes
3686f819d6 [ion/src/simulator] Add headers and fix Macros for iOS
Change-Id: I0f1f888e4823fc9a80a7ac986cf8732dc9df2998
2021-03-24 10:12:11 +01:00
Hugo Saint-Vignes
382c303bd2 [build] Update EPSILON_TELEMETRY variable precedence 2021-03-23 14:49:09 +01:00
Hugo Saint-Vignes
402858739e [ion/simulator/android] Fix method signature
Change-Id: I7ac83b8b3a4eca82313e9de3e3d9f5a76ff92951
2021-03-23 14:48:40 +01:00
Hugo Saint-Vignes
192794e299 [ion/simulator/android] Delete JNI local references in platform_language.cpp
Change-Id: I28251ec57ed0c87922efc2689f587f6bc0daaa76
2021-03-23 14:48:29 +01:00
M4x1m3
6f797833b2 [omega] 1.22.1 2021-03-21 20:31:06 +01:00
M4x1m3
44d745eff3 [apps] Updates atomic 2021-03-21 20:24:23 +01:00
Cyprien Méjat
4e7a846540 [config.mak] Dev Branch 1.22 incrementation (#517) 2021-03-21 18:24:46 +01:00
M4x1m3
a35fb141c4 [ion] Made username volatile
This ensures the compiler doesn't assume that the username is fixed, allowing
us top change it before flashing, to let the user change his username.
2021-03-20 20:14:12 +01:00
Léa Saviot
58602544e2 build: Version 15.3.4 2021-03-17 09:52:00 +01:00
Cyprien Méjat
4242c77d64 [themes] Omega Atomic dark theme (#516)
* update dark mode in atomic

* Fix mistake

* update atomic epsilon dark
2021-03-16 23:55:44 +01:00
Quentin Guidée
58ff19858f [omega] 1.22.0 2021-03-15 21:54:08 +01:00
M4x1m3
f1d15022aa [apps/code] Removed keys from HU catalog 2021-03-15 21:46:56 +01:00
Maxime FRIESS
fc3986f65a Merge pull request #513 from RedGl0w/IonToolboxEpsilon
[Code] Added ion keys submenu
2021-03-15 21:42:50 +01:00
Maxime FRIESS
b795834c63 Merge branch 'omega-dev' into IonToolboxEpsilon 2021-03-15 21:23:35 +01:00
M4x1m3
9c8112658e Fixed device build 2021-03-15 21:05:52 +01:00
Maxime FRIESS
ed86abebde Merge pull request #511 from RedGl0w/strcmp
Strcmp
2021-03-15 20:49:52 +01:00
M4x1m3
671321db10 Merge branch 'RedGl0w-kmat' into omega-dev 2021-03-15 20:48:54 +01:00
M4x1m3
3ccd7d0fb7 Merge branch 'kmat' of https://github.com/RedGl0w/epsilon into RedGl0w-kmat 2021-03-15 20:48:43 +01:00
Maxime FRIESS
4f34cd17a1 Merge pull request #510 from RedGl0w/patch-12
[Calculation/expression_field] EE add Ans
2021-03-15 20:28:00 +01:00
M4x1m3
5cd22c9429 Merge branch '0b101-epsilon-appShortcuts' into omega-dev 2021-03-15 20:24:45 +01:00
M4x1m3
893539b76e Merge branch 'epsilon-appShortcuts' of https://github.com/0b101/Omega into 0b101-epsilon-appShortcuts 2021-03-15 20:24:33 +01:00
Joachim LF
b2e2f3c5a6 [Code] Added ion keys submenu 2021-03-15 20:10:54 +01:00
Maxime FRIESS
48ec836129 Merge pull request #508 from RedGl0w/CRLF
[Ion/clipboard] Remove CR when there's LF next
2021-03-15 19:52:51 +01:00
M4x1m3
3d320b2768 Merge branch 'Lauryy06-master' into omega-dev 2021-03-15 19:50:33 +01:00
M4x1m3
134456267b Merge branch 'master' of https://github.com/Lauryy06/epsilon into Lauryy06-master 2021-03-15 19:50:10 +01:00
Maxime FRIESS
d2df42bc35 Merge pull request #506 from RedGl0w/DrawStringFont
Draw string font
2021-03-15 19:34:39 +01:00
Maxime FRIESS
20d7094352 Merge branch 'omega-dev' into DrawStringFont 2021-03-15 19:31:16 +01:00
Maxime FRIESS
d95b50abef Merge pull request #505 from numworks/master
Pull epsilon master
2021-03-15 19:29:12 +01:00
M4x1m3
ed03aae9ed [apps] Fixed missing dynamically-generated dependency 2021-03-15 17:29:37 +01:00
Maxime FRIESS
32f567c60a Merge pull request #504 from quentinguidee/omega-dev-atomic-theme
[themes] Change Atomic app theme
2021-03-13 23:55:47 +01:00
Quentin Guidée
83e6fc9579 [themes] Change atomic theme 2021-03-13 23:43:45 +01:00
M4x1m3
73585d9f48 Changed from Atom to Atomic in README 2021-03-12 18:16:12 +01:00
M4x1m3
8a400b7871 Updated atomic 2021-03-12 18:11:46 +01:00
Laury
297fbd3c00 [python] Add a draw_line function in kandinsky 2021-03-11 19:47:22 +01:00
Léa Saviot
ece6aa5f27 [build/targets.simulator.web.mak] Rule for htmlpack.official.zip 2021-03-10 11:49:57 +01:00
Joachim LF
8feb8e3ea2 [Python/kandinsky] Added font constant 2021-03-08 18:03:15 +01:00
Joachim LF
7b57f31fbf [Python/kandinsky] Added in draw_string choice of font 2021-03-08 17:56:49 +01:00
Émilie Feral
6b8db108d2 [build] Add comment to dfu.py 2021-03-08 10:53:01 +01:00
Joachim LF
cf8ecfb438 [pyUSB] Update to V1.1.1 a54ebc7 2021-03-08 10:53:01 +01:00
Joachim LF
5605515fa1 [Ion/clipboard] Remove CR when there's LF next 2021-03-05 10:42:15 +01:00
Romain Goyet
30cfa022d1 [ion] Don't set the window title when screen only
Prevents the web simulator from overriding the HTML page's title
2021-03-03 12:37:15 -05:00
Léa Saviot
23f3407267 build: Version 15.3.3 2021-03-03 15:59:44 +01:00
Léa Saviot
1006b951b9 [ion/src/simulator] Fix journal.cpp 2021-03-03 15:37:57 +01:00
Romain Goyet
43b7f767ee [ion/simulator/web] Clean the htmlpack API 2021-03-03 15:37:57 +01:00
Romain Goyet
eb0ca7b118 [ion/simulator/web] Add a loader 2021-03-03 15:37:57 +01:00
Romain Goyet
0cdfc44c6f [ion/simulator/web] Improve dependency tracking 2021-03-03 15:37:57 +01:00
Romain Goyet
2ebff40c62 [ion/simulator/web] Implement a custom journal with callbacks
This journal adds two new callbacks:
 - onIonEvent
 - onEpsilonIdle
2021-03-03 15:37:57 +01:00
Romain Goyet
c66db8c98d [ion] Actually send None events to the destination journal
Said journal will most likely ignore it, but it gives it the opporunity
to do something about it.
2021-03-03 15:37:57 +01:00
Romain Goyet
a6b13185ab [ion/simulator] Extrude the QueueJournal class 2021-03-03 15:37:57 +01:00
Romain Goyet
e8956f4293 [build/simulator/web] Add a htmlpack target 2021-03-03 15:37:57 +01:00
Romain Goyet
36a40faaaf [build/emscripten] Silence the Emterpreter warning 2021-03-03 15:37:57 +01:00
Romain Goyet
2554ec666e [build] Add a rule to build a ZIP file out of its dependencies 2021-03-03 15:37:57 +01:00
Romain Goyet
1aac2a1d4d [ion/simulator/web] Use a shared layout.json file 2021-03-03 15:37:57 +01:00
Romain Goyet
32d591317b [simulator/web] Use specialHTMLTargets to allow picking a canvas 2021-03-03 15:37:57 +01:00
Romain Goyet
2703f9a506 [build] Add prerequisite path when processing through CPP 2021-03-03 15:37:57 +01:00
Romain Goyet
497e4890b1 [ion/simulator/web] Fix the build 2021-03-03 15:37:48 +01:00
Romain Goyet
6c389c9a1d [ion/simulator] Get rid of useless Ion:: prefixes 2021-03-03 15:37:48 +01:00
Romain Goyet
699cf22023 [ion/simulator] Don't enable the framebuffer in headless mode
A quick test on a state file with 64k events took 2.5 seconds to process
with the framebuffer vs 1.9 without.
2021-03-03 15:37:48 +01:00
Romain Goyet
543d3d540e [ion/simulator] Use shutdown instead of quit 2021-03-03 15:37:48 +01:00
Romain Goyet
2f2e45a6a5 [ion/simulator] Headless simulator maps Ion::Console to stdio 2021-03-03 15:37:48 +01:00
Romain Goyet
a834c954b8 [ion/simulator] Get rid of the headless target 2021-03-03 15:37:48 +01:00
Romain Goyet
2bee7eb267 [ion] Make Ion::Events::Journal optional 2021-03-03 15:37:48 +01:00
Romain Goyet
6d18c33068 [ion/simulator] State files can have a wildcard version 2021-03-03 15:37:48 +01:00
Romain Goyet
8242113641 [ion/simulator] Ignore invalid events in nws files 2021-03-03 15:37:48 +01:00
Romain Goyet
7c8c7f79f6 [ion/simulator] Don't leak file descriptors 2021-03-03 15:37:48 +01:00
Romain Goyet
f578c24af1 [ion/simulator] Used buffer I/O
Avoid making a syscall for every single byte
2021-03-03 15:37:48 +01:00
Romain Goyet
8059821025 [ion/simulator] Fix libpng/libjpeg usage 2021-03-03 15:37:48 +01:00
Romain Goyet
b32497da23 [ion/simulator] Remove a useless printf 2021-03-03 15:37:48 +01:00
Romain Goyet
c3c7651ca8 [ion/simulator] Add Termination event when headless 2021-03-03 15:37:48 +01:00
Romain Goyet
e8f1ea6aa5 [ion/simulator/sdl] Backport an Emscripten fix for setWindowTitle
See https://bugzilla.libsdl.org/show_bug.cgi?id=5133
2021-03-03 15:37:48 +01:00
Romain Goyet
ba3109e47a [ion/simulator] Fix the dummy language implementation 2021-03-03 15:37:48 +01:00
Romain Goyet
c2f8bbaf3c [ion/simulator] Load nws files sent from the host OS 2021-03-03 15:37:48 +01:00
Romain Goyet
0587e41b3c [ion/simulator] Support writing image files per-platform
Linux uses libpng, macOS/iOS use CoreGraphics, Windows GDI+
2021-03-03 15:37:48 +01:00
Romain Goyet
ab1df4fbef [ion/simulator] Unify iOS/macOS image loading 2021-03-03 15:37:48 +01:00
Romain Goyet
a4213dcca8 [ion/simulator] Allow "-" to designate stdin 2021-03-03 15:37:48 +01:00
Romain Goyet
2cf6f15dde [ion/simulator] Allow CTRL or GUI for common shortcuts 2021-03-03 15:37:48 +01:00
Romain Goyet
f37008d8d7 [ion/simulator] Ignore empty cli arguments 2021-03-03 15:37:48 +01:00
Romain Goyet
3740e0f135 [ion/simulator] Support headless msleep 2021-03-03 15:37:48 +01:00
Romain Goyet
cb3a6694a5 [ion/simulator/macos] Register the nws file extension 2021-03-03 15:37:48 +01:00
Romain Goyet
cba596dde7 [ion/simulator] Add actions 2021-03-03 15:37:48 +01:00
Romain Goyet
11f2b92e5d [ion/simulator/windows] Add an icon 2021-03-03 15:37:48 +01:00
Romain Goyet
a69fc679a9 [ion/simulator] Add StateFile support 2021-03-03 15:37:48 +01:00
Romain Goyet
f4905c59a2 [ion] Events::Journal has isEmpty 2021-03-03 15:37:47 +01:00
Romain Goyet
22b6990e63 [ion/simulator/android] Get the language directly
Without using the "--language" command-line option
2021-03-03 15:37:47 +01:00
Romain Goyet
09a7b9daca [ion/simulator] Sort the platform functions 2021-03-03 15:37:47 +01:00
Romain Goyet
0116dc2e07 [ion/simulator] Add a runtime "--headless" option
We probably can ditch the static headless version
2021-03-03 15:37:47 +01:00
Romain Goyet
37b8c56b3d [ion/simulator] Clean the callbacks 2021-03-03 15:37:47 +01:00
Romain Goyet
1a4cb3ad37 [ion/simulator] Add a Journal implementation 2021-03-03 15:37:47 +01:00
Romain Goyet
d4984722cf [ion/simulator] Rename the events_platform file 2021-03-03 15:37:47 +01:00
Romain Goyet
cbc3951ab1 [ion] Add an event journal
It's pretty much just two callbacks that one can hook into to get some
events in or out of Ion.

It adds a couple useless checks and pointers to any build and could be
hidden behind a feature flag, but the extra weight is minimal.
2021-03-03 15:37:47 +01:00
Romain Goyet
62aafa7597 [ion] Fix a comment 2021-03-03 15:37:47 +01:00
Romain Goyet
baf8b8cbf0 [ion/simulator] Clean the Keyboard implementation 2021-03-03 15:37:47 +01:00
Romain Goyet
90b25ecf51 [ion] Clean some dummy files 2021-03-03 15:37:47 +01:00
Romain Goyet
d02ce2dd16 [ion] Sort dummy functions
Dummy Ion-level functions should be in the top-level shared folder. And
dummy functions for simulator headers should be in the simulator folder.
2021-03-03 15:37:47 +01:00
Romain Goyet
79985a0199 [ion/simulator] Proper argument parsing 2021-03-03 15:37:47 +01:00
Romain Goyet
f10cd19616 [ion/simulator] Factorize the main function 2021-03-03 15:37:47 +01:00
Romain Goyet
945a7b8d56 [ion/simulator] Add a Window namespace 2021-03-03 15:37:47 +01:00
Romain Goyet
784234690c [ion/simulator] Sort Ion::Timing::msleep implementations 2021-03-03 15:37:47 +01:00
Romain Goyet
fd0284756f [apps] Simplify locale lookup by code 2021-03-03 15:37:47 +01:00
Yolwoocle
ca6a0bdcb6 [apps/code] Fix French translation mistakes (#500)
Corrected a few French translation issues in Python catalogue (lis -> lit; écris -> écrit)
2021-03-03 09:19:59 +01:00
Maxime FRIESS
35c4c7fa2e Merge pull request #499 from M4xi1m3/patch-151
Fixed issues with settings
2021-03-02 16:31:53 +01:00
M4x1m3
b08f793776 [apps/settings] Fix #151 2021-03-02 16:16:23 +01:00
M4x1m3
9f380bf424 [apps/settings] Fixed broken about submenu 2021-03-02 16:09:09 +01:00
Joachim Le Fournis
d7f7bbe862 [Inliner] Use png_destroy_read_struct 2021-03-02 09:56:10 +01:00
Joachim Le Fournis
4718ff8016 [Inliner] Fixed memory leak 2021-03-02 09:56:10 +01:00
Maxime FRIESS
a25ebc516a Merge pull request #498 from A2drien/credit-name
Update contributor and tester names (Omega 1.21)
2021-03-01 23:19:12 +01:00
A2drien
cabc1a9564 credit name update 2021-03-01 23:12:20 +01:00
Maxime FRIESS
acd80f06ed Merge pull request #495 from M4xi1m3/omega-atomic
[apps] Replaced atom with atomic
2021-03-01 21:52:37 +01:00
M4x1m3
c988233b84 [apps] Replaced atom with atomic 2021-03-01 20:10:58 +01:00
Maxime FRIESS
b3bba17306 Merge pull request #469 from RedGl0w/omegaSingleQuote
[Poincare/parser] support ' as derivative
2021-03-01 13:55:27 +01:00
Maxime FRIESS
668bd6ba48 Merge pull request #491 from RedGl0w/omegaUsernameHidden
[Settings] Always compile with empty username, and don't dipslay
2021-03-01 13:40:28 +01:00
Maxime FRIESS
af1be64644 Merge pull request #474 from M4xi1m3/units
Fixed python in debug and -j build issues
2021-02-28 09:38:02 +01:00
Maxime FRIESS
ea71a83143 Merge pull request #493 from M4xi1m3/patch-492
[external] Fixed #492
2021-02-27 23:52:04 +01:00
M4x1m3
30f1d8464c [external] Fixed #492 2021-02-27 23:42:06 +01:00
Joachim LF
6072307e34 [Settings] Always compile with empty username, and don't dipslay 2021-02-26 08:19:50 +01:00
Maxime FRIESS
4926e273ed Merge pull request #479 from Calvineries/omega-dev
ScriptSize French Translation
2021-02-25 15:25:28 +01:00
Maxime FRIESS
27ea26b03f Merge pull request #490 from M4xi1m3/jni-crash
[ion/android] Fix #489
2021-02-25 11:19:36 +01:00
M4x1m3
f274b34939 [ion/android] Fix #489 2021-02-25 10:00:44 +01:00
Quentin Guidée
9eff895a95 [omega] 1.21.0 2021-02-24 22:25:36 +01:00
Maxime FRIESS
6e7cf88e3f Merge pull request #487 from M4xi1m3/magnify-fix
[apps] Fixed #456
2021-02-24 21:53:42 +01:00
M4x1m3
ba6ee3f1b9 [apps] Fixed #456 2021-02-24 21:47:29 +01:00
ArtichautCosmique
41554caf27 [ion] Icon for the AUR repo (#484)
flat design this time
2021-02-21 18:59:52 +01:00
ArtichautCosmique
0a807c3b69 [ion] Brand new icon for the Windows simulator (#483) 2021-02-21 15:09:32 +01:00
ArtichautCosmique
73017819ac [ion] New icon for the macOS simulator (#464)
* New icon for the macOS simulator!!

* Added a shadow to the macOS icon
2021-02-19 19:04:21 +01:00
Maxime FRIESS
d0e0ee610c Merge pull request #470 from RedGl0w/omegaCIFix
Fix tests with omega and inf new symbol
2021-02-18 19:22:51 +01:00
Maxime FRIESS
a540ef8153 Merge pull request #480 from M4xi1m3/omega-dev
[ion/web] Fixed emscripten EGL error
2021-02-18 15:48:06 +01:00
M4x1m3
a77028a36b [ion/web] Fixed emscripten EGL error 2021-02-18 14:04:04 +01:00
Calvineries
1838024934 ScriptSize French Translation 2021-02-17 01:35:01 +01:00
Maxime FRIESS
0250ad8520 Merge pull request #473 from M4xi1m3/omega-dev
[external] Fixed #454
2021-02-16 18:32:10 +01:00
lapingenieur
fcc803d7c5 [readme] Added French README (#475)
Co-authored-by: Quentin <quentin.guidee@gmail.com>
Co-authored-by: Maxime FRIESS <M4x1me@protonmail.com>
2021-02-16 10:01:00 +01:00
Maxime FRIESS
d83e712256 Merge pull request #477 from gkelly/posix-shells
[build] Remove bash-ismes
2021-02-15 19:57:23 +01:00
M4x1m3
7c51ab2130 [apps] Fixed build issue when too much cores 2021-02-15 14:57:04 +01:00
M4x1m3
6628b54218 [py] Fixed Illegal Instruction when building in debug 2021-02-15 14:56:41 +01:00
M4x1m3
6f3cb70f64 [external] Fixed memory leak #454 2021-02-15 12:23:09 +01:00
Maxime FRIESS
77ec00bc50 Merge pull request #471 from M4xi1m3/mk-app-check
[build] Throw an error when user is missing apps
2021-02-13 22:13:46 +01:00
M4x1m3
085c90353d [build] Throw an error when user is missing apps 2021-02-13 22:01:27 +01:00
Joachim LF
b09da48748 [calculation/tests] Fix tests on omega 2021-02-12 10:21:42 +01:00
Joachim LF
ef3682b904 [Poincare/tests] Added infinity symbols 2021-02-12 09:05:41 +01:00
Joachim LF
135a56b6b3 [Poincare/tests] Fix ∞ tests 2021-02-12 09:05:15 +01:00
Joachim LF
491c873c90 [Poincare/parser] support ' as derivative 2021-02-12 08:36:57 +01:00
Maxime FRIESS
f6c9bb23c6 Merge pull request #468 from M4xi1m3/i18n-fix
[i18n] Fixed missing / duplicate entries.
2021-02-10 21:26:13 +01:00
M4x1m3
17284985f7 [i18n] Fixed missing / duplicate entries. 2021-02-10 21:11:10 +01:00
lapingenieur
76e1bf8822 [*.hu.i18n] Improved Hungarian translations 2021-02-10 20:03:36 +01:00
Maxime FRIESS
540c87c71f Merge pull request #465 from LeGmask/infinity
[poincare/parser] Use infinity symbol
2021-02-10 17:28:48 +01:00
Evann DREUMONT
391904900a [apps/toolbox] Add infinity in maths/calcul toolbox 2021-02-10 17:21:12 +01:00
Evann DREUMONT
763ce87d14 [poincare/parser] Use infinity symbol
- Use infinity symbol
- Parse inf, oo, infity
2021-02-10 17:20:14 +01:00
Joachim Le Fournis
37f78c5d4d [makefiles] Fix epsilon_run on windows 2021-02-08 18:02:15 -05:00
Hugo Saint-Vignes
4f2ea99c85 build: Version 15.3.2
Change-Id: I9cf7a21e14ba042d33c06062f922d8c0191adc5c
2021-02-08 10:56:34 +01:00
Hugo Saint-Vignes
bef8719ce0 [simulator/android] Handle getSerialNumber exception
Based on SDL commit :
85c1d40792

Change-Id: Ie6810dae48f5944a515ee016f228ecf33edd8fc4
2021-02-08 10:56:34 +01:00
Hugo Saint-Vignes
ba64458660 [ion/simulator/android] Delete JNI local references
Change-Id: Idd4d6c769786fb595a357bcc3f54e67429ed1840
2021-02-08 10:56:34 +01:00
Maxime FRIESS
a60d47bd2e [ion/3ds] Changed launch logo to Homebrew 2021-02-07 18:08:29 +01:00
Maxime FRIESS
875b7b3734 Merge pull request #462 from M4xi1m3/3ds-simu-fix
[ion/3ds] Works again, added CIA target
2021-02-06 18:46:14 +01:00
M4x1m3
9773c09eba [ci] Build 3ds CIA 2021-02-06 18:38:01 +01:00
M4x1m3
fda0848036 [ion/3ds] Added CIA target 2021-02-06 18:34:53 +01:00
M4x1m3
7733378bdc [ion/3ds] Make simulator work again 2021-02-06 17:00:14 +01:00
Maxime FRIESS
3e3a6347a6 Merge pull request #460 from RedGl0w/omegaHomeFix
[Fix] Select last app with incomplete row in home
2021-02-06 16:27:03 +01:00
Maxime FRIESS
3227e7ca8a Merge pull request #452 from ArtichOwO/omega-dev
[themes] Wrong colors in Omega Dark
2021-02-06 16:25:46 +01:00
Maxime FRIESS
51ef7d7404 Merge pull request #461 from M4xi1m3/fix-ci
[Fix] Make CI work again
2021-02-06 16:16:52 +01:00
M4x1m3
da3c4a48d0 [ci] Fixed invalid YML 2021-02-06 16:05:37 +01:00
M4x1m3
ec0e72fcb8 [ci] Made CI run on push 2021-02-06 16:05:37 +01:00
M4x1m3
8a45b3d552 [ci] Moved unit tests to separate workflow 2021-02-06 16:05:27 +01:00
M4x1m3
d35e93901c [ci] Reintroduced 3DS with toggle switch 2021-02-06 15:11:54 +01:00
M4x1m3
8f380adc4f [ci] Fixed checkout and wrong makefile 2021-02-06 10:27:27 +01:00
Joachim LF
61a015b6f1 [Fix] Select last app with incomplete row in home 2021-02-06 09:28:56 +01:00
0b101
aa51661aa7 Added app shortcuts 2021-02-05 16:58:55 -06:00
Hugo Saint-Vignes
73172f8d0c [ion/simulator/android] Add assert, remove TODO
Change-Id: Id818d0cd9a83727171ebe675ee50e35ef64e31d0
2021-02-05 17:51:40 +01:00
Hugo Saint-Vignes
5a20d914df [ion/simulator/android] Fix haptic feedback memory leaks 2021-02-05 17:31:46 +01:00
Hugo Saint-Vignes
05e6fbbcca [ion/simulator/android] Fix haptic feddback type return 2021-02-05 17:31:27 +01:00
ArtichOwO
66ea24584c [Theme] Wrong colors in Omega Dark 2021-01-30 11:22:13 +01:00
Quentin
f052ad7bf8 [.github/issue_template] New issue templates 2021-01-29 12:22:16 +01:00
Quentin Guidée
116cbf7df4 [.github/issue_template] Remove issue templates temporarily 2021-01-29 12:13:23 +01:00
Fournier Gabriel
890592854a fix for device 2020-12-13 22:13:33 +01:00
Fournier Gabriel
6c6f8b581c saving 2020-12-13 21:55:03 +01:00
Fournier Gabriel
92ee632ce2 word wrapping 2020-12-05 22:24:13 +01:00
Fournier Gabriel
3e2b5178ed word wrap - part 1 and 2 2020-11-21 19:29:46 +01:00
Fournier Gabriel
5b21c57e4c list files on simulator 2020-11-17 22:44:35 +01:00
Fournier Gabriel
76beed20da fix nb_Files limit 2020-11-17 00:04:15 +01:00
Fournier Gabriel
86985a4aef Merge branch 'main' of https://github.com/Gabriel79/OmegaWithReaderTutorial into main 2020-11-17 00:03:29 +01:00
Fournier Gabriel
aacd1a6f32 Lister des fichiers 2020-11-16 23:44:47 +01:00
Fournier Gabriel
dd258a7975 Lister des fichiers 2020-11-16 23:37:45 +01:00
Fournier Gabriel
b4e9ceed18 ListBookController - partie 2 2020-11-15 18:55:34 +01:00
Fournier Gabriel
c37b4bd1f4 ListBookController - partie 1 2020-11-14 13:39:11 +01:00
Gabriel
a0acdc171b Squelette 2020-11-13 00:48:46 +01:00
Joachim Le Fournis
5f34d07e53 [Calculation/expression_field] EE add Ans 2020-11-05 11:39:29 +01:00
Joachim LF
8e4187fb60 [Poincare] Added kmat() 2020-10-31 10:58:39 +01:00
Joachim LF
a680539b7c [Apps/main] Added comments 2020-10-28 19:49:09 +01:00
Joachim LF
69a708fd1b [Apps/main] Removed strcmp (see #1695) 2020-10-28 19:45:05 +01:00
Quentin Guidée
46658f7077 [omega] 1.20.3 2020-08-26 14:17:23 +02:00
Quentin Guidée
0235de8010 [omega] 1.20.2 2020-07-23 18:23:30 +02:00
Quentin Guidée
636c5c1d24 Merge branch 'omega-hotfix' into omega-master 2020-07-23 18:23:11 +02:00
Quentin Guidée
4af76cc3ae [omega] 1.20.1 2020-07-21 22:32:19 +02:00
Garret Kelly
668bc95f15 [build] Don't invoke bash-specific '[['
'[[' isn't available when $SHELL isn't set to bash, so use expr from
coreutils to check for the presence of the device in DFU mode.
2020-01-15 22:34:39 -05:00
626 changed files with 24614 additions and 4013 deletions

View File

@@ -1,14 +1,29 @@
---
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: ''
labels: Bug, Triage
labels: 'Status: Triage, Type: Bug'
assignees: ''
---
#### Describe the bug
**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
#### Environment
- Omega Version: {go to settings > about > Omega Version and type the version here}
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Device (please complete the following information):**
- The device on which you're running Upsilon (computer, n0110, n0100, etc...)
- Upsilon Version: [go to settings > about > Upsilon Version and type the version here]
- Upsilon commit: [settings > about > click one time on epsilon version]

View File

@@ -1 +0,0 @@
blank_issues_enabled: false

View File

@@ -1,10 +1,17 @@
---
name: Feature request
about: Suggest an idea for an improvement of Omega
about: Suggest an idea for Upsilon
title: ''
labels: Feature, Triage
labels: 'Status: Triage, Type: Feature'
assignees: ''
---
#### What I want to see in the next version of Omega
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -1,8 +1,8 @@
---
name: Other
about: A question? A problem? ...
about: A question? A problem?
title: ''
labels: Triage
labels: 'Status: Triage'
assignees: ''
---

View File

@@ -1,19 +1,19 @@
---
name: Problems during installation
about: Need help to install Omega?
about: Need help to install Upsilon?
title: ''
labels: Installation issue, Triage
labels: 'Status: Triage, Type: Installation issue'
assignees: ''
---
#### Describe the problem
**Describe the problem**
#### Logs
**Logs**
```
Copy/paste the logs here (If you have some)
```
#### Environment
- Omega Version: {go to settings > about > Omega Version and type the version here}
**Environment**
- Upsilon Version: {go to settings > about > Upsilon Version and type the version here}

View File

@@ -1,6 +1,7 @@
name: Continuous integration
#on: [pull_request, push]
on:
push:
pull_request:
workflow_dispatch:
inputs:
@@ -12,32 +13,42 @@ on:
description: 'Run macOS tests'
required: true
default: 'no'
trigger3DS:
description: 'Run 3DS tests'
required: true
default: 'no'
jobs:
# nintendo_3ds:
# runs-on: ubuntu-latest
# steps:
# - run: wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/devkitpro-pacman.amd64.deb -O /tmp/devkitpro-pacman.deb
# - run: yes | sudo dpkg -i /tmp/devkitpro-pacman.deb
# - run: yes | sudo dkp-pacman -Syu --needed devkitARM 3dstools libctru
# - run: echo ::set-env name=DEVKITPRO::/opt/devkitpro
# - run: echo ::set-env name=DEVKITARM::/opt/devkitpro/devkitARM
# - run: echo ::set-env name=PATH::$DEVKITPRO/tools/bin:$DEVKITARM/bin:$PATH
# - uses: actions/checkout@v1
# with:
# submodules: true
# - run: make -j2 PLATFORM=simulator TARGET=3ds
# - uses: actions/upload-artifact@master
# with:
# name: epsilon-3ds.3dsx
# path: output/release/simulator/3ds/epsilon.3dsx
android:
nintendo_3ds:
if: github.event.inputs.trigger3DS == 'yes'
runs-on: ubuntu-latest
steps:
- run: wget https://github.com/devkitPro/pacman/releases/download/v1.0.2/devkitpro-pacman.amd64.deb -O /tmp/devkitpro-pacman.deb
- run: yes | sudo dpkg -i /tmp/devkitpro-pacman.deb
- run: yes | sudo dkp-pacman -Syu --needed devkitARM 3dstools libctru
- run: echo ::set-env name=DEVKITPRO::/opt/devkitpro
- run: echo ::set-env name=DEVKITARM::/opt/devkitpro/devkitARM
- run: echo ::set-env name=PATH::$DEVKITPRO/tools/bin:$DEVKITARM/bin:$PATH
- uses: actions/checkout@v1
with:
submodules: true
- run: make -j2 PLATFORM=simulator TARGET=3ds
- run: make -j2 PLATFORM=simulator TARGET=3ds epsilon.cia
- uses: actions/upload-artifact@master
with:
name: epsilon-3ds.3dsx
path: output/release/simulator/3ds/epsilon.3dsx
- uses: actions/upload-artifact@master
with:
name: epsilon-3ds.cia
path: output/release/simulator/3ds/epsilon.cia
android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=android
- uses: actions/upload-artifact@master
with:
@@ -48,9 +59,9 @@ jobs:
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v1
- uses: actions/checkout@v2
with:
submodules: true
submodules: 'recursive'
- run: mkdir final-output
- run: make -j2 MODEL=n0100 EPSILON_I18N=en output/release/device/n0100/epsilon.onboarding.two_binaries
- run: mv output/release/device/n0100/epsilon.onboarding.internal.bin final-output/epsilon.onboarding.internal.en.bin
@@ -89,9 +100,9 @@ jobs:
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: numworks/setup-arm-toolchain@2020-q2
- uses: actions/checkout@v1
- uses: actions/checkout@v2
with:
submodules: true
submodules: 'recursive'
- run: make -j2 epsilon.dfu
- run: make -j2 epsilon.onboarding.dfu
- run: make -j2 epsilon.onboarding.update.dfu
@@ -114,11 +125,12 @@ jobs:
steps:
- uses: msys2/setup-msys2@v2
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: pacman -S --noconfirm mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config make mingw-w64-x86_64-python3 mingw-w64-x86_64-libjpeg-turbo mingw-w64-x86_64-libpng
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator epsilon.official.exe
- run: make -j2 PLATFORM=simulator test.headless.exe
- run: output/release/simulator/windows/test.headless.exe
- run: make -j2 PLATFORM=simulator test.exe
- run: cmd /c output\release\simulator\windows\test.exe --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-windows.exe
@@ -128,11 +140,13 @@ jobs:
steps:
- uses: numworks/setup-emscripten@v1
with:
sdk: latest-upstream
- uses: actions/checkout@v1
sdk: 1.40.1-fastcomp
- uses: actions/checkout@v2
with:
submodules: true
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=web
- run: make -j2 PLATFORM=simulator TARGET=web test.js
- run: node output/release/simulator/web/test.js --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-web.zip
@@ -141,25 +155,27 @@ jobs:
runs-on: ubuntu-latest
steps:
- run: sudo apt-get install build-essential imagemagick libfreetype6-dev libjpeg-dev libpng-dev pkg-config
- uses: actions/checkout@v1
- uses: actions/checkout@v2
with:
submodules: true
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator test.bin
- run: output/release/simulator/linux/test.bin --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-linux.bin
path: output/release/simulator/linux/epsilon.bin
- run: make -j2 PLATFORM=simulator test.headless.bin
macos:
if: github.event.inputs.triggerMacos == 'yes'
runs-on: macOS-latest
steps:
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator
- run: make -j2 PLATFORM=simulator epsilon.official.app
- run: make -j2 PLATFORM=simulator ARCH=x86_64 test.headless.bin
- run: output/release/simulator/macos/x86_64/test.headless.bin
- run: make -j2 PLATFORM=simulator ARCH=x86_64 test.bin
- run: output/release/simulator/macos/x86_64/test.bin --headless
- uses: actions/upload-artifact@master
with:
name: epsilon-macos.zip
@@ -170,9 +186,9 @@ jobs:
steps:
- run: brew install numworks/tap/epsilon-sdk
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 epsilon.official.ipa
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 test.ipa
- run: make -j2 PLATFORM=simulator TARGET=ios EPSILON_TELEMETRY=0 APPLE_PLATFORM=ios-simulator
- uses: actions/upload-artifact@master
with:

View File

@@ -31,7 +31,6 @@ jobs:
- name: Add comment
uses: actions/github-script@v3.0.0
with:
github-token: ${{ secrets.OMEGA_ROBOT_TOKEN }}
script: |
await github.issues.createComment({
owner: context.repo.owner,

2
.gitignore vendored
View File

@@ -6,3 +6,5 @@ epsilon.map
.vscode
.DS_Store
.gradle
.idea/
.vs

View File

@@ -1,26 +0,0 @@
image: gcc
stages:
- build
job:build:
stage: build
before_script:
- "echo 'deb http://httpredir.debian.org/debian jessie main contrib \n deb-src http://httpredir.debian.org/debian jessie main contrib \n deb http://httpredir.debian.org/debian jessie-updates main contrib \n deb-src http://httpredir.debian.org/debian jessie-updates main contrib \n deb http://security.debian.org/ jessie/updates main contrib \n deb-src http://security.debian.org/ jessie/updates main contrib ' > /etc/apt/source.list"
- "apt-get update"
- "apt -y install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config fltk1.3-dev gcc-arm-none-eabi nodejs npm"
- "git submodule update --init --recursive"
- "git clone https://github.com/RedGl0w/omega-auto-increment"
- "cd omega-auto-increment"
- "npm i request exeq"
- "PrivateToken=$PrivateToken node index.js"
- "cd .."
script:
- make clean
- make MODEL=n0100 epsilon.bin
artifacts:
paths:
- output/release/device/n0100/epsilon.bin
- omega-auto-increment/version.txt
name: artifact:build:simulator

8
.gitmodules vendored
View File

@@ -1,6 +1,6 @@
[submodule "apps/rpn"]
path = apps/rpn
url = https://github.com/Omega-Numworks/Omega-RPN.git
[submodule "apps/atom"]
path = apps/atom
url = https://github.com/Omega-Numworks/Omega-Atom.git
url = https://github.com/Lauryy06/Upsilon-RPN.git
[submodule "apps/atomic"]
path = apps/atomic
url = https://github.com/Lauryy06/atomic

View File

@@ -12,6 +12,21 @@ include build/toolchain.$(TOOLCHAIN).mak
include build/variants.mak
include build/helpers.mk
ifeq (${MODEL}, n0100)
ifeq ($(filter reader,$(apps_list)),)
$(warning reader app included, removing it on n0100. )
EPSILON_APPS := $(filter-out reader,$(EPSILON_APPS))
endif
ifneq ($(words $(EPSILON_I18N)), 1)
$(warning Only use 1 language on n0100, defaulting to en. )
EPSILON_I18N := en
endif
ifeq ($(INCLUDE_ULAB), 1)
$(warning Removing uLab on n0100. )
INCLUDE_ULAB := 0
endif
endif
ifeq (${MODEL}, n0110)
apps_list = ${EPSILON_APPS}
else
@@ -22,6 +37,10 @@ ifdef FORCE_EXTERNAL
apps_list = ${EPSILON_APPS}
endif
ifeq ($(INCLUDE_ULAB), 1)
SFLAGS += -DINCLUDE_ULAB
endif
ifdef HOME_DISPLAY_EXTERNALS
ifneq ($(filter external,$(apps_list)),)
SFLAGS += -DHOME_DISPLAY_EXTERNALS

183
README.fr.md Normal file
View File

@@ -0,0 +1,183 @@
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></p>
<p align="center">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="cc by-nc-sa 4.0" src="https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-525252.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
<a href="https://github.com/Lauryy06/Upsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Lauryy06/Upsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
<br/>
<a href="https://discord.gg/Q9buEMduXG"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Don't understand french ? speak english ? here's the [english README](./README.md) !
## À propos
Upsilon est un fork d'Omega, un fork d'Epsilon, l'OS de Numworks tournant sur les calculatrices du même nom, qui apporte beaucoup de fonctionnalités en plus, mais qui fut archivé et fermé pour des raisons légales après un changement de politique de Numworks. Upsilon est fait pour ceux qui aimeraient voir un futur pour les OS créées par les utilisateurs pour Numworks, même après l'arrèt du projet initial.
### Quelques fonctionnalités supplémentaires
- Un module python kandinsky amélioré
- Un support pour fonds d'écrans personnalisés
- Des applications externes
- Un thème Upsilon
- La surcharge des opérateurs en python
- Un tableau périodique légèrement amélioré
- L'utilisation possible du signe "=" dans les calculs
- *Ainsi que tout ce qui a été ajouté sur Omega, et bien plus...* [Changelogs complets d'Omega](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Fonctionnalités principales d'Omega & captures d'écran](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
## Installation
### Manuelle
*A l'heure actuelle, seule l'installation manuelle est possible.*
Tout d'abord, suivez **la première étape** [ici](https://www.numworks.com/resources/engineering/software/build/), puis :
<details>
<summary><b>Modèle n0100</b></summary>
(note : vous pouvez changer `EPSILON_I18N=fr` en `en`, `nl`, `pt`, `it`, `de`, `es` ou `hu`).
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make MODEL=n0100 clean
make MODEL=n0100 EPSILON_I18N=fr OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
make MODEL=n0100 epsilon_flash
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Modèle n0110</b></summary>
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
make epsilon_flash
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Fichiers binaires</b></summary>
Ces fichiers peuvent être utilisés pour distribuer Upsilon (pour que tout le monde puisse le flasher via [Webdfu_Numworks](https://ti-planet.github.io/webdfu_numworks/)).
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make MODEL=n0100 OMEGA_USERNAME="" -j8
make MODEL=n0100 OMEGA_USERNAME="" binpack -j8
make OMEGA_USERNAME="" -j8
make OMEGA_USERNAME="" binpack -j8
```
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Simulateur web</b></summary>
D'abord, installez emsdk :
```bash
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest-fastcomp
./emsdk activate latest-fastcomp
source emsdk_env.sh
```
Puis, compilez Upsilon :
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout omega-master
make clean
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Votre nom ici, 15 caractères max}" -j4
```
Le simulateur se trouve dans `output/release/simulator/web/simulator.zip`
Important : N'oubliez pas l'argument `--recursive`, Upsilon a besoin de sous-modules.
Vous pouvez aussi changer le nombre de processus parallèles pendant la compilation en changeant la valeur suivant `-j`.
</details>
<details>
<summary><b>Simulateur 3DS</b></summary>
Vous aurez besoin de devkitPro et de devkitARM disponible dans votre `$PATH` (instructions [ici](https://devkitpro.org/wiki/Getting_Started) (en anglais))
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout --recursive upsilon-dev
make PLATFORM=simulator TARGET=3ds -j
```
Vous pouvez ensuite copier epsilon.3dsx sur une carte SD pour l'exécuter depuis le HBC ou utiliser 3dslink pour le lancer via le réseau :
```bash
3dslink output/release/simulator/3ds/epsilon.3dsx -a <ADRESSE IP 3DS>
```
</details>
Si vous avez besoin d'aide, n'hésitez pas à rejoindre notre serveur discord : https://discord.gg/Q9buEMduXG
<a href="https://discord.gg/Q9buEMduXG"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
---
## Liens utiles
* [Upsilon external (pour installer des applications supplémentaires et des fonds d'écran)](https://lauryy06.github.io/Upsilon-External/)
* [Documentation d'ulab](https://micropython-ulab.readthedocs.io/en/latest/)
## Contribution
Pour contribuer, merci de lire le [Wiki d'Omega](https://github.com/Omega-Numworks/Omega/wiki/Contributing), les mêmes règles s'appliquent ici.
## Les autres projets
Les anciens projets d'Omega, avant sa fermeture, qui ont été utilisés pour ce projet
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)
* [External Apps](https://github.com/Omega-Numworks/External-Apps)
## À propos d'Epsilon
Upsilon est un fork d'Omega, visant a continuer le projet des OS utilisateurs pour Numworks
Omega est un fork d'Epsilon, un système d'exploitation performant pour calculatrices graphiques. Il inclut huit applications pour les mathématiques de lycée et d'études supérieurs
Vous pouvez essayer Epsilon depuis votre navigateur sur le [simulateur en ligne](https://www.numworks.com/simulator/).
## Licence
NumWorks est une marque déposée de NumWorks SAS, 24 Rue Godot de Mauroy, 75009 Paris, France.
Nintendo est Nintendo 3DS sont des marques déposées de Nintendo of America Inc, 4600 150th Ave NE, Redmond, WA 98052, Etats-Unis.
NumWorks SAS et Nintendo of America Inc ne sont en aucun cas associés avec ce projet.
* NumWorks Epsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Omega est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Upsilon est disponible sous [Lisense CC BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).

251
README.md
View File

@@ -1,36 +1,156 @@
<p align="center"><img src="https://user-images.githubusercontent.com/12123721/106272451-60b00500-6231-11eb-8521-09fe93b3b1f4.png" /></p>
<p align="center"><img src="https://github.com/Laporte12974/UpsilonDesign/blob/89a15953ae128aef8aa7d066dcaaf8d5c70f02a5/UPSILogo.png" /></p>
<p align="center">
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="cc by-nc-sa 4.0" src="https://img.shields.io/badge/License-CC%20BY--NC--SA%204.0-525252.svg?labelColor=292929&logo=creative%20commons&style=for-the-badge" /></a>
<a href="https://github.com/Omega-Numworks/Omega/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Omega-Numworks/Omega.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
<a href="https://github.com/Lauryy06/Upsilon/issues"><img alt="Issues" src="https://img.shields.io/github/issues/Lauryy06/Upsilon.svg?labelColor=292929&logo=git&style=for-the-badge" /></a>
<br/>
<a href="https://discord.gg/X2TWhh9"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
<a href="https://discord.gg/Q9buEMduXG"><img alt="Discord" src="https://img.shields.io/discord/663420259851567114?color=blue&labelColor=292929&label=chat%20-%20discord&logo=discord&style=for-the-badge" /></a>
</p>
> Vous ne comprenez pas l'anglais ? Vous êtes francophone ? Regardez le [*LISEZ-MOI* français](./README.fr.md) !
## About
Omega is a fork of Numworks' Epsilon, the OS that runs on their calculator, which brings many features to it. Omega is for the people who want to add features to the calculator, but cannot because they have been rejected by Numworks (for reasons that are 100% understandable!). [Try it online](https://getomega.web.app/simulator).
Upsilon is a fork of Omega, an user-made OS that runs on the Numworks calculator, which brings many features to it, but was discontinued because of a policy change from Numworks. Upsilon is for the people who want to see a future for user-made OSes for Numworks, even after the closure and archiving of Omega.
### Some new features
- Adding symbolic calculation back into the calculator
- An app for RPN
- Enhancements for the Kandinsky python module
- Support for wallpapers
- Exernal apps
- A theme engine
- New python features (os module, open method...)
- A periodic table app + all of the molar masses for the elements in the toolbox
- *And much more to discover...* [Complete changelog](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Main new features + screenshots](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
- A custom theme
- Operator overload for python
- Improvements for the Periodic table application
- *And everything that has been added to Omega before its termination!* [See Omega's changelog here](https://github.com/Omega-Numworks/Omega/wiki/Changelog) | [Main Omega features + screenshots](https://github.com/Omega-Numworks/Omega/wiki/Main-features).
<br>
## Installation
### Automatic
You can install Omega automatically on our website [here](https://getomega.web.app/) in the "install" page.
<a href="https://getomega.web.app"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86352956-e9000480-bc66-11ea-82b7-79fd7e56fa27.png" /></p></a>
### Manual
First of all, follow **step 1** [here](https://www.numworks.com/resources/engineering/software/build/). Then:
*As of today, only the manual installation is available. You can refer to this [website](https://www.numworks.com/resources/engineering/software/build/) for the first step if you get errors.*
### 1. Install SDK
<br>
<details>
<summary><b>1.1 Linux</b></summary>
<br>
<details>
<summary>Debian or Ubuntu</summary>
<br>
You just have to install dependencies by running these command with superuser privileges in a Terminal:
```bash
apt-get install build-essential git imagemagick libx11-dev libxext-dev libfreetype6-dev libpng-dev libjpeg-dev pkg-config gcc-arm-none-eabi binutils-arm-none-eabi
```
And there you can go to step 2!
<br>
</details>
<details>
<summary>Fedora</summary>
<br>
First install basics dev tools.
```bash
dnf install make automake gcc gcc-c++ kernel-devel
```
Then install required packages.
```bash
dnf install git ImageMagick libX11-devel libXext-devel freetype-devel libpng-devel libjpeg-devel pkg-config
```
Then, install GCC cross compiler for ARM.
```bash
dnf install arm-none-eabi-gcc-cs arm-none-eabi-gcc-cs-c++
```
<br>
</details>
<br>
</details>
<details>
<summary><b>1.2 Mac</b></summary>
<br>
It's recommended to use [Homebrew](https://brew.sh/). Once it's installed, just run:
```bash
brew install numworks/tap/epsilon-sdk
```
and it will install all dependencies.
<br>
And there you can go to step 2!
<br>
</details>
<details>
<summary><b>1.3 Windows</b></summary>
<br>
[Msys2](https://www.msys2.org/) environment is recommended to get most of the required tools on Windows easily. It's where you'll paste all the commands of this tutorial. Once it's installed, paste these commands into the Msys2 terminal.
```bash
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-freetype mingw-w64-x86_64-pkg-config mingw-w64-x86_64-libusb git make python
echo "export PATH=/mingw64/bin:$PATH" >> .bashrc
```
Next, you'll need to install the [GCC toolchain for ARM](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads). When prompted for an install location, choose `C:\msys64\home\User\gcc-arm\`. You'll then need to add this folder to your $PATH. Just enter:
```bash
echo "export PATH=$PATH:$HOME/gcc-arm/bin" >> .bashrc
```
Just restart and you can go to step 2!
</details>
<br>
### 2. Set up repo
Clone repo and use 'upsilon-dev' branch by pasting these two commands:
```bash
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout upsilon-dev
```
<br>
### 3. Choose the target
<details>
<summary><b>Model n0100</b></summary>
@@ -38,55 +158,53 @@ First of all, follow **step 1** [here](https://www.numworks.com/resources/engine
(note: you can change the `EPSILON_I18N=en` flag to `fr`, `nl`, `pt`, `it`, `de`, `es` or `hu`).
```bash
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
make MODEL=n0100 clean
make MODEL=n0100 EPSILON_I18N=en OMEGA_USERNAME="{Your name, max 15 characters}" -j4
make MODEL=n0100 epsilon_flash
```
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
Now, run either:
```bash
make MODEL=n0100 epsilon_flash
```
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and pluging in.
<br>
or:
```bash
make MODEL=n0100 OMEGA_USERNAME="" binpack -j4
```
to make binpack wich you can flash to the caculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0100/). Binpacks are a great way to share a custom build of Upsilon to friends.
</details>
<details>
<summary><b>Model n0110</b></summary>
```bash
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
make clean
make OMEGA_USERNAME="{Your name, max 15 characters}" -j4
make epsilon_flash
```
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
<details>
<summary><b>Bin files</b></summary>
These can be used to distribute Omega (so that it can be flashed by anyone with [Webdfu_Numworks](https://ti-planet.github.io/webdfu_numworks/)).
Now, run either:
```bash
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
make clean
make MODEL=n0100 OMEGA_USERNAME="" -j8
make MODEL=n0100 OMEGA_USERNAME="" binpack -j8
make OMEGA_USERNAME="" -j8
make OMEGA_USERNAME="" binpack -j8
make epsilon_flash
```
to directly flash the calculator after pressing simultaneously `reset` and `6` buttons and pluging in.
<br>
or:
```bash
make OMEGA_USERNAME="" binpack -j4
```
to make binpack wich you can flash to the caculator from [Ti-planet's webDFU](https://ti-planet.github.io/webdfu_numworks/n0110/). Binpacks are a great way to share a custom build of Upsilon to friends.
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
<details>
@@ -102,20 +220,15 @@ cd emsdk
source emsdk_env.sh
```
Then, compile Omega :
Then, compile Upsilon :
```bash
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout omega-master
make clean
make PLATFORM=simulator TARGET=web OMEGA_USERNAME="{Your name, max 15 characters}" -j4
```
The simulator is now in `output/release/simulator/web/simulator.zip`
Important: Don't forget the `--recursive` tag, because Omega relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
</details>
@@ -125,9 +238,9 @@ Also, you can change the number of processes that run in parallel during the bui
You need devkitPro and devkitARM installed and in your path (instructions [here](https://devkitpro.org/wiki/Getting_Started))
```bash
git clone --recursive https://github.com/Omega-Numworks/Omega.git
cd Omega
git checkout --recursive omega-dev
git clone --recursive https://github.com/Lauryy06/Upsilon.git
cd Upsilon
git checkout --recursive upsilon-dev
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:
@@ -138,21 +251,34 @@ You can then put epsilon.3dsx on a SD card to run it from the HBC or use 3dslink
</details>
If you need help, you can join our Discord server here : https://discord.gg/X2TWhh9
<br>
<a href="https://discord.gg/X2TWhh9"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
Important: Don't forget the `--recursive` tag, because Upsilon relies on submodules.
Also, you can change the number of processes that run in parallel during the build by changing the value of the `-j` flag.
Don't forget to put your pseudo instead of `{your pseudo, max 15 char}`. If you don't want one, just remove the `OMEGA_USERNAME=""` argument.
<br>
If you need help, you can join our Discord server here : https://discord.gg/NFvzdCBTQn
<a href="https://discord.gg/NFvzdCBTQn"><p align="center"><img alt="Omega Banner Discord" src="https://user-images.githubusercontent.com/12123721/86287349-54ef5800-bbe8-11ea-80c1-34eb1f93eebd.png" /></p></a>
---
## Useful links
* [Upsilon external (to install additional apps and wallpapers)](https://lauryy06.github.io/Upsilon-External/)
* [Ulab documentation](https://micropython-ulab.readthedocs.io/en/latest/)
## Contributing
To contribute, please refer to the [Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing)
To contribute, please refer to [Omega's Wiki](https://github.com/Omega-Numworks/Omega/wiki/Contributing), the same rules apply here.
## Related repositories
Here are the main links toward Omega's different websites and repositories, that have been used for the creation of Upsilon.
* [Omega Themes](https://github.com/Omega-Numworks/Omega-Themes)
* [Omega Website](https://github.com/Omega-Numworks/Omega-Website)
* [Omega RPN `APP`](https://github.com/Omega-Numworks/Omega-RPN)
* [Omega Atom `APP`](https://github.com/Omega-Numworks/Omega-Atom)
* [Omega Atomic `APP`](https://github.com/Omega-Numworks/Omega-Atomic)
* [Omega Design](https://github.com/Omega-Numworks/Omega-Design)
* [Omega Discord Bot](https://github.com/Omega-Numworks/Omega-Discord-Bot)
* [Omega App Template `BETA`](https://github.com/Omega-Numworks/Omega-App-Template)
@@ -160,6 +286,8 @@ To contribute, please refer to the [Wiki](https://github.com/Omega-Numworks/Omeg
## About Epsilon
Upsilon is a fork of Omega, after the project's discontinuation.
Omega is a fork of Epsilon, a high-performance graphing calculator operating system. It includes eight apps that cover the high school mathematics curriculum.
You can try Epsilon straight from your browser in the [online simulator](https://www.numworks.com/simulator/).
@@ -172,3 +300,4 @@ NumWorks SAS and Nintendo of America Inc aren't associated in any shape or form
* NumWorks Epsilon is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Omega is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).
* Upsilon is released under a [CC BY-NC-SA License](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode).

View File

@@ -11,6 +11,25 @@ apps =
# (path to the apps header).
$(foreach i,${apps_list},${eval include apps/$(i)/Makefile})
app_equals = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
# We list all the apps that are missing
apps_missing = $(foreach i, ${apps_list}, $(if $(call app_equals, apps/$(i)/Makefile, $(wildcard apps/$(i)/Makefile)),, $(i) ) )
# If the two doesn't match, we got an error.
ifneq ($(strip $(apps_missing)),)
miss_modules = 0
# Check if the missing apps are one that are supposed to be submodules
$(foreach i, $(SUBMODULES_APPS), $(if $(call app_equals, $(filter $(i), $(apps_missing)), $(i)), $(eval miss_modules=1)))
ifeq ($(miss_modules), 1)
PLS_IGNORE := $(shell >&2 printf "\nSome submodules apps seem to be missing. To download them, assumming you git clone'd the repo, do\n")
PLS_IGNORE := $(shell >&2 printf " git submodule init\n")
PLS_IGNORE := $(shell >&2 printf " git submodule update\n\n")
endif
$(error Missing apps: $(strip $(apps_missing)))
endif
apps_src += $(addprefix apps/,\
alternate_empty_nested_menu_controller.cpp \
apps_container.cpp \
@@ -43,7 +62,7 @@ apps_src += $(addprefix apps/,\
)
tests_src += $(addprefix apps/,\
exam_mode_configuration_official.cpp \
exam_mode_configuration_non_official.cpp \
)
@@ -66,9 +85,6 @@ language_preferences = apps/language_preferences.csv
SFLAGS += -I$(BUILD_DIR)
i18n_files += $(addprefix apps/language_,$(addsuffix .universal.i18n, $(EPSILON_I18N)))
ifeq ($(EPSILON_GETOPT),1)
i18n_files += $(addprefix apps/language_,$(addsuffix _iso6391.universal.i18n, $(EPSILON_I18N)))
endif
i18n_files += $(call i18n_with_universal_for,shared)
i18n_files += $(call i18n_with_universal_for,toolbox)
@@ -78,7 +94,7 @@ $(eval $(call rule_for, \
I18N, \
apps/i18n.cpp, \
$(i18n_files), \
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^ --generateISO6391locales $$(EPSILON_GETOPT), \
$$(PYTHON) apps/i18n.py --codepoints $(code_points) --countrypreferences $(country_preferences) --languagepreferences $(language_preferences) --header $$(subst .cpp,.h,$$@) --implementation $$@ --locales $$(EPSILON_I18N) --countries $$(EPSILON_COUNTRIES) --files $$^, \
global \
))
@@ -91,8 +107,11 @@ $(BUILD_DIR)/apps/i18n.h: $(BUILD_DIR)/apps/i18n.cpp
$(eval $(call depends_on_image,apps/title_bar_view.cpp,apps/exam_icon.png))
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/apps/i18n.h
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/apps/home/apps_layout.h
$(call object_for,$(apps_src) $(tests_src)): $(BUILD_DIR)/python/port/genhdr/qstrdefs.generated.h
$(call object_for,$(apps_src)): $(BUILD_DIR)/apps/home/apps_layout.h
apps_tests_src = $(app_calculation_test_src) $(app_code_test_src) $(app_graph_test_src) $(app_probability_test_src) $(app_regression_test_src) $(app_sequence_test_src) $(app_shared_test_src) $(app_statistics_test_src) $(app_settings_test_src) $(app_solver_test_src)
apps_tests_src += $(addprefix apps/,\

View File

@@ -8,6 +8,8 @@
#include <ion/backlight.h>
#include <poincare/preferences.h>
#include <algorithm>
extern "C" {
#include <assert.h>
}
@@ -27,7 +29,7 @@ AppsContainer::AppsContainer() :
m_globalContext(),
m_variableBoxController(),
m_examPopUpController(this),
m_promptController(k_promptMessages, k_promptColors, k_promptNumberOfMessages),
m_promptController(k_promptMessages, k_promptFGColors, k_promptBGColors, k_promptNumberOfMessages),
m_batteryTimer(),
m_suspendTimer(),
m_backlightDimmingTimer(),
@@ -136,7 +138,7 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
Ion::LED::updateColorWithPlugAndCharge();
}
if (event == Ion::Events::USBEnumeration) {
if (Ion::USB::isPlugged()) {
if (Ion::USB::isPlugged() && GlobalPreferences::sharedGlobalPreferences()->getDfuLevel() != 3) {
App::Snapshot * activeSnapshot = (s_activeApp == nullptr ? appSnapshotAtIndex(0) : s_activeApp->snapshot());
/* Just after a software update, the battery timer does not have time to
* fire before the calculator enters DFU mode. As the DFU mode blocks the
@@ -145,7 +147,9 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
* pictogram. */
updateBatteryState();
if (switchTo(usbConnectedAppSnapshot())) {
Ion::USB::DFU();
Ion::USB::DFU(true, GlobalPreferences::sharedGlobalPreferences()->dfuStatus(), GlobalPreferences::sharedGlobalPreferences()->getDfuLevel());
GlobalPreferences::sharedGlobalPreferences()->dfuResetStep();
GlobalPreferences::sharedGlobalPreferences()->setDfuStatus(false);
// Update LED when exiting DFU mode
Ion::LED::updateColorWithPlugAndCharge();
bool switched = switchTo(activeSnapshot);
@@ -196,7 +200,7 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
}
if (changedZoom) {
KDIonContext::sharedContext()->updatePostProcessingEffects();
redrawWindow();
redrawWindow(true);
return true;
}
}
@@ -218,6 +222,13 @@ bool AppsContainer::dispatchEvent(Ion::Events::Event event) {
return didProcessEvent || alphaLockWantsRedraw;
}
static constexpr Ion::Events::Event switch_events[] = {
Ion::Events::ShiftSeven, Ion::Events::ShiftEight, Ion::Events::ShiftNine,
Ion::Events::ShiftFour, Ion::Events::ShiftFive, Ion::Events::ShiftSix,
Ion::Events::ShiftOne, Ion::Events::ShiftTwo, Ion::Events::ShiftThree,
Ion::Events::ShiftZero, Ion::Events::ShiftDot, Ion::Events::ShiftEE
};
bool AppsContainer::processEvent(Ion::Events::Event event) {
// Warning: if the window is dirtied, you need to call window()->redraw()
if (event == Ion::Events::USBPlug) {
@@ -242,6 +253,15 @@ bool AppsContainer::processEvent(Ion::Events::Event event) {
switchTo(appSnapshotAtIndex(1));
return true;
}
for(int i = 0; i < std::min((int) (sizeof(switch_events) / sizeof(Ion::Events::Event)), APPS_CONTAINER_SNAPSHOT_COUNT); i++) {
if (event == switch_events[i]) {
m_window.redraw(true);
switchTo(appSnapshotAtIndex(i+1));
return true;
}
}
if (event == Ion::Events::OnOff) {
suspend(true);
return true;

View File

@@ -66,7 +66,8 @@ private:
bool updateAlphaLock();
static I18n::Message k_promptMessages[];
static KDColor k_promptColors[];
static KDColor k_promptFGColors[];
static KDColor k_promptBGColors[];
static int k_promptNumberOfMessages;
AppsWindow m_window;
EmptyBatteryWindow m_emptyBatteryWindow;

View File

@@ -10,7 +10,7 @@ I18n::Message AppsContainer::k_promptMessages[] = {
I18n::Message::BetaVersionMessage5,
I18n::Message::BetaVersionMessage6};
KDColor AppsContainer::k_promptColors[] = {
KDColor AppsContainer::k_promptFGColors[] = {
KDColorBlack,
KDColorBlack,
KDColorBlack,
@@ -20,4 +20,14 @@ KDColor AppsContainer::k_promptColors[] = {
KDColorBlack,
Palette::AccentText};
KDColor AppsContainer::k_promptBGColors[] = {
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorWhite};
int AppsContainer::k_promptNumberOfMessages = 8;

View File

@@ -2,7 +2,8 @@
I18n::Message AppsContainer::k_promptMessages[] = {};
KDColor AppsContainer::k_promptColors[] = {};
KDColor AppsContainer::k_promptFGColors[] = {};
KDColor AppsContainer::k_promptBGColors[] = {};
int AppsContainer::k_promptNumberOfMessages = 0;

View File

@@ -8,7 +8,7 @@ I18n::Message AppsContainer::k_promptMessages[] = {
I18n::Message::UpdateMessage3,
I18n::Message::UpdateMessage4};
KDColor AppsContainer::k_promptColors[] = {
KDColor AppsContainer::k_promptFGColors[] = {
KDColorBlack,
KDColorBlack,
KDColorBlack,
@@ -16,4 +16,12 @@ KDColor AppsContainer::k_promptColors[] = {
KDColorBlack,
Palette::AccentText};
KDColor AppsContainer::k_promptBGColors[] = {
KDColorWhite,
KDColorWhite,
KDColorWhite,
KDColorBlack,
KDColorWhite,
KDColorBlack};
int AppsContainer::k_promptNumberOfMessages = 6;

Submodule apps/atom deleted from 8f710a9d3f

1
apps/atomic Submodule

Submodule apps/atomic added at 69f7a06ba5

View File

@@ -75,13 +75,13 @@ void BatteryView::drawRect(KDContext * ctx, KDRect rect) const {
assert(!m_isPlugged);
// Low: Quite empty battery
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) {
assert(!m_isPlugged);
// Middle: Half full battery
constexpr KDCoordinate middleChargeWidth = batteryInsideWidth/2;
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 {
assert(m_chargeState == Ion::Battery::Charge::FULL);
// Full but not plugged: Full battery

View File

@@ -19,6 +19,7 @@ app_calculation_src = $(addprefix apps/calculation/,\
additional_outputs/list_controller.cpp \
additional_outputs/matrix_list_controller.cpp \
additional_outputs/rational_list_controller.cpp \
additional_outputs/second_degree_list_controller.cpp \
additional_outputs/trigonometry_graph_cell.cpp \
additional_outputs/trigonometry_list_controller.cpp \
additional_outputs/trigonometry_model.cpp \

View File

@@ -0,0 +1,312 @@
#include "../app.h"
#include <apps/global_preferences.h>
#include "../../shared/poincare_helpers.h"
#include <poincare/layout_helper.h>
#include <poincare/code_point_layout.h>
#include <poincare/rational.h>
#include <poincare/opposite.h>
#include <poincare/addition.h>
#include <poincare/parenthesis.h>
#include <poincare/equal.h>
#include <poincare/subtraction.h>
#include <poincare/multiplication.h>
#include <poincare/division.h>
#include <poincare/square_root.h>
#include <poincare/symbol.h>
#include <poincare/power.h>
#include "second_degree_list_controller.h"
using namespace Poincare;
using namespace Shared;
namespace Calculation {
void SecondDegreeListController::setExpression(Poincare::Expression e) {
ExpressionsListController::setExpression(e);
assert(!m_expression.isUninitialized());
Expression polynomialCoefficients[Expression::k_maxNumberOfPolynomialCoefficients];
Context * context = App::app()->localContext();
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);
int degree = m_expression.getPolynomialReducedCoefficients(
"x",
polynomialCoefficients,
context,
Expression::UpdatedComplexFormatWithExpressionInput(preferences->complexFormat(), m_expression, context),
preferences->angleUnit(),
GlobalPreferences::sharedGlobalPreferences()->unitFormat(),
ExpressionNode::SymbolicComputation::ReplaceAllDefinedSymbolsWithDefinition);
assert(degree == 2);
Expression a = polynomialCoefficients[2];
Expression b = polynomialCoefficients[1];
Expression c = polynomialCoefficients[0];
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);
// Alpha is -b/2a, but because after we use -α, we immediately store -α=-(-b/2a)=b/2a.
Expression minusAlpha = Division::Builder(b.clone(), Multiplication::Builder(Rational::Builder(2), a.clone()));
PoincareHelpers::Reduce(&minusAlpha, context, ExpressionNode::ReductionTarget::SystemForApproximation);
// Same thing for β
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
* canonized form we must beautify the expression manually
*/
Expression xMinusAlphaPowerTwo;
Expression alpha = getOppositeIfExists(minusAlpha, &reductionContext);
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 x1;
if (delta.nullStatus(context) == ExpressionNode::NullStatus::Null) {
// x0 = x1 = -b/(2a)
x0 = Division::Builder(Opposite::Builder(b.clone()), Multiplication::Builder(Rational::Builder(2), a.clone()));
m_numberOfSolutions = 1;
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
}
else {
// 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()));
// x1 = (-b+sqrt(delta))/(2a)
x1 = Division::Builder(Addition::Builder(Opposite::Builder(b.clone()), SquareRoot::Builder(delta.clone())), Multiplication::Builder(Rational::Builder(2), a.clone()));
m_numberOfSolutions = 2;
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::SystemForApproximation);
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::SystemForApproximation);
if (x0.type() == ExpressionNode::Type::Unreal) {
assert(x1.type() == ExpressionNode::Type::Unreal);
m_numberOfSolutions = 0;
}
}
Expression factorized;
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) {
factorized = Parenthesis::Builder(Addition::Builder(Symbol::Builder("x", strlen("x")), x0.childAtIndex(0).clone()));
}
Expression x1Opposite = getOppositeIfExists(x1, &reductionContext);
if (x1Opposite.isUninitialized()) {
PoincareHelpers::Simplify(&x1, context, ExpressionNode::ReductionTarget::User);
secondFactor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x1);
}
else {
PoincareHelpers::Simplify(&x1Opposite, context, ExpressionNode::ReductionTarget::User);
secondFactor = Addition::Builder(Symbol::Builder("x", strlen("x")), x1Opposite);
}
Expression solutionProduct = Multiplication::Builder(Parenthesis::Builder(firstFactor), Parenthesis::Builder(secondFactor));
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) {
Expression x0Opposite = getOppositeIfExists(x0, &reductionContext);
Expression factor;
if (x0Opposite.isUninitialized()) {
PoincareHelpers::Simplify(&x0, context, ExpressionNode::ReductionTarget::User);
factor = Subtraction::Builder(Symbol::Builder("x", strlen("x")), x0);
}
else {
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));
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;
}
}
PoincareHelpers::Simplify(&delta, context, ExpressionNode::ReductionTarget::User);
m_layouts[0] = PoincareHelpers::CreateLayout(canonized);
if (m_numberOfSolutions > 0) {
m_layouts[1] = PoincareHelpers::CreateLayout(factorized);
m_layouts[2] = PoincareHelpers::CreateLayout(delta);
m_layouts[3] = PoincareHelpers::CreateLayout(x0);
if (m_numberOfSolutions > 1) {
m_layouts[4] = PoincareHelpers::CreateLayout(x1);
}
}
else {
m_layouts[1] = PoincareHelpers::CreateLayout(delta);
}
}
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) {
if (m_numberOfSolutions > 0) {
if (index == 0) {
return I18n::Message::CanonicalForm;
}
if (index == 1) {
return I18n::Message::FactorizedForm;
}
if (index == 2) {
return I18n::Message::Discriminant;
}
if (index == 3) {
if (m_numberOfSolutions == 1) {
return I18n::Message::OnlyRoot;
}
else {
return I18n::Message::FirstRoot;
}
}
return I18n::Message::SecondRoot;
}
else {
switch (index) {
case 0:
return I18n::Message::CanonicalForm;
default:
return I18n::Message::Discriminant;
}
}
}
}

View File

@@ -0,0 +1,26 @@
#ifndef CALCULATION_ADDITIONAL_OUTPUTS_SECOND_DEGREE_CONTROLLER_H
#define CALCULATION_ADDITIONAL_OUTPUTS_SECOND_DEGREE_CONTROLLER_H
#include "expressions_list_controller.h"
namespace Calculation {
class SecondDegreeListController : public ExpressionsListController {
public:
SecondDegreeListController(EditExpressionController * editExpressionController) :
ExpressionsListController(editExpressionController),
m_numberOfSolutions(0) {}
void setExpression(Poincare::Expression e) override;
private:
Poincare::Expression getOppositeIfExists(Poincare::Expression e, Poincare::ExpressionNode::ReductionContext * reductionContext);
I18n::Message messageAtIndex(int index) override;
int m_numberOfSolutions;
};
}
#endif

View File

@@ -72,7 +72,7 @@ bool App::isAcceptableExpression(const Poincare::Expression expression) {
return false;
}
}
return !(expression.isUninitialized() || expression.type() == ExpressionNode::Type::Equal);
return !expression.isUninitialized();
}
void App::didBecomeActive(Window * window) {

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Stufenform"
AdditionalReducedRowEchelonForm = "Reduzierte Stufenform"
AdditionalTrace = "Spur"
AdditionalTrace = "Spur"
CanonicalForm = "Kanonische Form"
FactorizedForm = "Factorisierte Form"
Discriminant = "Diskriminante"
OnlyRoot = "Wurzel"
FirstRoot = "Erste Wurzel"
SecondRoot = "Zweite Wurzel"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Row echelon form"
AdditionalReducedRowEchelonForm = "Reduced row echelon form"
AdditionalTrace = "Trace"
AdditionalTrace = "Trace"
CanonicalForm = "Canonical form"
FactorizedForm = "Factorized form"
Discriminant = "Discriminant"
OnlyRoot = "Root"
FirstRoot = "First root"
SecondRoot = "Second root"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inversa"
AdditionalRowEchelonForm = "Matriz escalonada"
AdditionalReducedRowEchelonForm = "Matriz escalonada reducida"
AdditionalTrace = "Traza"
AdditionalTrace = "Traza"
CanonicalForm = "Forma canónica"
FactorizedForm = "Forma factorizada"
Discriminant = "Discriminante"
OnlyRoot = "Raíz"
FirstRoot = "Primera raíz"
SecondRoot = "Segunda raíz"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Déterminant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Forme échelonnée"
AdditionalReducedRowEchelonForm = "Forme échelonnée réduite"
AdditionalTrace = "Trace"
AdditionalTrace = "Trace"
CanonicalForm = "Forme canonique"
FactorizedForm = "Forme factorisée"
Discriminant = "Discriminant"
OnlyRoot = "Racine"
FirstRoot = "Première racine"
SecondRoot = "Seconde racine"

View File

@@ -3,7 +3,18 @@ CalculAppCapital = "SZÁMOLÁS"
AdditionalResults = "További eredmények"
DecimalBase = "Decimális"
HexadecimalBase = "Hexadecimális"
BinaryBase = "Kétkomponensü"
BinaryBase = "Bináris"
PrimeFactors = "Alapvetö tényezök"
MixedFraction = "Vegyes frakció"
EuclideanDivision = "Euklideszi osztás"
AdditionalDeterminant = "Meghatározó"
AdditionalInverse = "inverz"
AdditionalRowEchelonForm = "Sor echelon forma"
AdditionalReducedRowEchelonForm = "Csökkentett sorú Echelon forma"
AdditionalTrace = "Nyomkövetés"
CanonicalForm = "Kanonikus forma"
FactorizedForm = "Factorizált forma"
Discriminant = "Discriminant"
OnlyRoot = "Gyökér"
FirstRoot = "Első gyökér"
SecondRoot = "Második gyökér"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
AdditionalInverse = "Inversa"
AdditionalRowEchelonForm = "Matrice a scalini"
AdditionalReducedRowEchelonForm = "Matrice ridotta a scalini"
AdditionalTrace = "Traccia"
AdditionalTrace = "Traccia"
CanonicalForm = "Forma canonica"
FactorizedForm = "Forma fattorizzata"
Discriminant = "Discriminante"
OnlyRoot = "Radice"
FirstRoot = "Prima radice"
SecondRoot = "Seconda radice"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinant"
AdditionalInverse = "Inverse"
AdditionalRowEchelonForm = "Echelonvorm"
AdditionalReducedRowEchelonForm = "Gereduceerde echelonvorm"
AdditionalTrace = "Spoor"
AdditionalTrace = "Spoor"
CanonicalForm = "Canonische vorm"
FactorizedForm = "Factorized vorm"
Discriminant = "Discriminant"
OnlyRoot = "Wortel"
FirstRoot = "Eerste wortel"
SecondRoot = "Tweede wortel"

View File

@@ -11,4 +11,10 @@ AdditionalDeterminant = "Determinante"
AdditionalInverse = "Matriz inversa"
AdditionalRowEchelonForm = "Matriz escalonada"
AdditionalReducedRowEchelonForm = "Matriz escalonada reduzida"
AdditionalTrace = "Traço"
AdditionalTrace = "Traço"
CanonicalForm = "Forma canónica"
FactorizedForm = "Factorized form"
Discriminant = "Discriminante"
OnlyRoot = "Raiz"
FirstRoot = "Primeira raiz"
SecondRoot = "Segunda raiz"

View File

@@ -8,6 +8,7 @@
#include <poincare/undefined.h>
#include <poincare/unit.h>
#include <poincare/unreal.h>
#include <poincare/symbol_abstract.h>
#include <string.h>
#include <cmath>
#include <algorithm>
@@ -272,6 +273,9 @@ Calculation::AdditionalInformationType Calculation::additionalInformationType(Co
if (o.type() == ExpressionNode::Type::Matrix) {
return AdditionalInformationType::Matrix;
}
if (o.polynomialDegree(context, "x") == 2) {
return AdditionalInformationType::SecondDegree;
}
return AdditionalInformationType::None;
}

View File

@@ -39,6 +39,7 @@ public:
None = 0,
Integer,
Rational,
SecondDegree,
Trigonometry,
Unit,
Matrix,

View File

@@ -17,7 +17,8 @@ bool ExpressionField::handleEvent(Ion::Events::Event event) {
event == Ion::Events::Power ||
event == Ion::Events::Square ||
event == Ion::Events::Division ||
event == Ion::Events::Sto)) {
event == Ion::Events::Sto ||
event == Ion::Events::EE)) {
handleEventWithText(Poincare::Symbol::k_ans);
}
return(::ExpressionField::handleEvent(event));

View File

@@ -16,6 +16,7 @@ HistoryController::HistoryController(EditExpressionController * editExpressionCo
m_complexController(editExpressionController),
m_integerController(editExpressionController),
m_rationalController(editExpressionController),
m_secondDegreeController(editExpressionController),
m_trigonometryController(editExpressionController),
m_unitController(editExpressionController),
m_matrixController(editExpressionController)
@@ -100,6 +101,8 @@ bool HistoryController::handleEvent(Ion::Events::Event event) {
Expression e = calculationAtIndex(focusRow)->exactOutput();
if (additionalInfoType == Calculation::AdditionalInformationType::Complex) {
vc = &m_complexController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::SecondDegree) {
vc = &m_secondDegreeController;
} else if (additionalInfoType == Calculation::AdditionalInformationType::Trigonometry) {
vc = &m_trigonometryController;
// Find which of the input or output is the cosine/sine

View File

@@ -8,6 +8,7 @@
#include "additional_outputs/complex_list_controller.h"
#include "additional_outputs/integer_list_controller.h"
#include "additional_outputs/rational_list_controller.h"
#include "additional_outputs/second_degree_list_controller.h"
#include "additional_outputs/trigonometry_list_controller.h"
#include "additional_outputs/unit_list_controller.h"
#include "additional_outputs/matrix_list_controller.h"
@@ -47,6 +48,7 @@ private:
ComplexListController m_complexController;
IntegerListController m_integerController;
RationalListController m_rationalController;
SecondDegreeListController m_secondDegreeController;
TrigonometryListController m_trigonometryController;
UnitListController m_unitController;
MatrixListController m_matrixController;

View File

@@ -81,7 +81,7 @@ void HistoryViewCell::reloadSubviewHighlight() {
m_ellipsis.setHighlighted(false);
if (isHighlighted()) {
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) {
m_scrollableOutputView.evenOddCell()->setHighlighted(true);
} else {

View File

@@ -114,10 +114,10 @@ QUIZ_CASE(calculation_display_exact_approximate) {
assertCalculationIs("1/2", DisplayOutput::ExactAndApproximate, EqualSign::Equal, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1/3", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1/0", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("2x-x", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("1/0", DisplayOutput::ExactOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("2x-x", DisplayOutput::ExactOnly, EqualSign::Unknown, "x", "undef", "undef", &globalContext, &store);
assertCalculationIs("[[1,2,3]]", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("[[1,x,3]]", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "undef", "undef", &globalContext, &store);
assertCalculationIs("[[1,x,3]]", DisplayOutput::ExactAndApproximate, EqualSign::Unknown, nullptr, "[[1,undef,3]]", "[[1,undef,3]]", &globalContext, &store);
assertCalculationIs("28^7", DisplayOutput::ExactAndApproximate, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("3+√(2)→a", DisplayOutput::ExactAndApproximate, EqualSign::Approximation, "√(2)+3", nullptr, nullptr, &globalContext, &store);
Ion::Storage::sharedStorage()->recordNamed("a.exp").destroy();
@@ -130,9 +130,9 @@ QUIZ_CASE(calculation_display_exact_approximate) {
assertCalculationIs("1+1+random()", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("1+1+round(1.343,2)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, "3.34", "3.34", &globalContext, &store);
assertCalculationIs("randint(2,2)+3", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "5", "5", "5", &globalContext, &store);
assertCalculationIs("confidence(0.5,2)+3", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction(0.5,2)+3", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction95(0.5,2)+3", DisplayOutput::ApproximateOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("confidence(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
assertCalculationIs("prediction95(0.5,2)+3", DisplayOutput::ExactOnly, EqualSign::Unknown, nullptr, nullptr, nullptr, &globalContext, &store);
}
@@ -140,10 +140,10 @@ QUIZ_CASE(calculation_symbolic_computation) {
Shared::GlobalContext globalContext;
CalculationStore store(calculationBuffer,calculationBufferSize);
assertCalculationIs("x+x+1+3+√(π)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("x+x+1+3+√(π)", DisplayOutput::ExactOnly, EqualSign::Unknown, "2×x+√(π)+4", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "f×x", "undef", "undef", &globalContext, &store);
assertCalculationIs("1+x→f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "x+1", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ApproximateOnly, EqualSign::Unknown, "undef", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ExactOnly, EqualSign::Unknown, "x+1", "undef", "undef", &globalContext, &store);
assertCalculationIs("f(2)", DisplayOutput::ApproximateOnly, EqualSign::Equal, "3", "3", "3", &globalContext, &store);
assertCalculationIs("2→x", DisplayOutput::ApproximateOnly, EqualSign::Equal, "2", nullptr, nullptr, &globalContext, &store);
assertCalculationIs("f(x)", DisplayOutput::ApproximateOnly, EqualSign::Equal, "3", nullptr, nullptr, &globalContext, &store);

View File

@@ -1,6 +1,8 @@
apps += Code::App
app_headers += apps/code/app.h
SFLAGS += -DHAS_CODE
app_code_src = $(addprefix apps/code/,\
app.cpp \
console_controller.cpp \
@@ -15,6 +17,7 @@ app_code_src = $(addprefix apps/code/,\
sandbox_controller.cpp \
script_name_cell.cpp \
script_parameter_controller.cpp \
toolbox_ion_keys.cpp \
)
app_code_test_src = $(addprefix apps/code/,\
@@ -29,6 +32,7 @@ app_code_test_src = $(addprefix apps/code/,\
tests_src += $(addprefix apps/code/test/,\
variable_box_controller.cpp\
toolbox_ion_keys_dummy.cpp \
)
app_code_src += $(app_code_test_src)

View File

@@ -75,7 +75,7 @@ public:
VariableBoxController * variableBoxController() { return &m_variableBoxController; }
static constexpr int k_pythonHeapSize = 100000;
static constexpr int k_pythonHeapSize = 67000;
private:
/* Python delegate:

View File

@@ -1,15 +1,15 @@
AddScript = "Skript hinzufügen"
AllowedCharactersaz09 = "Erlaubte Zeichen: a-z, 0-9, _"
Autocomplete = "Autovervollständigung"
AutoImportScript = "Automatischer Import in Konsole"
BuiltinsAndKeywords = "Native Funktionen und Schlüsselwörter"
AutoImportScript = "Automatischer Import in die Konsole"
BuiltinsAndKeywords = "Native Funktionen & Schlüsselwörter"
Console = "Interaktive Konsole"
DeleteScript = "Skript löschen"
DuplicateScript = "Skript duplizieren"
ExecuteScript = "Skript ausführen"
FunctionsAndVariables = "Funktionen und Variablen"
ImportedModulesAndScripts = "Importierte Module und Skripte"
NoWordAvailableHere = "Kein Wort ist hier verfübar."
ScriptInProgress = "Aktuelle Skript"
NoWordAvailableHere = "Hier ist kein Wort verfügbar."
ScriptInProgress = "Aktuelles Skript"
ScriptOptions = "Skriptoptionen"
ScriptSize = "Script size"
ScriptSize = "Skriptgröße"

View File

@@ -12,4 +12,4 @@ ImportedModulesAndScripts = "Modules et scripts importés"
NoWordAvailableHere = "Aucun mot disponible à cet endroit."
ScriptInProgress = "Script en cours"
ScriptOptions = "Options de script"
ScriptSize = "Script size"
ScriptSize = "Taille du script"

View File

@@ -1,15 +1,15 @@
AddScript = "Script hozzadáadása"
AddScript = "Script hozzáadása"
AllowedCharactersaz09 = "Engedélyezett karakterek: a-z, 0-9, _"
Autocomplete = "Autocomplete"
Autocomplete = "Önkiegészítés"
AutoImportScript = "Script automata importálása"
BuiltinsAndKeywords = "Builtins and keywords"
BuiltinsAndKeywords = "Beépített fonkciók és szókincs"
Console = "Konzol"
DeleteScript = "Script törlése"
DuplicateScript = "Script másolása"
ExecuteScript = "Script indítása"
FunctionsAndVariables = "Függvények és változók"
ImportedModulesAndScripts = "Imported modules and scripts"
NoWordAvailableHere = "No word available here."
ScriptInProgress = "Script in progress"
FunctionsAndVariables = "Fonktiók és változók"
ImportedModulesAndScripts = "Importált scriptek és modulok"
NoWordAvailableHere = "Nincs rendelkezésre álló szó."
ScriptInProgress = "Script müködésben"
ScriptOptions = "Script beállítások"
ScriptSize = "Script size"
ScriptSize = "Script mérete"

View File

@@ -3,220 +3,208 @@ PythonPercent = "Modulo"
Python1J = "Imaginäres i"
PythonLF = "Zeilenvorschub"
PythonTab = "Tabulator"
PythonAmpersand = "Bitweise und"
PythonSymbolExp = "Bitweise exklusiv oder"
PythonVerticalBar = "Bitweise oder"
PythonAmpersand = "Bitweises und"
PythonSymbolExp = "Bitweises exklusives oder"
PythonVerticalBar = "Bitweises oder"
PythonImag = "Imaginärteil von z"
PythonReal = "Realteil von z"
PythonSingleQuote = "Einfaches Anführungszeichen"
PythonAbs = "Absolute/r Wert/Größe"
PythonAcos = "Arkuskosinus"
PythonAcosh = "Hyperbelkosinus"
PythonAppend = "Hängt x an das Ende der Liste"
PythonArrow = "Arrow from (x,y) to (x+dx,y+dy)"
PythonAsin = "Arkussinus"
PythonAsinh = "Hyperbelsinus"
PythonAbs = "Absoluter Wert/Absolute Größe"
PythonAcos = "Bogenkosinus"
PythonAcosh = "Bogenhyperbolischer Kosinus"
PythonAppend = "x an das Ende der Liste anfügen"
PythonArrow = "Pfeil von (x,y) nach (x+dx,y+dy)"
PythonAsin = "Sinusbogen"
PythonAsinh = "Kreisbogen hyperbolischer Sinus"
PythonAtan = "Arkustangens"
PythonAtan2 = "Gib atan(y/x)"
PythonAtan2 = "Rückgabe atan(y/x)"
PythonAtanh = "Hyperbeltangens"
PythonAxis = "Set axes to (xmin,xmax,ymin,ymax)"
PythonBar = "Draw a bar plot with x values"
PythonBin = "Ganzzahl nach binär konvertieren"
PythonCeil = "Aufrundung"
PythonChoice = "Zufallszahl aus der Liste"
PythonClear = "Leere die Liste"
PythonAxis = "Achsen auf (xmin,xmax,ymin,ymax)"
PythonBar = "Balkendiagramm mit x-Werten"
PythonBin = "Ganzzahl in Binärwert umwandeln"
PythonCeil = "Aufrunden"
PythonChoice = "Zufällige Zahl in der Liste"
PythonClear = "Liste leeren"
PythonCmathFunction = "cmath-Modul-Funktionspräfix"
PythonColor = "Definiere eine RGB-Farbe"
PythonColorBlack = "Black color"
PythonColorBlue = "Blue color"
PythonColorBrown = "Brown color"
PythonColorGray = "Gray color"
PythonColorGreen = "Green color"
PythonColorOrange = "Orange color"
PythonColorPink = "Pink color"
PythonColorPurple = "Purple color"
PythonColorRed = "Red color"
PythonColorWhite = "White color"
PythonColorYellow = "Yellow color"
PythonComplex = "a+ib zurückgeben"
PythonCopySign = "x mit dem Vorzeichen von y"
PythonColor = "Eine RGB-Farbe definieren"
PythonColorBlack = "Farbe Schwarz"
PythonColorBlue = "Farbe Blau"
PythonColorBrown = "Farbe Braun"
PythonColorGray = "Farbe Grau"
PythonColorGreen = "Farbe Grün"
PythonColorOrange = "Farbe Orange"
PythonColorPink = "Farbe Rosa"
PythonColorPurple = "Farbe Violett"
PythonColorRed = "Farbe Rot"
PythonColorWhite = "Farbe Weiß"
PythonColorYellow = "Farbe Gelb"
PythonComplex = "Gib a+ib zurück"
PythonCopySign = "Gib x mit Vorzeichen von y zurück"
PythonCos = "Kosinus"
PythonCosh = "Hyperbolic cosine"
PythonCount = "Zählt wie oft x vorkommt"
PythonDegrees = "x von Radian zu Grad umwandeln"
PythonCosh = "Hyperbolischer Kosinus"
PythonCount = "Zählt die Vorkommen von x"
PythonDegrees = "x von Bogenmaß in Grad umrechnen"
PythonDivMod = "Quotient und Rest"
PythonDrawString = "Schreibt Text bei (x,y)"
PythonDrawCircle = "Zeichne einen Kreis"
PythonDrawLine = "Eine Linie zeichnen"
PythonDrawString = "Text bei Pixel (x,y) darstellen"
PythonErf = "Fehlerfunktion"
PythonErfc = "Complementary error function"
PythonEval = "Return the evaluated expression"
PythonErfc = "Komplementäre Fehlerfunktion"
PythonEval = "Rückgabe ausgewerteter Ausdruck"
PythonExp = "Exponentialfunktion"
PythonExpm1 = "Berechne exp(x)-1"
PythonFabs = "Absoluter Wert"
PythonFillRect = "Malt ein Rechteck bei Pixel (x,y)"
PythonFloat = "Wandelt x zu float um"
PythonFloor = "Floor"
PythonFillRect = "Gefülltes Rechteck bei Pixel (x,y)"
PythonFillCircle = "Füllt einen Kreis"
PythonFillPolygon = "Füllt ein Polygon"
PythonFloat = "x in einen Fließkommawert umwandeln"
PythonFloor = "Abrunden"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa and exponent of x: (m,e)"
PythonGamma = "Gamma function"
PythonGetPixel = "Return pixel (x,y) color"
PythonGetrandbits = "Integer with k random bits"
PythonGrid = "Toggle the visibility of the grid"
PythonHex = "Ganzzahl zu Hexadecimal"
PythonHist = "Draw the histogram of x"
PythonImportCmath = "cmath Modul importieren"
PythonImportIon = "ion Modul importieren"
PythonImportKandinsky = "kandinsky Modul importieren"
PythonImportRandom = "random Modul importieren"
PythonImportMath = "math Modul importieren"
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
PythonImportOs = "os Modul importieren"
PythonOsUname = "Informieren Sie sich über das System"
PythonFrExp = "Mantisse und Exponent von x: (m,e)"
PythonGamma = "Gamma-Funktion"
PythonGetKeys = "Gedrückte Tasten erhalten"
PythonGetPalette = "Themenpalette erhalten"
PythonGetPixel = "Farbe von Pixel (x,y) zurückgeben"
PythonGetrandbits = "Ganzzahl mit k Zufallsbits"
PythonGrid = "Sichtbarkeit des Gitters umschalten"
PythonHex = "Ganzzahl in Hexadezimal umwandeln"
PythonHist = "Zeichnet das Histogramm von x"
PythonImportCmath = "cmath-Modul importieren"
PythonImportIon = "Ion-Modul importieren"
PythonImportKandinsky = "Kandinsky-Modul importieren"
PythonImportRandom = "Random-Modul importieren"
PythonImportMath = "Math-Modul importieren"
PythonImportMatplotlibPyplot = "Matplotlib.pyplot-Modul importieren"
PythonImportNumpy = "Ulab.numpy-Modul importieren"
PythonImportScipy = "Ulab.scipy-Modul importieren"
PythonImportOs = "OS-Modul importieren"
PythonImportSys = "SYS-Modul importieren"
PythonOsUname = "Informationen über das System holen"
PythonOsGetlogin = "Benutzernamen holen"
PythonOsRemove = "Datei namens Dateiname entfernen"
PythonOsRename = "Datei mit altem Namen in neuen Namen umbenennen"
PythonOsRename = "Datei umbenennen von Alt nach Neu"
PythonOsListdir = "Dateien im Speicher auflisten"
PythonImportTime = "time Modul importieren"
PythonImportTurtle = "turtle Modul importieren"
PythonIndex = "Index, bei dem x zuerst vorkommt"
PythonInput = "Eingabeaufforderung"
PythonInsert = "x bei index i in der Liste einsetzen"
PythonInt = "x zu Ganzzahl"
PythonIonFunction = "ion module function prefix"
PythonIsFinite = "Prüft ob x endlich ist"
PythonIsInfinite = "Prüft ob x unendlich ist"
PythonIsNaN = "Prüft ob x NaN ist"
PythonIsKeyDown = "true wenn k gedrückt ist"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "Linke Pfeiltaste"
PythonKeyUp = "Pfeiltaste nach oben"
PythonKeyDown = "Pfeiltaste nach unten"
PythonKeyRight = "Rechte Pfeiltaste"
PythonKeyOk = "OK Taste"
PythonKeyBack = "ZURÜCK Taste"
PythonKeyHome = "HOME Taste"
PythonKeyOnOff = "AN/AUS Taste"
PythonKeyShift = "SHIFT Taste"
PythonKeyAlpha = "ALPHA Taste"
PythonKeyXnt = "X,N,T Taste"
PythonKeyVar = "VAR Taste"
PythonKeyToolbox = "WERKZEUGBOX Taste"
PythonKeyBackspace = "LÖSCHEN Taste"
PythonKeyExp = "EXPONENTIAL Taste"
PythonKeyLn = "NATURAL LOGARITHM Taste"
PythonKeyLog = "DECIMAL LOGARITHM Taste"
PythonKeyImaginary = "IMAGINÄRES I Taste"
PythonKeyComma = "KOMMA Taste"
PythonKeyPower = "HOCH Taste"
PythonKeySine = "SINUS Taste"
PythonKeyCosine = "COSINUS Taste"
PythonKeyTangent = "TANGENZ Taste"
PythonKeyPi = "PI Taste"
PythonKeySqrt = "WURZEL Taste"
PythonKeySquare = "QUADRAT Taste"
PythonKeySeven = "7 Taste"
PythonKeyEight = "8 Taste"
PythonKeyNine = "9 Taste"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 Taste"
PythonKeyFive = "5 Taste"
PythonKeySix = "6 Taste"
PythonKeyMultiplication = "MULTIPLIKATIONSTASTE"
PythonKeyDivision = "DIVISIONSTASTE"
PythonKeyOne = "1 Taste"
PythonKeyTwo = "2 Taste"
PythonKeyThree = "3 Taste"
PythonKeyPlus = "PLUS Taste"
PythonKeyMinus = "MINUS Taste"
PythonKeyZero = "0 Taste"
PythonKeyDot = "PUNKT Taste"
PythonKeyEe = "10 HOCH X Taste"
PythonKeyAns = "ANS Taste"
PythonKeyExe = "EXE Taste"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
PythonLog = "Logarithm to base a"
PythonLog10 = "Logarithm to base 10"
PythonLog2 = "Logarithm to base 2"
PythonMathFunction = "math module function prefix"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot module prefix"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonImportTime = "Time-Modul importieren"
PythonImportTurtle = "Turtle-Modul importieren"
PythonIndex = "Index des ersten x-Vorkommens"
PythonInput = "Einen Wert abfragen"
PythonInsert = "x an Index i in die Liste einfügen"
PythonInt = "x in eine ganze Zahl umwandeln"
PythonIonFunction = "Ion-Modul-Funktionspräfix"
PythonIsFinite = "Prüfen, ob x endlich ist"
PythonIsInfinite = "Prüfen, ob x unendlich ist"
PythonIsNaN = "Prüfen, ob x keine Zahl ist"
PythonIsKeyDown = "Wahr, wenn die Taste k gedrückt ist"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonKandinskyFunction = "Kandinsky-Modul Funktionspräfix"
PythonLdexp = "Liefert x*(2**i), Inverse von frexp"
PythonLength = "Länge eines Objekts"
PythonLgamma = "Log-Gamma-Funktion"
PythonLog = "Logarithmus zur Basis a"
PythonLog10 = "Logarithmus zur Basis 10"
PythonLog2 = "Logarithmus zur Basis 2"
PythonMathFunction = "Funktionspräfix des Math-Moduls"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot Modul-Präfix"
PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Fractional and integer parts of x"
PythonMonotonic = "Value of a monotonic clock"
PythonOct = "Convert integer to octal"
PythonPhase = "Phase of z"
PythonPlot = "Plot y versus x as lines"
PythonPolar = "z in polar coordinates"
PythonPop = "Remove and return the last item"
PythonPower = "x raised to the power y"
PythonPrint = "Print object"
PythonRadians = "Convert x from degrees to radians"
PythonRandint = "Random integer in [a,b]"
PythonRandom = "Floating point number in [0,1["
PythonRandomFunction = "random module function prefix"
PythonRandrange = "Random number in range(start,stop)"
PythonRangeStartStop = "List from start to stop-1"
PythonRangeStop = "List from 0 to stop-1"
PythonRect = "Convert to cartesian coordinates"
PythonRemove = "Remove the first occurrence of x"
PythonReverse = "Reverse the elements of the list"
PythonRound = "Round to n digits"
PythonScatter = "Draw a scatter plot of y versus x"
PythonSeed = "Initialize random number generator"
PythonSetPixel = "Color pixel (x,y)"
PythonShow = "Display the figure"
PythonSin = "Sine"
PythonSinh = "Hyperbolic sine"
PythonSleep = "Suspend the execution for t seconds"
PythonSort = "Sort the list"
PythonSqrt = "Wurzel"
PythonSum = "Sum the items of a list"
PythonModf = "Bruch- und Ganzzahl-Anteile von x"
PythonMonotonic = "Wert einer monotonen Uhr"
PythonNumpyFunction = "numpy Modul-Präfix"
PythonNumpyFftFunction = "numpy.fft Modul-Präfix"
PythonNumpyLinalgFunction = "numpy.linalg Modul-Präfix"
PythonScipyFunction = "scipy Modul-Präfix"
PythonScipyLinalgFunction = "scipy.linalg Modul-Präfix"
PythonScipyOptimizeFunction = "scipy.optimize Modul-Präfix"
PythonScipySignalFunction = "scipy.signal Modul-Präfix"
PythonScipySpecialFunction = "scipy.special Modul-Präfix"
PythonOct = "Ganzzahl in Oktal umwandeln"
PythonPhase = "Phase von z"
PythonPlot = "Plotten von y gegen x als Linien"
PythonPolar = "z in Polarkoordinaten"
PythonPop = "Letztes Element abnehmen"
PythonPower = "x erhöht mit der Potenz y"
PythonPrint = "Objekt drucken"
PythonRadians = "x von Grad in Bogenmaß umrechnen"
PythonRandint = "Zufällige Ganzzahl in [a,b]"
PythonRandom = "Fließkommazahl in [0,1]"
PythonRandomFunction = "Random-Modul Funktionspräfix"
PythonRandrange = "Zufallszahl im Bereich(start,stop)"
PythonRangeStartStop = "Liste von Start bis Stop-1"
PythonRangeStop = "Liste von 0 bis Stop-1"
PythonRect = "In kartesische Koordinaten"
PythonRemove = "Entferne das erste Vorkommen von x"
PythonReverse = "Kehrt die Elemente der Liste um"
PythonRound = "Runden auf n Stellen"
PythonScatter = "Streudiagramm von y gg. x zeichnen"
PythonSeed = "Zufallszahlengenerator initiieren"
PythonSetPixel = "Pixel (x,y) einfärben"
PythonShow = "Figur anzeigen"
PythonSin = "Sinus"
PythonSinh = "Hyperbolischer Sinus"
PythonSleep = "Ausführung aussetzen für t Sekunden"
PythonLocalTime = "Zeit in Tupel umwandeln"
PythonMktime = "Tupel in Zeit umwandeln"
PythonTime = "Abrufen des aktuellen Zeitstempels"
PythonSetLocaltime = "Zeit aus einem Tupel einstellen"
PythonRTCmode = "Aktuellen RTC-Modus abrufen"
PythonSetRTCmode = "RTC-Modus festlegen"
PythonSort = "Die Liste sortieren"
PythonSqrt = "Quadratwurzel"
PythonSum = "Summe der Elemente einer Liste"
PythonTan = "Tangens"
PythonTanh = "Hyperbolic tangent"
PythonText = "Display a text at (x,y) coordinates"
PythonTimeFunction = "time module function prefix"
PythonTrunc = "x truncated to an integer"
PythonTurtleBackward = "Move backward by x pixels"
PythonTurtleCircle = "Circle of radius r pixels"
PythonTurtleColor = "Stiftfarbe setzen"
PythonTurtleColorMode = "Set the color mode to 1.0 or 255"
PythonTurtleForward = "Move forward by x pixels"
PythonTurtleFunction = "turtle module function prefix"
PythonTurtleGoto = "Move to (x,y) coordinates"
PythonTurtleHeading = "Return the current heading"
PythonTurtleHideturtle = "Hide the turtle"
PythonTurtleIsdown = "Return True if the pen is down"
PythonTurtleLeft = "Turn left by a degrees"
PythonTurtlePendown = "Pull the pen down"
PythonTurtlePensize = "Set the line thickness to x pixels"
PythonTurtlePenup = "Pull the pen up"
PythonTurtlePosition = "Return the current (x,y) location"
PythonTurtleReset = "Reset the drawing"
PythonTurtleRight = "Turn right by a degrees"
PythonTurtleSetheading = "Set the orientation to a degrees"
PythonTurtleSetposition = "Positionne la tortue"
PythonTurtleShowturtle = "Show the turtle"
PythonTurtleSpeed = "Drawing speed between 0 and 10"
PythonTurtleWrite = "Display a text"
PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonTimePrefix = "time module function prefix"
PythonTimeSleep = "Wait for n second"
PythonMonotonic = "Return monotonic time"
PythonTanh = "Hyperbolischer Tangens"
PythonText = "Text an (x,y) Koordinaten anzeigen"
PythonTimeFunction = "Time-Modul-Funktionspräfix"
PythonTrunc = "x abgeschnitten auf eine ganze Zahl"
PythonTurtleBackward = "Um x Pixel rückwärts bewegen"
PythonTurtleCircle = "Kreis mit Radius r Pixel"
PythonTurtleColor = "Setzt die Stiftfarbe"
PythonTurtleColorMode = "Setzt Farbmodus auf 1.0 oder 255"
PythonTurtleForward = "Um x Pixel vorwärts bewegen"
PythonTurtleFunction = "Turtle-Modul-Funktionspräfix"
PythonTurtleGoto = "Bewegen zu (x,y) Koordinaten"
PythonTurtleHeading = "Liefert den aktuellen Kurs"
PythonTurtleHideturtle = "Versteckt den Igel"
PythonTurtleIsdown = "Wahr, wenn der Stift unten ist"
PythonTurtleLeft = "Nach links um ein Grad drehen"
PythonTurtlePendown = "Den Stift nach unten ziehen"
PythonTurtlePensize = "Linienstärke auf x Pixel setzen"
PythonTurtlePenup = "Den Stift nach oben ziehen"
PythonTurtlePosition = "Aktuelle (x,y) Position zurückgeben"
PythonTurtleReset = "Die Zeichnung zurücksetzen"
PythonTurtleRight = "Um ein Grad nach rechts drehen"
PythonTurtleSetheading = "Ausrichtung auf einen Grad setzen"
PythonTurtleSetposition = "Den Igel auf Position setzen"
PythonTurtleShowturtle = "Den Igel anzeigen"
PythonTurtleSpeed = "Zeichengeschwindigkeit von 0 bis 10"
PythonTurtleWrite = "Einen Text anzeigen"
PythonUniform = "Fließkommazahl in [a,b]"
PythonImportTime = "Time-Modul importieren"
PythonTimePrefix = "Zeitmodul-Funktionspräfix"
PythonTimeSleep = "Warte für n Sekunden"
PythonMonotonic = "Monotone Zeit zurückgeben"
PythonFileOpen = "Öffnet eine Datei"
PythonFileSeekable = "Ist eine Datei durchsuchbar?"
PythonFileSeek = "Dateicursor verschieben"
PythonFileTell = "Cursorposition der Datei abrufen"
PythonFileSeekable = "Kann Datei durchsucht werden?"
PythonFileSeek = "Bewegt den Cursor einer Datei"
PythonFileTell = "Position des Cursors ermitteln"
PythonFileClose = "Schließt eine Datei"
PythonFileClosed = "Wenn Datei geschlossen wurde"
PythonFileRead = "Bis zu size Bytes lesen"
PythonFileWrite = "Schreibe b in die Datei"
PythonFileReadline = "Lies eine Zeile"
PythonFileClosed = "Wahr, wenn Datei geschlossen wurde"
PythonFileRead = "Lesen bis zu einer Größe von Bytes"
PythonFileWrite = "Schreibe b in Datei"
PythonFileReadline = "Liest Zeile oder Anzahl Bytes"
PythonFileReadlines = "Liest eine Liste von Zeilen"
PythonFileTruncate = "Größe der Datei ändern"
PythonFileTruncate = "Verkleinert die Datei auf Größe"
PythonFileWritelines = "Schreibt eine Liste von Zeilen"
PythonFileName = "Dateiname"
PythonFileMode = "Dateiöffnungsmodus"
PythonFileReadable = "Ist die Datei lesbar?"
PythonFileWritable = "Ist die Datei beschreibbar?"
PythonFileName = "Enthält den Namen der Datei"
PythonFileMode = "Enthält den Öffnungsmodus der Datei"
PythonFileReadable = "Kann Datei gelesen werden?"
PythonFileWritable = "Kann Datei geschrieben werden?"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Hyperbolic cosine"
PythonCount = "Count the occurrences of x"
PythonDegrees = "Convert x from radians to degrees"
PythonDivMod = "Quotient and remainder"
PythonDrawCircle = "Draw a circle"
PythonDrawLine = "Draw a line"
PythonDrawString = "Display a text from pixel (x,y)"
PythonErf = "Error function"
PythonErfc = "Complementary error function"
@@ -52,12 +54,16 @@ PythonEval = "Return the evaluated expression"
PythonExp = "Exponential function"
PythonExpm1 = "Compute exp(x)-1"
PythonFabs = "Absolute value"
PythonFillCircle = "Fill a circle"
PythonFillPolygon = "Fill a polygon"
PythonFillRect = "Fill a rectangle at pixel (x,y)"
PythonFloat = "Convert x to a float"
PythonFloor = "Floor"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa and exponent of x: (m,e)"
PythonGamma = "Gamma function"
PythonGetKeys = "Get keys pressed"
PythonGetPalette = "Get theme palette"
PythonGetPixel = "Return pixel (x,y) color"
PythonGetrandbits = "Integer with k random bits"
PythonGrid = "Toggle the visibility of the grid"
@@ -69,6 +75,8 @@ PythonImportKandinsky = "Import kandinsky module"
PythonImportRandom = "Import random module"
PythonImportMath = "Import math module"
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
PythonImportNumpy = "Import ulab.numpy module"
PythonImportScipy = "Import ulab.scipy module"
PythonImportTime = "Import time module"
PythonImportTurtle = "Import turtle module"
PythonIndex = "Index of the first x occurrence"
@@ -79,54 +87,11 @@ PythonIonFunction = "ion module function prefix"
PythonIsFinite = "Check if x is finite"
PythonIsInfinite = "Check if x is infinity"
PythonIsKeyDown = "Return True if the k key is down"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Check if x is a NaN"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "LEFT ARROW key"
PythonKeyUp = "UP ARROW key"
PythonKeyDown = "DOWN ARROW key"
PythonKeyRight = "RIGHT ARROW key"
PythonKeyOk = "OK key"
PythonKeyBack = "BACK key"
PythonKeyHome = "HOME key"
PythonKeyOnOff = "ON/OFF key"
PythonKeyShift = "SHIFT key"
PythonKeyAlpha = "ALPHA key"
PythonKeyXnt = "X,N,T key"
PythonKeyVar = "VAR key"
PythonKeyToolbox = "TOOLBOX key"
PythonKeyBackspace = "BACKSPACE key"
PythonKeyExp = "EXPONENTIAL key"
PythonKeyLn = "NATURAL LOGARITHM key"
PythonKeyLog = "DECIMAL LOGARITHM key"
PythonKeyImaginary = "IMAGINARY I key"
PythonKeyComma = "COMMA key"
PythonKeyPower = "POWER key"
PythonKeySine = "SINE key"
PythonKeyCosine = "COSINE key"
PythonKeyTangent = "TANGENT key"
PythonKeyPi = "PI key"
PythonKeySqrt = "SQUARE ROOT key"
PythonKeySquare = "SQUARE key"
PythonKeySeven = "7 key"
PythonKeyEight = "8 key"
PythonKeyNine = "9 key"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 key"
PythonKeyFive = "5 key"
PythonKeySix = "6 key"
PythonKeyMultiplication = "MULTIPLICATION key"
PythonKeyDivision = "DIVISION key"
PythonKeyOne = "1 key"
PythonKeyTwo = "2 key"
PythonKeyThree = "3 key"
PythonKeyPlus = "PLUS key"
PythonKeyMinus = "MINUS key"
PythonKeyZero = "0 key"
PythonKeyDot = "DOT key"
PythonKeyEe = "10 POWER X key"
PythonKeyAns = "ANS key"
PythonKeyExe = "EXE key"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
@@ -139,6 +104,14 @@ PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Fractional and integer parts of x"
PythonMonotonic = "Value of a monotonic clock"
PythonNumpyFunction = "numpy module prefix"
PythonNumpyFftFunction = "numpy.fft module prefix"
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
PythonScipyFunction = "scipy module prefix"
PythonScipyLinalgFunction = "scipy.linalg module prefix"
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
PythonScipySignalFunction = "scipy.signal module prefix"
PythonScipySpecialFunction = "scipy.special module prefix"
PythonOct = "Convert integer to octal"
PythonPhase = "Phase of z"
PythonPlot = "Plot y versus x as lines"
@@ -148,7 +121,7 @@ PythonPower = "x raised to the power y"
PythonPrint = "Print object"
PythonRadians = "Convert x from degrees to radians"
PythonRandint = "Random integer in [a,b]"
PythonRandom = "Floating point number in [0,1["
PythonRandom = "Floating point number in [0,1]"
PythonRandomFunction = "random module function prefix"
PythonRandrange = "Random number in range(start,stop)"
PythonRangeStartStop = "List from start to stop-1"
@@ -164,6 +137,12 @@ PythonShow = "Display the figure"
PythonSin = "Sine"
PythonSinh = "Hyperbolic sine"
PythonSleep = "Suspend the execution for t seconds"
PythonLocalTime = "Convert time into tuple"
PythonMktime = "Convert tuple into time"
PythonTime = "Get the current timestamp"
PythonSetLocaltime = "Set time from a tuple"
PythonRTCmode = "Get current RTC mode"
PythonSetRTCmode = "Set RTC mode"
PythonSort = "Sort the list"
PythonSqrt = "Square root"
PythonSum = "Sum the items of a list"
@@ -197,10 +176,19 @@ PythonTurtleWrite = "Display a text"
PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonImportSys = "Import sys module"
PythonOsUname = "Get infos about the system"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Remove file named filename"
PythonOsRename = "Rename file oldname to newname"
PythonOsListdir = "List files in memory"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonTimePrefix = "time module function prefix"
PythonTimeSleep = "Wait for n second"
PythonMonotonic = "Return monotonic time"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Hyperbolic cosine"
PythonCount = "Count the occurrences of x"
PythonDegrees = "Convert x from radians to degrees"
PythonDivMod = "Quotient and remainder"
PythonDrawCircle = "Draw a circle"
PythonDrawLine = "Draw a line"
PythonDrawString = "Display a text from pixel (x,y)"
PythonErf = "Error function"
PythonErfc = "Complementary error function"
@@ -52,12 +54,16 @@ PythonEval = "Return the evaluated expression"
PythonExp = "Exponential function"
PythonExpm1 = "Compute exp(x)-1"
PythonFabs = "Absolute value"
PythonFillCircle = "Fill a circle"
PythonFillPolygon = "Fill a polygon"
PythonFillRect = "Fill a rectangle at pixel (x,y)"
PythonFloat = "Convert x to a float"
PythonFloor = "Floor"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa and exponent of x: (m,e)"
PythonGamma = "Gamma function"
PythonGetKeys = "Obtener teclas presionadas"
PythonGetPalette = "Get theme palette"
PythonGetPixel = "Return pixel (x,y) color"
PythonGetrandbits = "Integer with k random bits"
PythonGrid = "Toggle the visibility of the grid"
@@ -69,6 +75,8 @@ PythonImportKandinsky = "Import kandinsky module"
PythonImportRandom = "Import random module"
PythonImportMath = "Import math module"
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
PythonImportNumpy = "Import ulab.numpy module"
PythonImportScipy = "Import ulab.scipy module"
PythonImportTime = "Import time module"
PythonImportTurtle = "Import turtle module"
PythonIndex = "Index of the first x occurrence"
@@ -79,54 +87,11 @@ PythonIonFunction = "ion module function prefix"
PythonIsFinite = "Check if x is finite"
PythonIsInfinite = "Check if x is infinity"
PythonIsKeyDown = "Return True if the k key is down"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Check if x is a NaN"
PythonKandinskyFunction = "kandinsky module function prefix"
PythonKeyLeft = "LEFT ARROW key"
PythonKeyUp = "UP ARROW key"
PythonKeyDown = "DOWN ARROW key"
PythonKeyRight = "RIGHT ARROW key"
PythonKeyOk = "OK key"
PythonKeyBack = "BACK key"
PythonKeyHome = "HOME key"
PythonKeyOnOff = "ON/OFF key"
PythonKeyShift = "SHIFT key"
PythonKeyAlpha = "ALPHA key"
PythonKeyXnt = "X,N,T key"
PythonKeyVar = "VAR key"
PythonKeyToolbox = "TOOLBOX key"
PythonKeyBackspace = "BACKSPACE key"
PythonKeyExp = "EXPONENTIAL key"
PythonKeyLn = "NATURAL LOGARITHM key"
PythonKeyLog = "DECIMAL LOGARITHM key"
PythonKeyImaginary = "IMAGINARY I key"
PythonKeyComma = "COMMA key"
PythonKeyPower = "POWER key"
PythonKeySine = "SINE key"
PythonKeyCosine = "COSINE key"
PythonKeyTangent = "TANGENT key"
PythonKeyPi = "PI key"
PythonKeySqrt = "SQUARE ROOT key"
PythonKeySquare = "SQUARE key"
PythonKeySeven = "7 key"
PythonKeyEight = "8 key"
PythonKeyNine = "9 key"
PythonKeyLeftParenthesis = "LEFT PARENTHESIS key"
PythonKeyRightParenthesis = "RIGHT PARENTHESIS key"
PythonKeyFour = "4 key"
PythonKeyFive = "5 key"
PythonKeySix = "6 key"
PythonKeyMultiplication = "MULTIPLICATION key"
PythonKeyDivision = "DIVISION key"
PythonKeyOne = "1 key"
PythonKeyTwo = "2 key"
PythonKeyThree = "3 key"
PythonKeyPlus = "PLUS key"
PythonKeyMinus = "MINUS key"
PythonKeyZero = "0 key"
PythonKeyDot = "DOT key"
PythonKeyEe = "10 POWER X key"
PythonKeyAns = "ANS key"
PythonKeyExe = "EXE key"
PythonLdexp = "Return x*(2**i), inverse of frexp"
PythonLength = "Length of an object"
PythonLgamma = "Log-gamma function"
@@ -139,6 +104,14 @@ PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Fractional and integer parts of x"
PythonMonotonic = "Value of a monotonic clock"
PythonNumpyFunction = "numpy module prefix"
PythonNumpyFftFunction = "numpy.fft module prefix"
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
PythonScipyFunction = "scipy module prefix"
PythonScipyLinalgFunction = "scipy.linalg module prefix"
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
PythonScipySignalFunction = "scipy.signal module prefix"
PythonScipySpecialFunction = "scipy.special module prefix"
PythonOct = "Convert integer to octal"
PythonPhase = "Phase of z"
PythonPlot = "Plot y versus x as lines"
@@ -164,6 +137,12 @@ PythonShow = "Display the figure"
PythonSin = "Sine"
PythonSinh = "Hyperbolic sine"
PythonSleep = "Suspend the execution for t seconds"
PythonLocalTime = "Convertir el tiempo en tupla"
PythonMktime = "Convertir tupla en tiempo"
PythonTime = "Obtener la marca de tiempo actual"
PythonSetLocaltime = "Establecer tiempo desde una tupla"
PythonRTCmode = "Obtener el modo RTC actual"
PythonSetRTCmode = "Establecer modo RTC"
PythonSort = "Sort the list"
PythonSqrt = "Square root"
PythonSum = "Sum the items of a list"
@@ -197,10 +176,19 @@ PythonTurtleWrite = "Display a text"
PythonUniform = "Floating point number in [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonImportSys = "Import sys module"
PythonOsUname = " Información del sistema "
PythonOsGetlogin = "Get username"
PythonOsRemove = "Eliminar un archivo"
PythonOsRename = "Renombrar archivo"
PythonOsListdir = "Archivos de la lista"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonTimePrefix = "time module function prefix"
PythonTimeSleep = "Esperar n segundos"
PythonMonotonic = "Tiempo monótono de retorno"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Cosinus hyperbolique"
PythonCount = "Compte les occurrences de x"
PythonDegrees = "Conversion de radians en degrés"
PythonDivMod = "Quotient et reste"
PythonDrawCircle = "Trace un cercle"
PythonDrawLine = "Trace une ligne"
PythonDrawString = "Affiche un texte au pixel (x,y)"
PythonErf = "Fonction d'erreur"
PythonErfc = "Fonction d'erreur complémentaire"
@@ -52,12 +54,16 @@ PythonEval = "Evalue l'expression en argument "
PythonExp = "Fonction exponentielle"
PythonExpm1 = "Calcul de exp(x)-1"
PythonFabs = "Valeur absolue"
PythonFillCircle = "Remplit un cercle"
PythonFillPolygon = "Remplit un polygone"
PythonFillRect = "Remplit un rectangle"
PythonFloat = "Conversion en flottant"
PythonFloor = "Partie entière"
PythonFmod = "a modulo b"
PythonFrExp = "Mantisse et exposant de x : (m,e)"
PythonGamma = "Fonction gamma"
PythonGetKeys = "Obtenir les touches pressées"
PythonGetPalette = "Obtient la palette du thème"
PythonGetPixel = "Renvoie la couleur du pixel (x,y)"
PythonGetrandbits = "Nombre aléatoire sur k bits"
PythonGrid = "Affiche ou masque la grille"
@@ -69,6 +75,8 @@ PythonImportKandinsky = "Importation du module kandinsky"
PythonImportRandom = "Importation du module random"
PythonImportMath = "Importation du module math"
PythonImportMatplotlibPyplot = "Importation de matplotlib.pyplot"
PythonImportNumpy = "Importation de ulab.numpy"
PythonImportScipy = "Importation de ulab.scipy"
PythonImportTurtle = "Importation du module turtle"
PythonImportTime = "Importation du module time"
PythonIndex = "Indice première occurrence de x"
@@ -79,54 +87,11 @@ PythonIonFunction = "Préfixe fonction module ion"
PythonIsFinite = "Teste si x est fini"
PythonIsInfinite = "Teste si x est infini"
PythonIsKeyDown = "Renvoie True si touche k enfoncée"
PythonBattery = "Renvoie le voltage de la batterie"
PythonBatteryLevel = "Renvoie le niveau de la batterie"
PythonBatteryIscharging = "Chargement en cours"
PythonIsNaN = "Teste si x est NaN"
PythonKandinskyFunction = "Préfixe fonction module kandinsky"
PythonKeyLeft = "Touche FLECHE GAUCHE"
PythonKeyUp = "Touche FLECHE HAUT"
PythonKeyDown = "Touche FLECHE BAS"
PythonKeyRight = "Touche FLECHE DROITE"
PythonKeyOk = "Touche OK"
PythonKeyBack = "Touche RETOUR"
PythonKeyHome = "Touche HOME"
PythonKeyOnOff = "Touche ON/OFF"
PythonKeyShift = "Touche SHIFT"
PythonKeyAlpha = "Touche ALPHA"
PythonKeyXnt = "Touche X,N,T"
PythonKeyVar = "Touche VAR"
PythonKeyToolbox = "Touche BOITE A OUTILS"
PythonKeyBackspace = "Touche EFFACER"
PythonKeyExp = "Touche EXPONENTIELLE"
PythonKeyLn = "Touche LOGARITHME NEPERIEN"
PythonKeyLog = "Touche LOGARITHME DECIMAL"
PythonKeyImaginary = "Touche I IMAGINAIRE"
PythonKeyComma = "Touche VIRGULE"
PythonKeyPower = "Touche PUISSANCE"
PythonKeySine = "Touche SINUS"
PythonKeyCosine = "Touche COSINUS"
PythonKeyTangent = "Touche TANGENTE"
PythonKeyPi = "Touche PI"
PythonKeySqrt = "Touche RACINE CARREE"
PythonKeySquare = "Touche CARRE"
PythonKeySeven = "Touche 7"
PythonKeyEight = "Touche 8"
PythonKeyNine = "Touche 9"
PythonKeyLeftParenthesis = "Touche PARENTHESE GAUCHE"
PythonKeyRightParenthesis = "Touche PARENTHESE DROITE"
PythonKeyFour = "Touche 4"
PythonKeyFive = "Touche 5"
PythonKeySix = "Touche 6"
PythonKeyMultiplication = "Touche MULTIPLICATION"
PythonKeyDivision = "Touche DIVISION"
PythonKeyOne = "Touche 1"
PythonKeyTwo = "Touche 2"
PythonKeyThree = "Touche 3"
PythonKeyPlus = "Touche PLUS"
PythonKeyMinus = "Touche MOINS"
PythonKeyZero = "Touche 0"
PythonKeyDot = "Touche POINT"
PythonKeyEe = "Touche 10 PUISSANCE X"
PythonKeyAns = "Touche ANS"
PythonKeyExe = "Touche EXE"
PythonLdexp = "Inverse de frexp : x*(2**i)"
PythonLength = "Longueur d'un objet"
PythonLgamma = "Logarithme de la fonction gamma"
@@ -139,6 +104,14 @@ PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Parties fractionnaire et entière"
PythonMonotonic = "Renvoie la valeur de l'horloge"
PythonNumpyFunction = "Préfixe fonction du module numpy"
PythonNumpyFftFunction = "Préfixe fonction du module numpy.fft"
PythonNumpyLinalgFunction = "Préfixe fonction du module numpy.linalg"
PythonScipyFunction = "Préfixe fonction du module scipy"
PythonScipyLinalgFunction = "Préfixe fonction du module scipy.linalg"
PythonScipyOptimizeFunction = "Préfixe fonction du module scipy.optimize"
PythonScipySignalFunction = "Préfixe fonction du module scipy.signal"
PythonScipySpecialFunction = "Préfixe fonction du module scipy.special"
PythonOct = "Conversion en octal"
PythonPhase = "Argument de z"
PythonPlot = "Trace y en fonction de x"
@@ -164,6 +137,12 @@ PythonShow = "Affiche la figure"
PythonSin = "Sinus"
PythonSinh = "Sinus hyperbolique"
PythonSleep = "Suspend l'exécution t secondes"
PythonLocalTime = "Convertir le temps en tuple"
PythonMktime = "Convertir le tuple en temps"
PythonTime = "Obtenir l'horodatage actuel"
PythonSetLocaltime = "Définir l'heure à partir d'un tuple"
PythonRTCmode = "Obtenir le mode RTC actuel"
PythonSetRTCmode = "Définir le mode RTC"
PythonSort = "Trie la liste"
PythonSqrt = "Racine carrée"
PythonSum = "Somme des éléments de la liste"
@@ -197,25 +176,34 @@ PythonTurtleWrite = "Affiche un texte"
PythonUniform = "Nombre décimal dans [a,b]"
PythonImportTime = "Importation du module temps"
PythonImportOs = "Importation du module os"
PythonImportSys = "Importation du module sys"
PythonOsUname = "Donne des infos sur le système"
PythonOsGetlogin = "Donne le nom d'utilisateur"
PythonOsRemove = "Supprime le fichier nommé filename"
PythonOsRename = "Renomme oldname en newname"
PythonOsListdir = "Liste les fichiers"
PythonSysExit = "Termine le programme"
PythonSysPrintexception = "Imprime une exception"
PythonSysByteorder = "L'ordre des octets du système"
PythonSysImplementation = "Information sur Python"
PythonSysModules = "Dictionnaire des modules chargés"
PythonSysVersion = "Version du langage Python (string)"
PythonSysVersioninfo = "Version du langage Python (tuple)"
PythonTimePrefix = "Préfixe fonction du module temps"
PythonTimeSleep = "Attendre n secondes"
PythonMonotonic = "Retourne le temps monotonic"
PythonMonotonic = "Retourne le temps monotone"
PythonFileOpen = "Ouvre un fichier"
PythonFileSeekable = "Indique si seek peut être utilisé"
PythonFileSeek = "Déplace le curseur interne"
PythonFileTell = "Donne la posititon du curseur"
PythonFileClose = "Ferme un fichier"
PythonFileClosed = "True si le fichier a été fermé"
PythonFileRead = "Lis jusqu'à size bytes"
PythonFileWrite = "Écris b dans le fichier"
PythonFileReadline = "Lis une ligne ou jusqu'à size bytes"
PythonFileReadlines = "Lis une liste de lignes"
PythonFileRead = "Lit jusqu'à size bytes"
PythonFileWrite = "Écrit b dans le fichier"
PythonFileReadline = "Lit une ligne ou jusqu'à size bytes"
PythonFileReadlines = "Lit une liste de lignes"
PythonFileTruncate = "Redimensionne le fichier"
PythonFileWritelines = "Écris une liste de lignes"
PythonFileWritelines = "Écrit une liste de lignes"
PythonFileName = "Nom du fichier"
PythonFileMode = "Mode d'ouverture du fichier"
PythonFileReadable = "Indique si read peut être utilisé"

View File

@@ -1,222 +1,210 @@
PythonPound = "Megjegyzés"
PythonPercent = "Modulo"
Python1J = "Képzeletbeli i"
PythonLF = "Line feed"
PythonLF = "Enter"
PythonTab = "Táblázat"
PythonAmpersand = "Bitwise és"
PythonSymbolExp = "Bitwise exkluzív vagy"
PythonVerticalBar = "Bitwise vagy"
PythonAmpersand = "Logikus és"
PythonSymbolExp = "logikus exkluzív vagy pedig"
PythonVerticalBar = "logikus vagy pedig"
PythonImag = "z képzeletbeli része"
PythonReal = "z valódi része"
PythonSingleQuote = "Egyetlen idézet"
PythonAbs = "Abszolút érték / nagyság"
PythonAcos = "Arc koszinusz"
PythonAcosh = "Íves hiperbolikus koszinusz"
PythonAppend = "x hozzáadása a lista végéhez"
PythonArrow = "Arrow from (x,y) to (x+dx,y+dy)"
PythonAsin = "Arc szinusz"
PythonAsinh = "Íves hiperbolikus szinusz"
PythonAtan = "Arc érintö"
PythonAtan2 = "Visszatérés atan (y / x)"
PythonAtanh = "Arc hiperbolikus érintö"
PythonAxis = "Set axes to (xmin,xmax,ymin,ymax)"
PythonBar = "Draw a bar plot with x values"
PythonSingleQuote = "apostróf"
PythonAbs = "Abszolút érték/nagyság"
PythonAcos = "Ív (arc) koszinusz"
PythonAcosh = "Hiperbolikus arc koszinusz"
PythonAppend = "Lista végére hozzáadni x-et"
PythonArrow = "(x,y) nyíla (x+dx,y+dy) nyílához"
PythonAsin = "Ív (arc) szinusz"
PythonAsinh = "Hiperbolikus ív (arc) szinusz"
PythonAtan = "Ív (arc) érintö (tan)"
PythonAtan2 = "atan(y/x) sámolása"
PythonAtanh = "Hiperbolikus ív (arc) érintö (atan)"
PythonAxis = "Tengelyeket (xmin,xmax,ymin,ymax)-ra állitani"
PythonBar = "Az x lista oszlopdiagramja"
PythonBin = "Egész szám konvertálása binárisra"
PythonCeil = "Mennyezet"
PythonChoice = "Véletlenszerü szám a listában"
PythonClear = "A lista ürítése"
PythonCmathFunction = "cmath modul funkció elötag"
PythonColor = "Rgb szín meghatározása"
PythonColor = "Rgb (pzk) szín allítása"
PythonColorBlack = "Fekete szín"
PythonColorBlue = "Kék szín"
PythonColorBrown = "Barna szín"
PythonColorGreen = "Zöld szín"
PythonColorGrey = "Szürke szín"
PythonColorGray = "Szürke szín"
PythonColorOrange = "Narancssárga szín"
PythonColorPink = "Rózsaszín szín"
PythonColorPurple = "Lila szín"
PythonColorRed = "Piros szín"
PythonColorWhite = "White color"
PythonColorWhite = "Fehér szín"
PythonColorYellow = "Sárga szín"
PythonComplex = "A + ib visszaadása"
PythonCopySign = "Visszatérés x-val y jelével"
PythonCopySign = "X visszaadása y jelével"
PythonCos = "Koszinusz"
PythonCosh = "Hiperbolikus koszinusz"
PythonCount = "Számolja az x elöfordulását"
PythonDegrees = "x konvertálása x-röl radiánokra fokokra"
PythonDegrees = "x konvertálása radiánokrol fokokra"
PythonDivMod = "Hányados és maradék"
PythonDrawString = "Szöveg megjelenítése pixelböl (x, y)"
PythonDrawCircle = "Rajzolj egy kört"
PythonDrawLine = "Húzzon egy vonalat "
PythonDrawString = "Szöveg megjelenítése (x, y)-en"
PythonErf = "Hiba funkció"
PythonErfc = "Kiegészítö hibafunkció"
PythonErfc = "Kiegészítö hiba funkció"
PythonEval = "Visszaadja az értékelt kifejezést"
PythonExp = "Exponenciális függvény"
PythonExpm1 = "Számítsuk ki az exp (x) -1-et"
PythonExpm1 = "exp(x)-1 sámitása"
PythonFabs = "Abszolút érték"
PythonFillRect = "Töltsön meg egy téglalapot pixelnél (x, y)"
PythonFloat = "x konvertálása float-ra"
PythonFloor = "Emelet"
PythonFillRect = "Téglalap töltése"
PythonFillCircle = "Kitölti a kört"
PythonFillPolygon = "Kitölti a poligont"
PythonFloat = "Konvertálása tizedes számra"
PythonFloor = "Egész része"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa és az x exponense"
PythonFrExp = "X mantissája és kiállítója"
PythonGamma = "Gamma funkció"
PythonGetPixel = "Visszatérési pixel (x, y) szín"
PythonGetrandbits = "Egész szám k véletlen bittel"
PythonGrid = "Toggle the visibility of the grid"
PythonHex = "Egész szám konvertálása hexadecimálisra"
PythonHist = "Draw the histogram of x"
PythonGetKeys = "Billentyűk lenyomva"
PythonGetPalette = "Téma paletta beszerzése"
PythonGetPixel = "Visszatéríti (x,y) színét"
PythonGetrandbits = "Váletlenszám visszatérítése k biten"
PythonGrid = "Rács megjelenítése/elrejtése"
PythonHex = "Decimális szám konvertálása hexadecimális számra"
PythonHist = "x hisztográmiája"
PythonImportCmath = "cmath modul importálása"
PythonImportIon = "Ion modul importálása"
PythonImportKandinsky = "Kandinsky modul importálása"
PythonImportRandom = "Véletlenszerü modul importálása"
PythonImportMath = "Import matematikai modul"
PythonImportMatplotlibPyplot = "Import matplotlib.pyplot module"
PythonImportTime = "Idömodul importálása"
PythonImportOs = "Os modul importálása"
PythonOsUname = "Információ a rendszerről"
PythonOsRemove = "Fájl eltávolítása"
PythonOsRename = "Fájl átnevezése"
PythonOsListdir = "Fájlok listázása"
PythonImportTurtle = "Import teknös modul"
PythonImportMath = "math modul importálása"
PythonImportMatplotlibPyplot = "matplotlib.pyplot modul importálása"
PythonImportNumpy = "ulab.numpy modul importálása"
PythonImportScipy = "ulab.scipy modul importálása"
PythonImportTurtle = "turtle modul importálása"
PythonImportTime = "time modul importálása"
PythonIndex = "Az elsö x esemény indexe"
PythonInput = "Érték kérése"
PythonInsert = "Helyezzen x-t az i indexbe a listában"
PythonInt = "x konvertálása egész számra"
PythonInput = "Irjon egy értéket (számot)"
PythonInsert = "x-et i. pozícióra helyezze a listában"
PythonInt = "egész számra konvertálás"
PythonIonFunction = "ion modul funkció elötag"
PythonIsFinite = "Ellenörizze, hogy x véges-e"
PythonIsInfinite = "Ellenörizze, hogy x végtelen-e"
PythonIsKeyDown = "True true, ha a k gomb le van nyomva"
PythonIsNaN = "Ellenörizze, hogy x nem NaN"
PythonKandinskyFunction = "kandinsky modul function prefix"
PythonKeyLeft = "Balra nyíl gomb"
PythonKeyUp = "FEL NYÍL gomb"
PythonKeyDown = "LE nyíl gomb"
PythonKeyRight = "JOBB NYÍL gomb"
PythonKeyOk = "OK gomb"
PythonKeyBack = "VISSZA kulcs"
PythonKeyHome = "HOME kulcs"
PythonKeyOnOff = "BE / KI gomb"
PythonKeyShift = "SHIFT kulcs"
PythonKeyAlpha = "ALPHA kulcs"
PythonKeyXnt = "X, N, T kulcs"
PythonKeyVar = "VAR kulcs"
PythonKeyToolbox = "TOOLBOX kulcs"
PythonKeyBackspace = "BACKSPACE kulcs"
PythonKeyExp = "EXPONENTIAL kulcs"
PythonKeyLn = "NATURAL LOGARITHM kulcs"
PythonKeyLog = "DECIMAL LOGARITHM kulcs"
PythonKeyImaginary = "IMAGINÁRIS I kulcs"
PythonKeyComma = "COMMA kulcs"
PythonKeyPower = "POWER kulcs"
PythonKeySine = "SINE kulcs"
PythonKeyCosine = "KOSZIN kulcs"
PythonKeyTangent = "TANGENT kulcs"
PythonKeyPi = "PI kulcs"
PythonKeySqrt = "SQUARE ROOT kulcs"
PythonKeySquare = "SQUARE kulcs"
PythonKeySeven = "7 kulcs"
PythonKeyEight = "8 kulcs"
PythonKeyNine = "9 kulcs"
PythonKeyLeftParenthesis = "Bal oldali PARENTHESIS kulcs"
PythonKeyRightParenthesis = "JOGOS SZÜLETÉS kulcs"
PythonKeyFour = "4 kulcs"
PythonKeyFive = "5 kulcs"
PythonKeySix = "6 kulcs"
PythonKeyMultiplication = "TÖBB MüKÖDÉS kulcs"
PythonKeyDivision = "DIVISION kulcs"
PythonKeyOne = "1 kulcs"
PythonKeyTwo = "2 kulcs"
PythonKeyThree = "3 kulcs"
PythonKeyPlus = "PLUS kulcs"
PythonKeyMinus = "MINUS kulcs"
PythonKeyZero = "0 kulcs"
PythonKeyDot = "DOT kulcs"
PythonKeyEe = "10 POWER X kulcs"
PythonKeyAns = "ANS kulcs"
PythonKeyExe = "EXE kulcs"
PythonLdexp = "Visszatérés x * (2 ** i), inverz a frexp értékhez"
PythonLength = "Objektum hossza"
PythonLgamma = "Log-gamma funkció"
PythonLog = "Logaritmus az alap"
PythonLog10 = "Logaritmus az alaphoz 10"
PythonLog2 = "Logaritmus az alaphoz 2"
PythonMathFunction = "matematikai modul funkció elötag"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot module prefix"
PythonIsFinite = "x véges-e"
PythonIsInfinite = "x végtelen-e"
PythonIsKeyDown = "True-t válaszol ha a k gomb le van nyomva"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Ellenörizze hogy x nem NaN"
PythonKandinskyFunction = "kandinsky modul funkció elötag"
PythonLdexp = "frexp ellentéte : x*(2**i)"
PythonLength = "Egy targy hossza"
PythonLgamma = "Gamma funkció logaritmusa"
PythonLog = "a alapú logaritmus"
PythonLog10 = "Decimális logaritmus"
PythonLog2 = "Bináris logaritmus"
PythonMathFunction = "math modul funkció elötag"
PythonMatplotlibPyplotFunction = "matplotlib.pyplot elötag"
PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Az x tört és egész részei"
PythonMonotonic = "A monoton óra értéke"
PythonOct = "Egész szám konvertálása oktális értékre"
PythonPhase = "z fázis"
PythonPlot = "Plot y versus x as lines"
PythonPolar = "z poláris koordinátákban"
PythonPop = "Az utolsó elem eltávolítása és visszaküldése"
PythonPower = "x emelve az y teljesítményre"
PythonPrint = "Objektum nyomtatása"
PythonRadians = "x konvertálása x fokról radiánra"
PythonRandint = "Véletlen egész szám [a, b] -ben"
PythonRandom = "Lebegöpontos szám [0,1-ben ["
PythonRandomFunction = "véletlenszerü modul funkció elötag"
PythonRandrange = "Véletlen szám a tartományban (start, stop)"
PythonRangeStartStop = "Lista az elejétöl a stop-1-ig"
PythonRangeStop = "Lista 0-tól stop-1-ig"
PythonRect = "z derékszögü koordinátákban"
PythonRemove = "Távolítsa el az x elsö elöfordulását"
PythonReverse = "A lista elemeinek megfordítása"
PythonRound = "N számjegyre kerekítve"
PythonScatter = "Draw a scatter plot of y versus x"
PythonSeed = "Inicializálja a véletlenszám-generátort"
PythonSetPixel = "Színes pixel (x, y)"
PythonShow = "Display the figure"
PythonSin = "Sine"
PythonModf = "x-nek tört és egész részei"
PythonMonotonic = "Az óra értékét adja vissza"
PythonNumpyFunction = "numpy elötag"
PythonNumpyFftFunction = "numpy.fft elötag"
PythonNumpyLinalgFunction = "numpy.linalg elötag"
PythonScipyFunction = "scipy elötag"
PythonScipyLinalgFunction = "scipy.linalg elötag"
PythonScipyOptimizeFunction = "scipy.optimize elötag"
PythonScipySignalFunction = "scipy.signal elötag"
PythonScipySpecialFunction = "scipy.special elötag"
PythonOct = "Decimális szám konvertálása octális számra"
PythonPhase = "z fázisa"
PythonPlot = "y-t jelöli x függvényében"
PythonPolar = "Verctorizálni"
PythonPop = "Az utolsó elemet el törölni"
PythonPower = "x y. kitevö"
PythonPrint = "Ki irni a elemeket"
PythonRadians = "Fokról radiánra konvertálni"
PythonRandint = "Véletlen egész szám [a;b] -ban"
PythonRandom = "Decimális szám [0;1] -ban"
PythonRandomFunction = "random modul funkció elötag"
PythonRandrange = "Véletlen szám range(start,stop)-ban"
PythonRangeStartStop = "start-tol stop-ig listája"
PythonRangeStop = "0 tol stop-ig lista"
PythonRect = "Algebrai számra konvertálni"
PythonRemove = "Elsö x elöfordulását törolni"
PythonReverse = "A lista elemeit megfordítani (másik irány)"
PythonRound = "N számjegyre kerekítni"
PythonScatter = "(x,y) halmaza"
PythonSeed = "Inicializálni a véletlenszám-választót"
PythonSetPixel = "Az (x,y) pixel-t ki szinezni"
PythonShow = "Mutassa az ábrát"
PythonSin = "Szinusz"
PythonSinh = "Hiperbolikus szinusz"
PythonSleep = "A végrehajtás felfüggesztése t másodpercre"
PythonSort = "A lista rendezése"
PythonSleep = "t másodpercre meg állitani a programmot"
PythonLocalTime = "Idő konvertálása csomóvá"
PythonMktime = "A tuple konvertálása az időben"
PythonTime = "Az aktuális időbélyeg letöltése"
PythonSetLocaltime = "Idő beállítása egy csomóból"
PythonRTCmode = "Aktuális RTC mód"
PythonSetRTCmode = "RTC mód beállítása"
PythonSort = "A listát rendezni"
PythonSqrt = "Négyzetgyök"
PythonSum = "Összegzi a lista elemeit"
PythonTan = "Érintö"
PythonTanh = "Hiperbolikus érintö"
PythonText = "Display a text at (x,y) coordinates"
PythonTimeFunction = "idömodul funkció elötag"
PythonTrunc = "x egészre csonkítva"
PythonTurtleBackward = "Visszalépés x pixelrel"
PythonTurtleCircle = "r pixel sugarú kör"
PythonTurtleColor = "Állítsa be az toll színét"
PythonTurtleColorMode = "Set the color mode to 1.0 or 255"
PythonTurtleForward = "Ugrás x pixelrel"
PythonTurtleFunction = "teknös modul funkció elötag"
PythonTurtleGoto = "Mozgatás (x, y) koordinátákra"
PythonTurtleHeading = "Visszaadja az aktuális címsort"
PythonSum = "Összeadni a lista elemeit"
PythonTan = "Érintö (tan)"
PythonTanh = "Hiperbolikus érintö (tan)"
PythonText = "(x,y) nél egy szöveget irni"
PythonTimeFunction = "time funkció elötag"
PythonTrunc = "Egész csonka (?)"
PythonTurtleBackward = "x pixelt hátra"
PythonTurtleCircle = "r pixel sugarú kört rajzolni"
PythonTurtleColor = "Toll szinét beállitani"
PythonTurtleColorMode = "Szin módot 1.0-ra vagy 255-ra állitani"
PythonTurtleForward = "x pixelt elölre"
PythonTurtleFunction = "turtle modul funkció elötag"
PythonTurtleGoto = "Menjen a (x,y) koordinátákra"
PythonTurtleHeading = "Visszaadja az aktuális irányt"
PythonTurtleHideturtle = "A teknös elrejtése"
PythonTurtleIsdown = "Visszatérés igazhoz, ha az toll lefelé"
PythonTurtleLeft = "Forduljon fokkal balra"
PythonTurtleIsdown = "True-t válaszol ha a toll irás pozícióban van"
PythonTurtleLeft = "a fokkot forduljon balra"
PythonTurtlePendown = "Húzza le a tollat"
PythonTurtlePensize = "Állítsa a vonalvastagságot x pixelre"
PythonTurtlePenup = "Húzza fel a tollat"
PythonTurtlePosition = "Az aktuális (x, y) hely visszaadása"
PythonTurtleReset = "A rajz visszaállítása"
PythonTurtleRight = "Forduljon fokkal jobbra"
PythonTurtleSetheading = "Állítsa be a tájolást fokokra"
PythonTurtleSetposition = "A helymeghatározás"
PythonTurtleShowturtle = "Mutasd a teknösöt"
PythonTurtlePosition = "Az aktuális (x,y) pozíciót visszaadása"
PythonTurtleReset = "Visszaállitani a rajzot (torléssel)"
PythonTurtleRight = "a fokkot forduljon jobbra"
PythonTurtleSetheading = "a fokokra állítja be az irányt"
PythonTurtleSetposition = "A teknös pozicioját allitja"
PythonTurtleShowturtle = "A teknöst meg mutatni"
PythonTurtleSpeed = "Rajzolási sebesség 0 és 10 között"
PythonTurtleWrite = "Display a text"
PythonUniform = "Lebegöpontos szám [a, b] -ben"
PythonImportTime = "Idömodul importálása"
PythonTimePrefix = "idömodul funkció elötag"
PythonTimeSleep = "Várj n másodpercet"
PythonMonotonic = "Vissza a monoton idö"
PythonTurtleWrite = "Szöveg irás"
PythonUniform = "Lebegöpontos szám [a,b] -ban"
PythonImportTime = "time modul importálása"
PythonTimePrefix = "time funkció elötag"
PythonTimeSleep = "n másodpercet várni"
PythonMonotonic = "Meg fordítani a monoton idö"
PythonFileOpen = "Fájl megnyitása"
PythonFileSeekable = "A fájl kereshető?"
PythonFileSeek = "A fájl kurzorának áthelyezése"
PythonFileTell = "A fájl kurzorának helye"
PythonFileClose = "Bezár egy fájlt"
PythonFileClosed = "Igaz, ha a fájl bezárt"
PythonFileRead = "Olvasson méretbájtig"
PythonFileWrite = "B beírása fájlba"
PythonFileReadline = "Olvas egy sort"
PythonFileReadlines = "Olvassa a sorok listáját"
PythonFileTruncate = "A fájl átméretezése méretre"
PythonFileWritelines = "Sorok listáját írja"
PythonFileName = "a fájl neve"
PythonFileMode = "a fájl nyitott módja"
PythonFileReadable = "A fájl olvasható?"
PythonFileWritable = "A fájl írható?"
PythonFileSeekable = "Seek-et lehete használni"
PythonFileSeek = "A kurzort áthelyezni"
PythonFileTell = "Visszaadja a kurzor helye"
PythonFileClose = "Bezárni egy fájlt"
PythonFileClosed = "True ha a fájl bezárva"
PythonFileRead = "Olvas 16 bájtig"
PythonFileWrite = "b-t irjon a fájlba"
PythonFileReadline = "Olvas egy sort vagy 16 bájtig"
PythonFileReadlines = "Olvas több sort"
PythonFileTruncate = "A fájl átméretezése"
PythonFileWritelines = "Irjon több sort"
PythonFileName = "A fájl neve"
PythonFileMode = "A fájl nyitott módja"
PythonFileReadable = "read-et lehete használni"
PythonFileWritable = "write-ot lehete használni"
PythonImportOs = "os modul importálása"
PythonOsUname = "Rendszer informaciók"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Fájl törlése"
PythonOsRename = "Fájl átnevezése"
PythonOsListdir = "Fájlok listája"
PythonImportSys = "sys modul importálása"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Coseno iperbolico"
PythonCount = "Conta le ricorrenze di x"
PythonDegrees = "Conversione di radianti in gradi"
PythonDivMod = "Quoziente e resto"
PythonDrawCircle = "Disegnare un cerchio"
PythonDrawLine = "Disegna una linea"
PythonDrawString = "Visualizza il testo dal pixel x,y"
PythonErf = "Funzione d'errore"
PythonErfc = "Funzione d'errore complementare"
@@ -52,12 +54,16 @@ PythonEval = "Valuta l'espressione nell'argomento "
PythonExp = "Funzione esponenziale"
PythonExpm1 = "Calcola exp(x)-1"
PythonFabs = "Valore assoluto"
PythonFillCircle = "Riempire un cerchio"
PythonFillPolygon = "Riempire un poligono"
PythonFillRect = "Riempie un rettangolo"
PythonFloat = "Conversione in flottanti"
PythonFloor = "Parte intera"
PythonFmod = "a modulo b"
PythonFrExp = "Mantissa ed esponente di x : (m,e)"
PythonGamma = "Funzione gamma"
PythonGetKeys = "Premere i tasti"
PythonGetPalette = "Ottieni la tavolozza del tema"
PythonGetPixel = "Restituisce colore del pixel(x,y)"
PythonGetrandbits = "Numero aleatorio con k bit"
PythonGrid = "Attiva la visibilità della griglia"
@@ -69,13 +75,24 @@ PythonImportKandinsky = "Importa modulo kandinsky"
PythonImportRandom = "Importa modulo random"
PythonImportMath = "Importa modulo math"
PythonImportMatplotlibPyplot = "Importa modulo matplotlib.pyplot"
PythonImportNumpy = "Importa modulo ulab.numpy"
PythonImportScipy = "Importa modulo ulab.scipy"
PythonImportTurtle = "Importa del modulo turtle"
PythonImportTime = "Importa del modulo time"
PythonImportOs = "Importa modulo os"
PythonOsUname = "Ottieni informazioni sul sistema"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Rimuovere un file"
PythonOsRename = "Rinomina file"
PythonOsListdir = "Elenca file"
PythonImportSys = "Importa modulo sys"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonIndex = "Indice prima occorrenza di x"
PythonInput = "Inserire un valore"
PythonInsert = "Inserire x in posizione i-esima"
@@ -84,54 +101,11 @@ PythonIonFunction = "Prefisso di funzione modulo ion"
PythonIsFinite = "Testa se x è finito"
PythonIsInfinite = "Testa se x est infinito"
PythonIsKeyDown = "Restituisce True premendo tasto k"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Testa se x è NaN"
PythonKandinskyFunction = "Prefisso funzione modulo kandinsky"
PythonKeyLeft = "Tasto FRECCIA SINISTRA"
PythonKeyUp = "Tasto FRECCIA ALTO"
PythonKeyDown = "Tasto FRECCIA BASSO"
PythonKeyRight = "Tasto FRECCIA DESTRA"
PythonKeyOk = "Tasto OK"
PythonKeyBack = "Tasto INDIETRO"
PythonKeyHome = "Tasto CASA"
PythonKeyOnOff = "Tasto ON/OFF"
PythonKeyShift = "Tasto SHIFT"
PythonKeyAlpha = "Tasto ALPHA"
PythonKeyXnt = "Tasto X,N,T"
PythonKeyVar = "Tasto VAR"
PythonKeyToolbox = "Tasto TOOLBOX"
PythonKeyBackspace = "Tasto CANCELLA"
PythonKeyExp = "Tasto ESPONENZIALE"
PythonKeyLn = "Tasto LOGARITMO NEPERIANO"
PythonKeyLog = "Tasto LOGARITMO DECIMALE"
PythonKeyImaginary = "Tasto I IMMAGINE"
PythonKeyComma = "Tasto VIRGOLA"
PythonKeyPower = "Tasto POTENZA"
PythonKeySine = "Tasto SENO"
PythonKeyCosine = "Tasto COSENO"
PythonKeyTangent = "Tasto TANGENTE"
PythonKeyPi = "Tasto PI"
PythonKeySqrt = "Tasto RADICE QUADRATA"
PythonKeySquare = "Tasto QUADRATO"
PythonKeySeven = "Tasto 7"
PythonKeyEight = "Tasto 8"
PythonKeyNine = "Tasto 9"
PythonKeyLeftParenthesis = "Tasto PARENTESI SINISTRA"
PythonKeyRightParenthesis = "Tasto PARENTESI DESTRA"
PythonKeyFour = "Tasto 4"
PythonKeyFive = "Tasto 5"
PythonKeySix = "Tasto 6"
PythonKeyMultiplication = "Tasto MOLTIPLICAZIONE"
PythonKeyDivision = "Tasto DIVISIONE"
PythonKeyOne = "Tasto 1"
PythonKeyTwo = "Tasto 2"
PythonKeyThree = "Tasto 3"
PythonKeyPlus = "Tasto PIÙ"
PythonKeyMinus = "Tasto MENO"
PythonKeyZero = "Tasto 0"
PythonKeyDot = "Tasto PUNTO"
PythonKeyEe = "Tasto 10 POTENZA X"
PythonKeyAns = "Tasto ANS"
PythonKeyExe = "Tasto EXE"
PythonLdexp = "Inversa di frexp : x*(2**i)"
PythonLength = "Longhezza di un oggetto"
PythonLgamma = "Logaritmo della funzione gamma"
@@ -144,6 +118,14 @@ PythonMax = "Massimo"
PythonMin = "Minimo"
PythonModf = "Parti frazionarie e intere"
PythonMonotonic = "Restituisce il valore dell'orologio"
PythonNumpyFunction = "Prefisso modulo numpy"
PythonNumpyFftFunction = "Prefisso modulo numpy.fft"
PythonNumpyLinalgFunction = "Prefisso modulo numpy.linalg"
PythonScipyFunction = "Prefisso modulo scipy"
PythonScipyLinalgFunction = "Prefisso modulo scipy.linalg"
PythonScipyOptimizeFunction = "Prefisso modulo scipy.optimize"
PythonScipySignalFunction = "Prefisso modulo scipy.signal"
PythonScipySpecialFunction = "Prefisso modulo scipy.special"
PythonOct = "Conversione in ottale"
PythonPhase = "Argomento di z"
PythonPlot = "Disegna y in f. di x come linee"
@@ -169,6 +151,12 @@ PythonShow = "Mostra la figura"
PythonSin = "Seno"
PythonSinh = "Seno iperbolico"
PythonSleep = "Sospende l'esecuzione t secondi"
PythonLocalTime = "Converti il tempo in tuple"
PythonMktime = "Converti tuple in tempo"
PythonTime = "Ottieni il timestamp corrente"
PythonSetLocaltime = "Imposta il tempo da una tupla"
PythonRTCmode = "Ottieni la modalità RTC corrente"
PythonSetRTCmode = "Imposta modalità RTC"
PythonSort = "Ordina l'elenco"
PythonSqrt = "Radice quadrata"
PythonSum = "Somma degli elementi della lista"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Cosinus hyperbolicus"
PythonCount = "Tel voorkomen van x"
PythonDegrees = "Zet x om van radialen naar graden"
PythonDivMod = "Quotiënt en rest"
PythonDrawCircle = "Teken een cirkel"
PythonDrawLine = "Teken een lijn"
PythonDrawString = "Geef een tekst weer van pixel (x,y)"
PythonErf = "Error functie"
PythonErfc = "Complementaire error functie"
@@ -52,12 +54,16 @@ PythonEval = "Geef de geëvalueerde uitdrukking"
PythonExp = "Exponentiële functie"
PythonExpm1 = "Bereken exp(x)-1"
PythonFabs = "Absolute waarde"
PythonFillCircle = "Vul een cirkel"
PythonFillPolygon = "Vul een veelhoek"
PythonFillRect = "Vul een rechthoek bij pixel (x,y)"
PythonFloat = "Zet x om in een float"
PythonFloor = "Vloer"
PythonFmod = "a modulo b"
PythonFrExp = "Mantisse en exponent van x: (m,e)"
PythonGamma = "Gammafunctie"
PythonGetKeys = "Get toetsen ingedrukt"
PythonGetPalette = "Thema palet krijgen"
PythonGetPixel = "Geef pixel (x,y) kleur (rgb)"
PythonGetrandbits = "Integer met k willekeurige bits"
PythonGrid = "Verander zichtbaarheid raster"
@@ -69,12 +75,24 @@ PythonImportKandinsky = "Importeer kandinsky module"
PythonImportRandom = "Importeer random module"
PythonImportMath = "Importeer math module"
PythonImportMatplotlibPyplot = "Importeer matplotlib.pyplot module"
PythonImportNumpy = "Importeer ulab.numpy module"
PythonImportScipy = "Importeer ulab.scipy module"
PythonImportTime = "Importeer time module"
PythonImportOs = "Importeer os module"
PythonOsUname = " Krijg systeeminfo"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Een bestand verwijderen"
PythonOsRename = "Hernoem bestand"
PythonOsListdir = "Lijstbestanden"
PythonImportSys = "Importeer sys module"
PythonImportSys = "Importeer sys module"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonImportTurtle = "Importeer turtle module"
PythonIndex = "Index van de eerste x aanwezigheden"
PythonInput = "Wijs een waarde toe"
@@ -84,54 +102,11 @@ PythonIonFunction = "ion module voorvoegsel"
PythonIsFinite = "Controleer of x eindig is"
PythonIsInfinite = "Controleer of x oneindig is"
PythonIsKeyDown = "Geef True als k toets omlaag is"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Controleer of x geen getal is"
PythonKandinskyFunction = "kandinsky module voorvoegsel"
PythonKeyLeft = "PIJL NAAR LINKS toets"
PythonKeyUp = "PIJL OMHOOG toets"
PythonKeyDown = "PIJL OMLAAG toets"
PythonKeyRight = "PIJL NAAR RECHTS toets"
PythonKeyOk = "OK toets"
PythonKeyBack = "TERUG toets"
PythonKeyHome = "HOME toets"
PythonKeyOnOff = "AAN/UIT toets"
PythonKeyShift = "SHIFT toets"
PythonKeyAlpha = "ALPHA toets"
PythonKeyXnt = "X,N,T toets"
PythonKeyVar = "VAR toets"
PythonKeyToolbox = "TOOLBOX toets"
PythonKeyBackspace = "BACKSPACE toets"
PythonKeyExp = "EXPONENTIEEL toets"
PythonKeyLn = "NATUURLIJKE LOGARITME toets"
PythonKeyLog = "BRIGGSE LOGARITME toets"
PythonKeyImaginary = "IMAGINAIRE I toets"
PythonKeyComma = "KOMMA toets"
PythonKeyPower = "MACHT toets"
PythonKeySine = "SINUS toets"
PythonKeyCosine = "COSINUS toets"
PythonKeyTangent = "TANGENS toets"
PythonKeyPi = "PI toets"
PythonKeySqrt = "VIERKANTSWORTEL toets"
PythonKeySquare = "KWADRAAT toets"
PythonKeySeven = "7 toets"
PythonKeyEight = "8 toets"
PythonKeyNine = "9 toets"
PythonKeyLeftParenthesis = "HAAKJE OPENEN toets"
PythonKeyRightParenthesis = "HAAKJE SLUITEN toets"
PythonKeyFour = "4 toets"
PythonKeyFive = "5 toets"
PythonKeySix = "6 toets"
PythonKeyMultiplication = "VERMENIGVULDIGEN toets"
PythonKeyDivision = "DELEN toets"
PythonKeyOne = "1 toets"
PythonKeyTwo = "2 toets"
PythonKeyThree = "3 toets"
PythonKeyPlus = "PLUS toets"
PythonKeyMinus = "MIN toets"
PythonKeyZero = "0 toets"
PythonKeyDot = "PUNT toets"
PythonKeyEe = "10 TOT DE MACHT X toets"
PythonKeyAns = "ANS toets"
PythonKeyExe = "EXE toets"
PythonLdexp = "Geeft x*(2**i), inversie van frexp"
PythonLength = "Lengte van een object"
PythonLgamma = "Log-gammafunctie"
@@ -144,6 +119,14 @@ PythonMax = "Maximum"
PythonMin = "Minimum"
PythonModf = "Fractionele en gehele delen van x"
PythonMonotonic = "Waarde van een monotone klok"
PythonNumpyFunction = "numpy module prefix"
PythonNumpyFftFunction = "numpy.fft module prefix"
PythonNumpyLinalgFunction = "numpy.linalg module prefix"
PythonScipyFunction = "scipy module prefix"
PythonScipyLinalgFunction = "scipy.linalg module prefix"
PythonScipyOptimizeFunction = "scipy.optimize module prefix"
PythonScipySignalFunction = "scipy.signal module prefix"
PythonScipySpecialFunction = "scipy.special module prefix"
PythonOct = "Integer omzetten naar octaal"
PythonPhase = "Fase van z in radialen"
PythonPlot = "Plot y versus x als lijnen"
@@ -169,6 +152,12 @@ PythonShow = "Figuur weergeven"
PythonSin= "Sinus"
PythonSinh = "Sinus hyperbolicus"
PythonSleep = "Stel executie voor t seconden uit"
PythonLocalTime = "Zet tijd om in tuple"
PythonMktime = "Tuple omzetten in tijd"
PythonTime = "Haal de huidige tijdstempel"
PythonSetLocaltime = "Stel de tijd in vanaf een tuple"
PythonRTCmode = "Huidige RTC-modus kregen"
PythonSetRTCmode = "RTC-modus instellen"
PythonSort = "Sorteer de lijst"
PythonSqrt = "Vierkantswortel"
PythonSum = "Sommeer de items van een lijst"

View File

@@ -45,6 +45,8 @@ PythonCosh = "Cosseno hiperbólico"
PythonCount = "Contar as ocorrências de x"
PythonDegrees = "Converter x de radianos para graus"
PythonDivMod = "Quociente e resto"
PythonDrawCircle = "Desenha um círculo"
PythonDrawLine = "Desenhe uma linha"
PythonDrawString = "Mostrar o texto do pixel (x,y)"
PythonErf = "Função erro"
PythonErfc = "Função erro complementar"
@@ -52,12 +54,16 @@ PythonEval = "Devolve a expressão avaliada"
PythonExp = "Função exponencial"
PythonExpm1 = "Calcular exp(x)-1"
PythonFabs = "Valor absoluto"
PythonFillCircle = "Preencher um círculo"
PythonFillPolygon = "Preencher um polígono"
PythonFillRect = "Preencher um retângulo em (x,y)"
PythonFloat = "Converter x num flutuante"
PythonFloor = "Parte inteira"
PythonFmod = "a módulo b"
PythonFrExp = "Coeficiente e expoente de x: (m, e)"
PythonGamma = "Função gama"
PythonGetKeys = "Obter teclas pressionadas"
PythonGetPalette = "Obter paleta temática"
PythonGetPixel = "Devolve a cor do pixel (x,y)"
PythonGetrandbits = "Número inteiro aleatório com k bits"
PythonGrid = "Alterar visibilidade da grelha"
@@ -69,6 +75,8 @@ PythonImportKandinsky = "Importar módulo kandinsky"
PythonImportRandom = "Importar módulo random"
PythonImportMath = "Importar módulo math"
PythonImportMatplotlibPyplot = "Importar módulo matplotlib.pyplot"
PythonImportNumpy = "Importar módulo ulab.numpy"
PythonImportScipy = "Importar módulo ulab.scipy"
PythonImportTime = "Importar módulo time"
PythonImportTurtle = "Importar módulo turtle"
PythonIndex = "Índice da primeira ocorrência de x"
@@ -79,54 +87,11 @@ PythonIonFunction = "Prefixo da função do módulo ion"
PythonIsFinite = "Verificar se x é finito"
PythonIsInfinite = "Verificar se x é infinito"
PythonIsKeyDown = "Devolve True se tecla k pressionada"
PythonBattery = "Return battery voltage"
PythonBatteryLevel = "Return battery level"
PythonBatteryIscharging = "Return if battery is charging"
PythonIsNaN = "Verificar se x é um NaN"
PythonKandinskyFunction = "Prefixo da função do módulo kandinsky"
PythonKeyLeft = "tecla SETA ESQUERDA"
PythonKeyUp = "tecla SETA CIMA "
PythonKeyDown = "tecla SETA BAIXO"
PythonKeyRight = "tecla SETA DIREITA"
PythonKeyOk = "tecla OK"
PythonKeyBack = "tecla VOLTAR"
PythonKeyHome = "tecla HOME"
PythonKeyOnOff = "tecla ON/OFF"
PythonKeyShift = "tecla SHIFT"
PythonKeyAlpha = "tecla ALPHA"
PythonKeyXnt = "tecla X,N,T"
PythonKeyVar = "tecla VAR"
PythonKeyToolbox = "tecla CAIXA DE FERRAMENTAS"
PythonKeyBackspace = "tecla APAGAR"
PythonKeyExp = "tecla EXPONENCIAL"
PythonKeyLn = "tecla LOGARITMO NATURAL"
PythonKeyLog = "tecla LOGARITMO DECIMAL"
PythonKeyImaginary = "tecla I IMAGINÁRIO"
PythonKeyComma = "tecla VÍRGULA"
PythonKeyPower = "tecla EXPOENTE"
PythonKeySine = "tecla SENO"
PythonKeyCosine = "tecla COSSENO"
PythonKeyTangent = "tecla TANGENTE"
PythonKeyPi = "tecla PI"
PythonKeySqrt = "tecla RAIZ QUADRADA"
PythonKeySquare = "tecla AO QUADRADO"
PythonKeySeven = "tecla 7"
PythonKeyEight = "tecla 8"
PythonKeyNine = "tecla 9"
PythonKeyLeftParenthesis = "tecla PARÊNTESE ESQUERDO"
PythonKeyRightParenthesis = "tecla PARÊNTESE DIREITO"
PythonKeyFour = "tecla 4"
PythonKeyFive = "tecla 5"
PythonKeySix = "tecla 6"
PythonKeyMultiplication = "tecla MULTIPLICAÇÃO"
PythonKeyDivision = "tecla DIVISÃO"
PythonKeyOne = "tecla 1"
PythonKeyTwo = "tecla 2"
PythonKeyThree = "tecla 3"
PythonKeyPlus = "tecla MAIS"
PythonKeyMinus = "tecla MENOS"
PythonKeyZero = "tecla 0"
PythonKeyDot = "tecla PONTO"
PythonKeyEe = "tecla 10 expoente X"
PythonKeyAns = "tecla ANS"
PythonKeyExe = "tecla EXE"
PythonLdexp = "Devolve x*(2**i), inverso de frexp"
PythonLength = "Comprimento de um objeto"
PythonLgamma = "Logaritmo da função gama"
@@ -139,6 +104,14 @@ PythonMax = "Máximo"
PythonMin = "Mínimo"
PythonModf = "Partes inteira e frácionária de x"
PythonMonotonic = "Devolve o valor do relógio"
PythonNumpyFunction = "Prefixo do módulo numpy"
PythonNumpyFftFunction = "Prefixo do módulo numpy.fft"
PythonNumpyLinalgFunction = "Prefixo do módulo numpy.linalg"
PythonScipyFunction = "Prefixo do módulo scipy"
PythonScipyLinalgFunction = "Prefixo do módulo scipy.linalg"
PythonScipyOptimizeFunction = "Prefixo do módulo scipy.optimize"
PythonScipySignalFunction = "Prefixo do módulo scipy.signal"
PythonScipySpecialFunction = "Prefixo do módulo scipy.special"
PythonOct = "Converter número inteiro em octal"
PythonPhase = "Argumento de z"
PythonPlot = "Desenhar y em função de x"
@@ -164,6 +137,12 @@ PythonShow = "Mostrar a figura"
PythonSin = "Seno"
PythonSinh = "Seno hiperbólico"
PythonSleep = "Suspender a execução por t segundos"
PythonLocalTime = "Convert o tempo em tupla"
PythonMktime = "Convert tuple em tempo"
PythonTime = "Obter o estamp de tempo atual"
PythonSetLocaltime = "Definir tempo a partir de uma tupla"
PythonRTCmode = "Obter o modo RTC atual"
PythonSetRTCmode = "Definir o modo RTC"
PythonSort = "Ordenar a lista"
PythonSqrt = "Raiz quadrada"
PythonSum = "Soma dos itens da lista"
@@ -198,9 +177,18 @@ PythonUniform = "Número decimal em [a,b]"
PythonImportTime = "Import time module"
PythonImportOs = "Import os module"
PythonOsUname = " Obter informações do sistema"
PythonOsGetlogin = "Get username"
PythonOsRemove = "Remover um ficheiro"
PythonOsRename = "Renomear ficheiro"
PythonOsListdir = "Listar ficheiros"
PythonImportSys = "Import sys module"
PythonSysExit = "Terminate current program"
PythonSysPrintexception = "Print exception"
PythonSysByteorder = "The byte order of the system"
PythonSysImplementation = "Information about Python"
PythonSysModules = "Dictionary of loaded modules"
PythonSysVersion = "Python language version (string)"
PythonSysVersioninfo = "Python language version (tuple)"
PythonTimePrefix = "time module function prefix"
PythonTimeSleep = "Wait for n second"
PythonMonotonic = "Return monotonic time"

View File

@@ -50,6 +50,8 @@ PythonCommandCount = "list.count(x)"
PythonCommandCountWithoutArg = ".count(\x11)"
PythonCommandDegrees = "degrees(x)"
PythonCommandDivMod = "divmod(a,b)"
PythonCommandDrawCircle = "draw_circle(x,y,r,color)"
PythonCommandDrawLine = "draw_line(x1,y1,x2,y2,color)"
PythonCommandDrawString = "draw_string(\"text\",x,y)"
PythonCommandConstantE = "e"
PythonCommandErf = "erf(x)"
@@ -59,12 +61,16 @@ PythonCommandExp = "exp(x)"
PythonCommandExpComplex = "exp(z)"
PythonCommandExpm1 = "expm1(x)"
PythonCommandFabs = "fabs(x)"
PythonCommandFillCircle = "fill_circle(x,y,r,color)"
PythonCommandFillPolygon = "fill_polygon([(x1,y1),...],color)"
PythonCommandFillRect = "fill_rect(x,y,width,height,color)"
PythonCommandFloat = "float(x)"
PythonCommandFloor = "floor(x)"
PythonCommandFmod = "fmod(a,b)"
PythonCommandFrExp = "frexp(x)"
PythonCommandGamma = "gamma(x)"
PythonCommandGetKeys = "get_keys()"
PythonCommandGetPalette = "get_palette()"
PythonCommandGetPixel = "get_pixel(x,y)"
PythonCommandGetrandbits = "getrandbits(k)"
PythonCommandGrid = "grid()"
@@ -85,9 +91,13 @@ PythonCommandImportIon = "import ion"
PythonCommandImportKandinsky = "import kandinsky"
PythonCommandImportMath = "import math"
PythonCommandImportMatplotlibPyplot = "import matplotlib.pyplot"
PythonCommandImportFromNumpy = "from ulab import numpy as np"
PythonCommandImportFromScipy = "from ulab import scipy as spy"
PythonCommandImportRandom = "import random"
PythonCommandImportOs = "import os"
PythonCommandImportFromOs = "from os import *"
PythonCommandImportSys = "import sys"
PythonCommandImportFromSys = "from sys import *"
PythonCommandImportTime = "import time"
PythonCommandImportTurtle = "import turtle"
PythonCommandIndex = "list.index(x)"
@@ -150,6 +160,9 @@ PythonCommandKeyEe = "KEY_EE"
PythonCommandKeyAns = "KEY_ANS"
PythonCommandKeyExe = "KEY_EXE"
PythonCommandIsKeyDown = "keydown(k)"
PythonCommandBattery = "battery()"
PythonCommandBatteryLevel = "battery_level()"
PythonCommandBatteryIscharging = "battery_ischarging()"
PythonCommandLdexp = "ldexp(x,i)"
PythonCommandLength = "len(object)"
PythonCommandLgamma = "lgamma(x)"
@@ -165,6 +178,120 @@ PythonCommandMax = "max(list)"
PythonCommandMin = "min(list)"
PythonCommandModf = "modf(x)"
PythonCommandMonotonic = "monotonic()"
PythonCommandNumpyArray = "np.array(a)"
PythonCommandNumpyArange = "np.arange(i)"
PythonCommandNumpyConcatenate = "np.concatenate(a,b)"
PythonCommandNumpyDiag = "np.diag(a)"
PythonCommandNumpyZeros = "np.zeros(s)"
PythonCommandNumpyOnes = "np.ones(s)"
PythonCommandNumpyEmpty = "np.empty(s)"
PythonCommandNumpyEye = "np.eye(n, m)"
PythonCommandNumpyFull = "np.full(s, v)"
PythonCommandNumpyLinspace = "np.linspace(s, e)"
PythonCommandNumpyLogspace = "np.logspace(s, e)"
PythonCommandNumpyCopy = "ndarray.copy()"
PythonCommandNumpyCopyWithoutArg = ".copy()"
PythonCommandNumpyDtype = "ndarray.dtype"
PythonCommandNumpyDtypeWithoutArg = ".dtype"
PythonCommandNumpyFlat = "ndarray.flat"
PythonCommandNumpyFlatWithoutArg = ".flat"
PythonCommandNumpyFlatten = "ndarray.flatten()"
PythonCommandNumpyFlattenWithoutArg = ".flatten()"
PythonCommandNumpyShape = "ndarray.shape"
PythonCommandNumpyShapeWithoutArg = ".shape"
PythonCommandNumpyReshape = "ndarray.reshape(s)"
PythonCommandNumpyReshapeWithoutArg = ".reshape(\x11)"
PythonCommandNumpySize = "ndarray.size"
PythonCommandNumpySizeWithoutArg = ".size"
PythonCommandNumpyTranspose = "ndarray.transpose()"
PythonCommandNumpyTransposeWithoutArg = ".transpose()"
PythonCommandNumpySort = "ndarray.sort()"
PythonCommandNumpySortWithoutArg = ".sort()"
PythonCommandNumpyFromBuffer = "ndarray.frombuffer(b)"
PythonCommandNumpyToBytes = "ndarray.tobytes()"
PythonCommandNumpyToBytesWithoutArg = ".tobytes()"
PythonCommandNumpySetPrintOptions = "np.set_printoptions()"
PythonCommandNumpyGetPrintOptions = "np.get_printoptions()"
PythonCommandNumpyNdinfo = "np.ndinfo(a)"
PythonCommandNumpyAll = "np.all(a)"
PythonCommandNumpyAny = "np.any(a)"
PythonCommandNumpyArgmax = "np.argmax(a)"
PythonCommandNumpyArgmin = "np.argmin(a)"
PythonCommandNumpyArgsort = "np.argsort(a)"
PythonCommandNumpyClip = "np.clip(a, min, max)"
PythonCommandNumpyConvolve = "np.convolve(a, b)"
PythonCommandNumpyDiff = "np.diff(a)"
PythonCommandNumpyInterp = "np.interp(a)"
PythonCommandNumpyDot = "np.dot(a, b)"
PythonCommandNumpyCross = "np.cross(a, b)"
PythonCommandNumpyEqual = "np.equal(a, b)"
PythonCommandNumpyNot_equal = "np.not_equal(a, b)"
PythonCommandNumpyFlip = "np.flip(a)"
PythonCommandNumpyIsfinite = "np.isfinite(a)"
PythonCommandNumpyIsinf = "np.isinf(a)"
PythonCommandNumpyMean = "np.mean(a)"
PythonCommandNumpyMin = "np.min(a)"
PythonCommandNumpyMax = "np.max(a)"
PythonCommandNumpyMedian = "np.median(a)"
PythonCommandNumpyMinimum = "np.minimum(a, b)"
PythonCommandNumpyMaximum = "np.maximum(a, b)"
PythonCommandNumpyPolyfit = "np.polyfit(a, b, y)"
PythonCommandNumpyPolyval = "np.polyval(p, x)"
PythonCommandNumpyRoll = "np.roll(a, n)"
PythonCommandNumpySortWithArguments = "np.sort(a)"
PythonCommandNumpyStd = "np.std(a)"
PythonCommandNumpySum = "np.sum(a)"
PythonCommandNumpyTrace = "np.trace(a)"
PythonCommandNumpyTrapz = "np.trapz(y)"
PythonCommandNumpyWhere = "np.where(c, x, y)"
PythonCommandNumpyVectorize = "np.vectorize(f)"
PythonCommandNumpyAcos = "np.acos(a)"
PythonCommandNumpyAcosh = "np.acosh(a)"
PythonCommandNumpyArctan2 = "np.arctan2(a)"
PythonCommandNumpyAround = "np.around(a)"
PythonCommandNumpyAsin = "np.asin(a)"
PythonCommandNumpyAsinh = "np.asinh(a)"
PythonCommandNumpyAtan = "np.atan(a)"
PythonCommandNumpyAtanh = "np.atanh(a)"
PythonCommandNumpyCeil = "np.ceil(a)"
PythonCommandNumpyCos = "np.cos(a)"
PythonCommandNumpyCosh = "np.cosh(a)"
PythonCommandNumpyDegrees = "np.degrees(a)"
PythonCommandNumpyExp = "np.exp(a)"
PythonCommandNumpyExpm1 = "np.expm1(a)"
PythonCommandNumpyFloor = "np.floor(a)"
PythonCommandNumpyLog = "np.log(a)"
PythonCommandNumpyLog10 = "np.log10(a)"
PythonCommandNumpyLog2 = "np.log2(a)"
PythonCommandNumpyRadians = "np.radians(a)"
PythonCommandNumpySin = "np.sin(a)"
PythonCommandNumpySinh = "np.sinh(a)"
PythonCommandNumpySqrt = "np.sqrt(a)"
PythonCommandNumpyTan = "np.tan(a)"
PythonCommandNumpyTanh = "np.tanh(a)"
PythonCommandNumpyBool = "np.bool"
PythonCommandNumpyFloat = "np.float"
PythonCommandNumpyUint8 = "np.uint8"
PythonCommandNumpyInt8 = "np.int8"
PythonCommandNumpyUint16 = "np.uint16"
PythonCommandNumpyInt16 = "np.int16"
PythonCommandNumpyNan = "np.nan"
PythonCommandNumpyInf = "np.inf"
PythonCommandNumpyE = "np.e"
PythonCommandNumpyPi = "np.pi"
PythonCommandNumpyFft = "np.fft.fft(a)"
PythonCommandNumpyIfft = "np.fft.ifft(a)"
PythonCommandNumpyDet = "np.linalg.det(a)"
PythonCommandNumpyEig = "np.linalg.eig(a)"
PythonCommandNumpyCholesky = "np.linalg.cholesky(a)"
PythonCommandNumpyInv = "np.linalg.inv(a)"
PythonCommandNumpyNorm = "np.linalg.norm(a)"
PythonCommandNumpyFunction = "np.function"
PythonCommandNumpyFunctionWithoutArg = "np.\x11"
PythonCommandNumpyFftFunction = "np.fft.function"
PythonCommandNumpyFftFunctionWithoutArg = "np.fft.\x11"
PythonCommandNumpyLinalgFunction = "np.linalg.function"
PythonCommandNumpyLinalgFunctionWithoutArg = "np.linalg.\x11"
PythonCommandOct = "oct(x)"
PythonCommandPhase = "phase(z)"
PythonCommandPlot = "plot(x,y,color)"
@@ -191,12 +318,39 @@ PythonCommandReverseWithoutArg = ".reverse()"
PythonCommandRound = "round(x,n)"
PythonCommandScatter = "scatter(x,y)"
PythonCommandSeed = "seed(x)"
PythonCommandScipyFunction = "spy.function"
PythonCommandScipyFunctionWithoutArg = "spy.\x11"
PythonCommandScipyLinalgFunction = "spy.linalg.function"
PythonCommandScipyLinalgFunctionWithoutArg = "spy.linalg.\x11"
PythonCommandScipyOptimizeFunction = "spy.optimize.function"
PythonCommandScipyOptimizeFunctionWithoutArg = "spy.optimize.\x11"
PythonCommandScipySignalFunction = "spy.signal.function"
PythonCommandScipySignalFunctionWithoutArg = "spy.signal.\x11"
PythonCommandScipySpecialFunction = "spy.special.function"
PythonCommandScipySpecialFunctionWithoutArg = "spy.special.\x11"
PythonCommandScipyLinalgChoSolve = "spy.linalg.cho_solve(a, b)"
PythonCommandScipyLinalgSolveTriangular = "spy.linalg.solve_triangular(a, b)"
PythonCommandScipyOptimizeBisect = "spy.optimize.bisect(f, a, b)"
PythonCommandScipyOptimizeFmin = "spy.optimize.fmin(f, x0)"
PythonCommandScipyOptimizeNewton = "spy.optimize.newton(f, x0)"
PythonCommandScipySignalSosfilt = "spy.signal.sosfilt(sos, x)"
PythonCommandScipySignalSpectrogram = "spy.signal.spectrogram(y)"
PythonCommandScipySpecialErf = "spy.erf(a)"
PythonCommandScipySpecialErfc = "spy.erfc(a)"
PythonCommandScipySpecialGamma = "spy.gamma(a)"
PythonCommandScipySpecialGammaln = "spy.gammaln(a)"
PythonCommandSetPixel = "set_pixel(x,y,color)"
PythonCommandShow = "show()"
PythonCommandSin = "sin(x)"
PythonCommandSinComplex = "sin(z)"
PythonCommandSinh = "sinh(x)"
PythonCommandSleep = "sleep(t)"
PythonCommandLocalTime = "localtime([timestamp])"
PythonCommandMktime = "mktime(tm)"
PythonCommandTime = "time()"
PythonCommandSetLocaltime = "setlocaltime(tm)"
PythonCommandRTCmode = "rtcmode()"
PythonCommandSetRTCmode = "setrtcmode(mode)"
PythonCommandSort = "list.sort()"
PythonCommandSortWithoutArg = ".sort()"
PythonCommandSorted = "sorted(list)"
@@ -215,11 +369,20 @@ PythonCommandUniform = "uniform(a,b)"
PythonConstantE = "2.718281828459045"
PythonConstantPi = "3.141592653589793"
PythonOsCommandUname = "uname()"
PythonOsCommandGetlogin = "getlogin()"
PythonOsCommandRemove = "remove(filename)"
PythonOsCommandRename = "rename(oldname, newname)"
PythonOsCommandRemoveWithoutArg = "remove(\x11)"
PythonOsCommandRenameWithoutArg = "rename(\x11,)"
PythonOsCommandListdir = "listdir()"
PythonSysCommandExit = "exit()"
PythonSysCommandPrintexception = "print_exception(exc)"
PythonSysCommandPrintexceptionWithoutArg = "print_exception(\x11)"
PythonSysCommandByteorder = "byteorder"
PythonSysCommandImplementation = "implementation"
PythonSysCommandModules = "modules"
PythonSysCommandVersion = "version"
PythonSysCommandVersioninfo = "version_info"
PythonTurtleCommandBackward = "backward(x)"
PythonTurtleCommandCircle = "circle(r)"
PythonTurtleCommandColor = "color('c')"

View File

@@ -102,7 +102,7 @@ void EditorView::GutterView::setOffset(KDCoordinate offset) {
KDSize EditorView::GutterView::minimalSizeForOptimalDisplay() const {
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

@@ -3,6 +3,7 @@
#include <escher/palette.h>
#include <ion/unicode/utf8_helper.h>
#include <python/port/port.h>
#include "../global_preferences.h"
extern "C" {
#include "py/nlr.h"
@@ -444,6 +445,11 @@ void PythonTextArea::addAutocompletion() {
}
bool PythonTextArea::addAutocompletionTextAtIndex(int nextIndex, int * currentIndexToUpdate) {
// If Autocomplete disable, skip this step
if(!GlobalPreferences::sharedGlobalPreferences()->autocomplete()) {
return false;
}
// The variable box should be loaded at this point
const char * autocompletionTokenBeginning = nullptr;
const char * autocompletionLocation = const_cast<char *>(cursorLocation());

View File

@@ -5,6 +5,7 @@ extern "C" {
#include <string.h>
#include <ctype.h>
}
#include "app.h"
namespace Code {
@@ -134,6 +135,173 @@ const ToolboxMessageTree MatplotlibPyplotModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColorGray, I18n::Message::PythonColorGray, false)
};
#if defined(INCLUDE_ULAB)
const ToolboxMessageTree NumpyNdarrayModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArray),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArange),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyConcatenate),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDiag),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyZeros),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyOnes),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEmpty),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEye),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFull),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLinspace),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLogspace),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFromBuffer),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCopy, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyCopyWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDtype, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyDtypeWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlat, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyFlatWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlatten, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyFlattenWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyShape, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyShapeWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyReshape, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyReshapeWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySize, I18n::Message::Default, false, I18n::Message::PythonCommandNumpySizeWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTranspose, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyTransposeWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySort, I18n::Message::Default, false, I18n::Message::PythonCommandNumpySortWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyToBytes, I18n::Message::Default, false, I18n::Message::PythonCommandNumpyToBytesWithoutArg)
};
const ToolboxMessageTree NumpyFunctionsModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNdinfo),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAll),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAny),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgmax),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgmin),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArgsort),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyClip),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyConvolve),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDiff),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInterp),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDot),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCross),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEqual),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNot_equal),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFlip),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIsfinite),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIsinf),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMean),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMin),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMax),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMedian),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMinimum),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyMaximum),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPolyfit),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPolyval),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyRoll),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySortWithArguments),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyStd),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySum),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTrace),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTrapz),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyWhere),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyVectorize),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAcos),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAcosh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyArctan2),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAround),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAsin),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAsinh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAtan),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyAtanh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCeil),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCos),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCosh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDegrees),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyExp),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyExpm1),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFloor),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog10),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLog2),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyRadians),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySin),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySinh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySqrt),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTan),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyTanh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyBool),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFloat),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyUint8),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInt8),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyUint16),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInt16),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNan),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInf),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyE),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyPi),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpySetPrintOptions),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyGetPrintOptions)
};
const ToolboxMessageTree NumpyFftModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFftFunction, I18n::Message::PythonNumpyFftFunction, false, I18n::Message::PythonCommandNumpyFftFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFft),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyIfft)
};
const ToolboxMessageTree NumpyLinalgModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyLinalgFunction, I18n::Message::PythonNumpyLinalgFunction, false, I18n::Message::PythonCommandNumpyLinalgFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyDet),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyEig),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyCholesky),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyInv),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyNorm)
};
const ToolboxMessageTree NumpyModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromNumpy, I18n::Message::PythonImportNumpy, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandNumpyFunction, I18n::Message::PythonNumpyFunction, false, I18n::Message::PythonCommandNumpyFunctionWithoutArg),
ToolboxMessageTree::Node(I18n::Message::NumpyNdarray, NumpyNdarrayModuleChildren),
ToolboxMessageTree::Node(I18n::Message::Functions, NumpyFunctionsModuleChildren),
ToolboxMessageTree::Node(I18n::Message::NumpyFftModule, NumpyFftModuleChildren),
ToolboxMessageTree::Node(I18n::Message::NumpyLinalgModule, NumpyLinalgModuleChildren)
};
const ToolboxMessageTree ScipyLinalgModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgFunction, I18n::Message::PythonScipyLinalgFunction, false, I18n::Message::PythonCommandScipyLinalgFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgChoSolve),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyLinalgSolveTriangular)
};
const ToolboxMessageTree ScipyOptimizeModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeFunction, I18n::Message::PythonScipyOptimizeFunction, false, I18n::Message::PythonCommandScipyOptimizeFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeBisect),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeFmin),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyOptimizeNewton)
};
const ToolboxMessageTree ScipySignalModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalFunction, I18n::Message::PythonScipySignalFunction, false, I18n::Message::PythonCommandScipySignalFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalSosfilt),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySignalSpectrogram)
};
const ToolboxMessageTree ScipySpecialModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialFunction, I18n::Message::PythonScipySpecialFunction, false, I18n::Message::PythonCommandScipySpecialFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialErf),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialErfc),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialGamma),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipySpecialGammaln),
};
const ToolboxMessageTree ScipyModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromScipy, I18n::Message::PythonImportScipy, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandScipyFunction, I18n::Message::PythonScipyFunction, false, I18n::Message::PythonCommandScipyFunctionWithoutArg),
ToolboxMessageTree::Node(I18n::Message::ScipyLinalgModule, ScipyLinalgModuleChildren),
ToolboxMessageTree::Node(I18n::Message::ScipyOptimizeModule, ScipyOptimizeModuleChildren),
ToolboxMessageTree::Node(I18n::Message::ScipySignalModule, ScipySignalModuleChildren),
ToolboxMessageTree::Node(I18n::Message::ScipySpecialModule, ScipySpecialModuleChildren),
};
const ToolboxMessageTree UlabModuleChildren[] = {
ToolboxMessageTree::Node(I18n::Message::NumpyModule, NumpyModuleChildren),
ToolboxMessageTree::Node(I18n::Message::ScipyModule, ScipyModuleChildren),
ToolboxMessageTree::Leaf(I18n::Message::UlabDocumentation, I18n::Message::UlabDocumentationLink)
};
#endif
const ToolboxMessageTree TurtleModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTurtle, I18n::Message::PythonImportTurtle, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTurtle, I18n::Message::PythonImportTurtle, false),
@@ -192,88 +360,74 @@ const ToolboxMessageTree KandinskyModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetPixel, I18n::Message::PythonSetPixel),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandColor, I18n::Message::PythonColor),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect)
};
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawCircle, I18n::Message::PythonDrawCircle),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillCircle, I18n::Message::PythonFillCircle),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillPolygon, I18n::Message::PythonFillPolygon),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGetKeys, I18n::Message::PythonGetKeys),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandGetPalette, I18n::Message::PythonGetPalette)};
const ToolboxMessageTree IonModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportIon, I18n::Message::PythonImportIon, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromIon, I18n::Message::PythonImportIon, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIonFunction, I18n::Message::PythonIonFunction, false, I18n::Message::PythonCommandIonFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeft, I18n::Message::PythonKeyLeft, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyUp, I18n::Message::PythonKeyUp, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDown, I18n::Message::PythonKeyDown, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRight, I18n::Message::PythonKeyRight, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOk, I18n::Message::PythonKeyOk, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBack, I18n::Message::PythonKeyBack, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyHome, I18n::Message::PythonKeyHome, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOnOff, I18n::Message::PythonKeyOnOff, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyShift, I18n::Message::PythonKeyShift, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAlpha, I18n::Message::PythonKeyAlpha, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyXnt, I18n::Message::PythonKeyXnt, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyVar, I18n::Message::PythonKeyVar, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyToolbox, I18n::Message::PythonKeyToolbox, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyBackspace, I18n::Message::PythonKeyBackspace, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExp, I18n::Message::PythonKeyExp, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLn, I18n::Message::PythonKeyLn, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLog, I18n::Message::PythonKeyLog, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyImaginary, I18n::Message::PythonKeyImaginary, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyComma, I18n::Message::PythonKeyComma, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPower, I18n::Message::PythonKeyPower, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySine, I18n::Message::PythonKeySine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyCosine, I18n::Message::PythonKeyCosine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTangent, I18n::Message::PythonKeyTangent, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPi, I18n::Message::PythonKeyPi, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySqrt, I18n::Message::PythonKeySqrt, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySquare, I18n::Message::PythonKeySquare, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySeven, I18n::Message::PythonKeySeven, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEight, I18n::Message::PythonKeyEight, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyNine, I18n::Message::PythonKeyNine, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyLeftParenthesis, I18n::Message::PythonKeyLeftParenthesis, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyRightParenthesis, I18n::Message::PythonKeyRightParenthesis, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFour, I18n::Message::PythonKeyFour, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyFive, I18n::Message::PythonKeyFive, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeySix, I18n::Message::PythonKeySix, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMultiplication, I18n::Message::PythonKeyMultiplication, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDivision, I18n::Message::PythonKeyDivision, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyOne, I18n::Message::PythonKeyOne, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyTwo, I18n::Message::PythonKeyTwo, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyThree, I18n::Message::PythonKeyThree, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyPlus, I18n::Message::PythonKeyPlus, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyMinus, I18n::Message::PythonKeyMinus, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyZero, I18n::Message::PythonKeyZero, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyDot, I18n::Message::PythonKeyDot, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyEe, I18n::Message::PythonKeyEe, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyAns, I18n::Message::PythonKeyAns, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKeyExe, I18n::Message::PythonKeyExe, false)
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBattery, I18n::Message::PythonBattery),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBatteryLevel, I18n::Message::PythonBatteryLevel),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBatteryIscharging, I18n::Message::PythonBatteryIscharging),
ToolboxMessageTree::Leaf(I18n::Message::IonSelector, I18n::Message::IonSelector)
};
const ToolboxMessageTree TimeModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportTime, I18n::Message::PythonImportTime, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromTime, I18n::Message::PythonImportTime, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandTimeFunction, I18n::Message::PythonTimeFunction, false, I18n::Message::PythonCommandTimeFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandTime, I18n::Message::PythonTime),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandMonotonic, I18n::Message::PythonMonotonic, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSleep, I18n::Message::PythonSleep)
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSleep, I18n::Message::PythonSleep),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLocalTime, I18n::Message::PythonLocalTime),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandMktime, I18n::Message::PythonMktime),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetLocaltime, I18n::Message::PythonSetLocaltime),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandRTCmode, I18n::Message::PythonRTCmode),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandSetRTCmode, I18n::Message::PythonSetRTCmode),
};
const ToolboxMessageTree OsModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportOs, I18n::Message::PythonImportOs, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromOs, I18n::Message::PythonImportOs, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandUname, I18n::Message::PythonOsUname, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandGetlogin, I18n::Message::PythonOsGetlogin, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRemove, I18n::Message::PythonOsRemove, false, I18n::Message::PythonOsCommandRemoveWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandRename, I18n::Message::PythonOsRename, false, I18n::Message::PythonOsCommandRenameWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonOsCommandListdir, I18n::Message::PythonOsListdir, false)
};
const ToolboxMessageTree SysModuleChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportSys, I18n::Message::PythonImportSys, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandImportFromSys, I18n::Message::PythonImportSys, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandExit, I18n::Message::PythonSysExit, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandPrintexception, I18n::Message::PythonSysPrintexception, false, I18n::Message::PythonSysCommandPrintexceptionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandByteorder, I18n::Message::PythonSysByteorder, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandImplementation, I18n::Message::PythonSysImplementation, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandModules, I18n::Message::PythonSysModules, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandVersion, I18n::Message::PythonSysVersion, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonSysCommandVersioninfo, I18n::Message::PythonSysVersioninfo, false)
};
const ToolboxMessageTree modulesChildren[] = {
ToolboxMessageTree::Node(I18n::Message::MathModule, MathModuleChildren),
ToolboxMessageTree::Node(I18n::Message::CmathModule, CMathModuleChildren),
ToolboxMessageTree::Node(I18n::Message::MatplotlibPyplotModule, MatplotlibPyplotModuleChildren),
#if defined(INCLUDE_ULAB)
ToolboxMessageTree::Node(I18n::Message::UlabModule, UlabModuleChildren),
#endif
ToolboxMessageTree::Node(I18n::Message::TurtleModule, TurtleModuleChildren),
ToolboxMessageTree::Node(I18n::Message::RandomModule, RandomModuleChildren),
ToolboxMessageTree::Node(I18n::Message::KandinskyModule, KandinskyModuleChildren),
ToolboxMessageTree::Node(I18n::Message::IonModule, IonModuleChildren),
ToolboxMessageTree::Node(I18n::Message::OsModule, OsModuleChildren),
ToolboxMessageTree::Node(I18n::Message::SysModule, SysModuleChildren),
ToolboxMessageTree::Node(I18n::Message::TimeModule, TimeModuleChildren)
};
@@ -315,6 +469,8 @@ const ToolboxMessageTree catalogChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandCosh, I18n::Message::PythonCosh),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDegrees, I18n::Message::PythonDegrees),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDivMod, I18n::Message::PythonDivMod),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawCircle, I18n::Message::PythonDrawCircle),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawLine, I18n::Message::PythonDrawLine),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandDrawString, I18n::Message::PythonDrawString),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandConstantE, I18n::Message::PythonConstantE, false),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandErf, I18n::Message::PythonErf),
@@ -323,6 +479,8 @@ const ToolboxMessageTree catalogChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExp, I18n::Message::PythonExp),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandExpm1, I18n::Message::PythonExpm1),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFabs, I18n::Message::PythonFabs),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillCircle, I18n::Message::PythonFillCircle),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillPolygon, I18n::Message::PythonFillPolygon),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFillRect, I18n::Message::PythonFillRect),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloat, I18n::Message::PythonFloat),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandFloor, I18n::Message::PythonFloor),
@@ -365,6 +523,7 @@ const ToolboxMessageTree catalogChildren[] = {
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsNaN, I18n::Message::PythonIsNaN),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandKandinskyFunction, I18n::Message::PythonKandinskyFunction, false, I18n::Message::PythonCommandKandinskyFunctionWithoutArg),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandIsKeyDown, I18n::Message::PythonIsKeyDown),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandBattery, I18n::Message::PythonBattery),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLdexp, I18n::Message::PythonLdexp),
ToolboxMessageTree::Leaf(I18n::Message::PythonTurtleCommandLeft, I18n::Message::PythonTurtleLeft),
ToolboxMessageTree::Leaf(I18n::Message::PythonCommandLength, I18n::Message::PythonLength),
@@ -534,8 +693,18 @@ KDCoordinate PythonToolbox::rowHeight(int j) {
}
bool PythonToolbox::selectLeaf(int selectedRow) {
m_selectableTableView.deselectTable();
ToolboxMessageTree * node = (ToolboxMessageTree *)m_messageTreeModel->childAtIndex(selectedRow);
#if defined(INCLUDE_ULAB)
if(node->text() == I18n::Message::UlabDocumentationLink){
return true;
}
#endif
m_selectableTableView.deselectTable();
if(node->insertedText() == I18n::Message::IonSelector){
m_ionKeys.setSender(sender());
Container::activeApp()->displayModalViewController(static_cast<ViewController*>(&m_ionKeys), 0.f, 0.f, Metric::PopUpTopMargin, Metric::PopUpLeftMargin, 0, Metric::PopUpRightMargin);
return true;
}
const char * editedText = I18n::translate(node->insertedText());
// strippedEditedText array needs to be in the same scope as editedText
char strippedEditedText[k_maxMessageSize];

View File

@@ -5,6 +5,7 @@
#include <escher.h>
#include <ion/events.h>
#include <kandinsky/font.h>
#include "toolbox_ion_keys.h"
namespace Code {
@@ -32,6 +33,7 @@ private:
void scrollToAndSelectChild(int i);
MessageTableCellWithMessage m_leafCells[k_maxNumberOfDisplayedRows];
MessageTableCellWithChevron m_nodeCells[k_maxNumberOfDisplayedRows];
toolboxIonKeys m_ionKeys;
};
}

View File

@@ -21,10 +21,10 @@ void ScriptNodeCell::ScriptNodeView::drawRect(KDContext * ctx, KDRect rect) cons
const int nodeNameLength = m_scriptNode->nameLength();
KDSize nameSize = k_font->stringSize(nodeName, nodeNameLength);
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 (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

View File

@@ -8,11 +8,9 @@ bool ScriptStore::ScriptNameIsFree(const char * baseName) {
return ScriptBaseNamed(baseName).isNull();
}
// Here we add "base" script
ScriptStore::ScriptStore() {
addScriptFromTemplate(ScriptTemplate::Squares());
addScriptFromTemplate(ScriptTemplate::Parabola());
addScriptFromTemplate(ScriptTemplate::Mandelbrot());
addScriptFromTemplate(ScriptTemplate::Polynomial());
}
void ScriptStore::deleteAllScripts() {

View File

@@ -5,103 +5,9 @@ namespace Code {
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() {
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:
constexpr ScriptTemplate(const char * name, const char * value) : m_name(name), m_value(value) {}
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 * content() const { return m_value + Script::StatusSize(); }
const char * value() const { return m_value; }

View File

@@ -0,0 +1,27 @@
#include "../toolbox_ion_keys.h"
namespace Code {
toolboxIonKeys::toolboxIonKeys() :
ViewController(nullptr),
m_view()
{
}
bool toolboxIonKeys::handleEvent(Ion::Events::Event e) {
return false;
}
toolboxIonKeys::toolboxIonView::toolboxIonView():
View()
{
}
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
return;
}
View * toolboxIonKeys::view(){
return &m_view;
}
}

View File

@@ -4,3 +4,4 @@ Modules = "Module"
LoopsAndTests = "Schleifen und Tests"
Files = "Dateien"
Exceptions = "Ausnahmen"
UlabDocumentation = "Dokumentation"

View File

@@ -4,3 +4,4 @@ Modules = "Modules"
LoopsAndTests = "Loops and tests"
Files = "Files"
Exceptions = "Exceptions"
UlabDocumentation = "Documentation"

View File

@@ -4,3 +4,4 @@ Modules = "Modules"
LoopsAndTests = "Loops and tests"
Files = "Files"
Exceptions = "Exceptions"
UlabDocumentation = "Documentación"

View File

@@ -4,3 +4,4 @@ Modules = "Modules"
LoopsAndTests = "Boucles et tests"
Files = "Fichiers"
Exceptions = "Exceptions"
UlabDocumentation = "Documentation"

View File

@@ -4,3 +4,4 @@ Modules = "Modulok"
LoopsAndTests = "Hurkok és tesztek"
Files = "Fájlok"
Exceptions = "Kivételek"
UlabDocumentation = "Dokumentáció"

View File

@@ -4,3 +4,4 @@ Modules = "Moduli"
LoopsAndTests = "Cicli e test"
Files = "Files"
Exceptions = "Exceptions"
UlabDocumentation = "Documentazione"

View File

@@ -4,3 +4,4 @@ Modules = "Modules"
LoopsAndTests = "Herhalingen en testen"
Files = "Files"
Exceptions = "Exceptions"
UlabDocumentation = "Documentatie"

View File

@@ -4,3 +4,4 @@ Modules = "Módulos"
LoopsAndTests = "Laços e testes"
Files = "Files"
Exceptions = "Exceptions"
UlabDocumentation = "Documentação"

View File

@@ -3,9 +3,20 @@ IonModule = "ion"
KandinskyModule = "kandinsky"
MathModule = "math"
MatplotlibPyplotModule = "matplotlib.pyplot"
NumpyModule = "numpy"
NumpyFftModule = "fft"
NumpyLinalgModule = "linalg"
ScipyModule = "scipy"
ScipyLinalgModule = "linalg"
ScipyOptimizeModule = "optimize"
ScipySignalModule = "signal"
ScipySpecialModule = "special"
NumpyNdarray = "ndarray"
OsModule = "os"
SysModule = "sys"
TimeModule = "time"
TurtleModule = "turtle"
UlabModule = "ulab"
ForLoopMenu = "For"
IfStatementMenu = "If"
WhileLoopMenu = "While"
@@ -57,3 +68,6 @@ PythonCommandDef = "def \x11():\n "
PythonCommandDefWithArg = "def function(x):"
PythonCommandReturn = "return "
RandomModule = "random"
IonSelector = "Key selector"
PressAKey = "Press a key"
UlabDocumentationLink = "micropython-ulab.readthedocs.io"

View File

@@ -0,0 +1,50 @@
#include "toolbox_ion_keys.h"
#include <apps/apps_container.h>
#include <assert.h>
#include <ion.h>
extern "C" {
#include <py/obj.h>
#include <py/objfun.h>
}
extern const mp_rom_map_elem_t modion_module_globals_table[48];
namespace Code {
toolboxIonKeys::toolboxIonKeys() :
ViewController(nullptr),
m_view()
{
}
bool toolboxIonKeys::handleEvent(Ion::Events::Event e) {
Ion::Keyboard::State state = Ion::Keyboard::scan();
for(uint16_t i = 0; i < sizeof(modion_module_globals_table)/sizeof(_mp_rom_map_elem_t); i++){
_mp_rom_map_elem_t element = modion_module_globals_table[i];
if(mp_obj_is_small_int(element.value)){
int key = mp_obj_get_int(element.value);
if(state.keyDown(static_cast<Ion::Keyboard::Key>(key))){
m_sender->handleEventWithText(qstr_str(MP_OBJ_QSTR_VALUE(element.key)), true);
}
}
}
Container::activeApp()->dismissModalViewController();
AppsContainer::sharedAppsContainer()->redrawWindow();
return true;
}
toolboxIonKeys::toolboxIonView::toolboxIonView():
View()
{
}
void toolboxIonKeys::toolboxIonView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(rect, Palette::WallScreen);
ctx->strokeRect(rect, Palette::ListCellBorder);
ctx->drawString(I18n::translate(I18n::Message::PressAKey),KDPoint(rect.left()+80, rect.top()+20),KDFont::LargeFont,Palette::PrimaryText,Palette::WallScreen);
}
View * toolboxIonKeys::view(){
return &m_view;
}
}

View File

@@ -0,0 +1,21 @@
#include <escher.h>
namespace Code {
class toolboxIonKeys : public ViewController {
public :
toolboxIonKeys();
View * view() override;
bool handleEvent(Ion::Events::Event e) override;
void setSender(InputEventHandler * sender) { m_sender = sender; }
private :
class toolboxIonView : public View {
public :
toolboxIonView();
void drawRect(KDContext * ctx, KDRect rect) const override;
};
toolboxIonView m_view;
InputEventHandler * m_sender;
};
}

View File

@@ -43,9 +43,9 @@ public:
private:
constexpr static size_t k_maxNumberOfDisplayedItems = (Ion::Display::Height - Metric::TitleBarHeight - Metric::PopUpTopMargin) / ScriptNodeCell::k_simpleItemHeight + 2; // +2 if the cells are cropped on top and at the bottom
constexpr static size_t k_maxScriptNodesCount = 32; // Chosen without particular reasons
constexpr static size_t k_maxScriptNodesCount = 64; // Chosen without particular reasons (Number of functions in the variables box)
constexpr static int k_totalBuiltinNodesCount = 107;
constexpr static uint8_t k_scriptOriginsCount = 3;
constexpr static uint8_t k_scriptOriginsCount = 8; // Number of scripts loaded in the variable box
constexpr static uint8_t k_subtitleCellType = NodeCellType; // We don't care as it is not selectable
constexpr static uint8_t k_itemCellType = LeafCellType; // So that upper class NestedMenuController knows it's a leaf
constexpr static KDCoordinate k_subtitleRowHeight = 23;

View File

@@ -55,29 +55,43 @@ bool fileAtIndex(size_t index, File &entry) {
* TAR files are comprised of a set of records aligned to 512 bytes boundary
* followed by data.
*/
while (index-- > 0) {
for(;;) {
// Calculate the size
size = 0;
for (int i = 0; i < 11; i++)
size = size * 8 + (tar->size[i] - '0');
// Check if we found our file.
if (index == 0) {
// If yes, check for sanity and for exam mode stuff
if (!isSane(tar) || isExamModeAndFileNotExecutable(tar)) {
return false;
}
// Move to the next TAR header.
unsigned stride = (sizeof(TarHeader) + size + 511);
stride = (stride >> 9) << 9;
tar = reinterpret_cast<const TarHeader*>(reinterpret_cast<const char*>(tar) + stride);
// File entry found, copy data out.
entry.name = tar->name;
entry.data = reinterpret_cast<const uint8_t*>(tar) + sizeof(TarHeader);
entry.dataLength = size;
entry.isExecutable = (tar->mode[4] & 0x01) == 1;
// Sanity check.
if (!isSane(tar) || isExamModeAndFileNotExecutable(tar)) {
return false;
return true;
} else {
// move to the next TAR header.
unsigned stride = (sizeof(TarHeader) + size + 511);
stride = (stride >> 9) << 9;
tar = reinterpret_cast<const TarHeader*>(reinterpret_cast<const char*>(tar) + stride);
// Sanity check.
if (!isSane(tar)) {
return false;
}
}
index--;
}
// File entry found, copy data out.
entry.name = tar->name;
entry.data = reinterpret_cast<const uint8_t*>(tar) + sizeof(TarHeader);
entry.dataLength = size;
entry.isExecutable = (tar->mode[4] & 0x01) == 1;
return true;
// Achievement unlock: How did we get there ?
return false;
}
extern "C" void (* const apiPointers[])(void);

View File

@@ -1,9 +1,9 @@
ExternalApp = "External"
ExternalAppCapital = "EXTERNAL"
ExternalAppApiMismatch = "API mismatch"
ExternalAppExecError = "Cannot execute file"
ExternalNotCompatible = "External ist nicht kompatibel"
ExternalAppApiMismatch = "API stimmt nicht überein"
ExternalAppExecError = "Datei kann nicht ausgeführt werden"
ExternalNotCompatible = "Externe App ist nicht kompatibel"
WithSimulator = "mit dem Simulator"
WithN0100 = "mit n0100"
GetMoreAppsAt = "Weitere Apps erhalten Sie auf"
NoAppsInstalled = "Keine Apps installiert"
WithN0100 = "mit N0100"
GetMoreAppsAt = "Weitere Apps abrufen bei"
NoAppsInstalled = "Keine Apps installiert"

View File

@@ -1,7 +1,7 @@
ExternalApp = "External"
ExternalAppCapital = "EXTERNAL"
ExternalAppApiMismatch = "API mismatch"
ExternalAppExecError = "Cannot execute file"
ExternalAppApiMismatch = "Décalage API"
ExternalAppExecError = "Le fichier ne peut pas être exécuté"
ExternalNotCompatible = "External n'est pas compatible"
WithSimulator = "avec le simulateur"
WithN0100 = "avec n0100"

View File

@@ -1,9 +1,9 @@
ExternalApp = "Külsö"
ExternalAppCapital = "KÜLSö"
ExternalAppCapital = "KÜLSÖ"
ExternalAppApiMismatch = "API eltérés"
ExternalAppExecError = "A fájl nem futtatható"
ExternalNotCompatible = "Ez az alkalmazás nem kompatibilis a "
ExternalNotCompatible = "Externál nem kompatibilis"
WithSimulator = "Szimulátorral"
WithN0100 = "a n0100-el"
GetMoreAppsAt = "Mégtöbb alkalmazás a"
NoAppsInstalled = "Nincs letöltött alkalmazás"
WithN0100 = "n0100-al"
GetMoreAppsAt = "Mégtöbb alkalmazás itt :"
NoAppsInstalled = "Nincs letöltött externál"

View File

@@ -30,11 +30,23 @@ public:
void setTempExamMode(ExamMode examMode);
bool showPopUp() const { return m_showPopUp; }
void setShowPopUp(bool showPopUp) { m_showPopUp = showPopUp; }
bool dfuStatus() const { return m_dfuUnlocked; }
void setDfuStatus(bool status) { m_dfuUnlocked=status; }
int dfuCurrentStep() const { return m_dfuStep; }
void dfuIncreaseStep() { m_dfuStep++; }
void dfuResetStep() { m_dfuStep = 0; }
int getDfuLevel() const { return m_dfuProtectLevel; }
void setDfuLevel(int level) { m_dfuProtectLevel = level; }
bool showDfuDeacAlert() const { return m_showDeacAlert; }
void setDfuDeacAlert(bool value) { m_showDeacAlert = value; }
bool autocomplete() const { return m_autoComplete; }
void setAutocomplete(bool autocomple) { m_autoComplete = autocomple; }
int brightnessLevel() const { return m_brightnessLevel; }
void setBrightnessLevel(int brightnessLevel);
const KDFont * font() const { return m_font; }
void setFont(const KDFont * font) { m_font = font; }
constexpr static int NumberOfBrightnessStates = 15;
constexpr static int DfuUnlockStep = 3;
private:
static_assert(I18n::NumberOfLanguages > 0, "I18n::NumberOfLanguages is not superior to 0"); // There should already have been an error when processing an empty EPSILON_I18N flag
static_assert(I18n::NumberOfCountries > 0, "I18n::NumberOfCountries is not superior to 0"); // There should already have been an error when processing an empty EPSILON_COUNTRIES flag
@@ -44,6 +56,11 @@ private:
m_examMode(ExamMode::Unknown),
m_tempExamMode(ExamMode::Standard),
m_showPopUp(true),
m_dfuUnlocked(false),
m_dfuStep(0),
m_dfuProtectLevel(0),
m_showDeacAlert(true),
m_autoComplete(true),
m_brightnessLevel(Ion::Backlight::MaxBrightness),
m_font(KDFont::LargeFont) {}
I18n::Language m_language;
@@ -53,6 +70,11 @@ private:
mutable ExamMode m_examMode;
mutable ExamMode m_tempExamMode;
bool m_showPopUp;
bool m_dfuUnlocked;
int m_dfuStep;
int m_dfuProtectLevel; // 0: default; 1: OmegaMode; 2: Paranoid; 3: Paranoid++
bool m_showDeacAlert;
bool m_autoComplete;
int m_brightnessLevel;
const KDFont * m_font;
};

View File

@@ -29,5 +29,5 @@ NoIntersectionFound = "Kein Schnittpunkt gefunden"
NoPreimageFound = "Kein Urbild gefunden"
DerivativeFunctionColumn = "Spalte der Ableitungsfunktion"
HideDerivativeColumn = "Ableitungsfunktion ausblenden"
AllowedCharactersAZaz09 = "Erlaubte Zeichen: A..Z, a..z, 0..9, _"
AllowedCharactersAZaz09 = "Erlaubt: A..Z, a..z, 0..9, _"
ReservedName = "Reserviertes Wort"

View File

@@ -13,21 +13,21 @@ IntervalX = "x intervallum"
FunctionDomain = "Tervtartomány"
FunctionColor = "Funkció színe"
NoFunction = "Nincs funkció"
NoActivatedFunction = "Nincs bekapcsolt funkció"
PlotOptions = "Tervezési lehetöségek"
Compute = "Számítás"
NoActivatedFunction = "Nincs használt funkció"
PlotOptions = "Görbe beállítások"
Compute = "Kiszámolás"
Zeros = "Nullák"
Tangent = "Tangens"
Intersection = "Keresztezés"
Intersection = "Metszéspont"
Preimage = "Inverz kép"
SelectLowerBound = "Alsó határ kiválasztása"
SelectUpperBound = "Felsö határ kiválasztása"
NoMaximumFound = "Nem található maximális érték"
NoMinimumFound = "Nem található minimum"
NoZeroFound = "Nem található nulla"
NoMaximumFound = "Nem talált maximum-ot"
NoMinimumFound = "Nem talált minimum-ot"
NoZeroFound = "Nem talált nullát"
NoIntersectionFound = "Nem található keresztezödés"
NoPreimageFound = "Nem található inverz kép"
DerivativeFunctionColumn = "Származékosggvény oszlop"
HideDerivativeColumn = "A derivatív függvény elrejtése"
AllowedCharactersAZaz09 = "Engedélyezett karakterek: A-Z, a-z, 0-9, _"
DerivativeFunctionColumn = "A derivált fügvény oszlopa"
HideDerivativeColumn = "A derivált függvény oszlop elrejtése"
AllowedCharactersAZaz09 = "Engedélyezett karakterek: A..Z, a..z, 0..9, _"
ReservedName = "Fenntartott név"

View File

@@ -3,6 +3,7 @@ app_home_src = $(addprefix apps/home/,\
app_cell.cpp \
apps_layout.py \
controller.cpp \
selectable_table_view_with_background.cpp \
)
apps_src += $(app_home_src)

View File

@@ -8,6 +8,7 @@ namespace Home {
AppCell::AppCell() :
HighlightCell(),
m_nameView(KDFont::SmallFont, (I18n::Message)0, 0.5f, 0.5f, Palette::HomeCellText, Palette::HomeCellBackground),
m_backgroundView(nullptr),
m_visible(true), m_external_app(false)
{
}
@@ -15,8 +16,8 @@ AppCell::AppCell() :
void AppCell::drawRect(KDContext * ctx, KDRect rect) const {
KDSize nameSize = m_nameView.minimalSizeForOptimalDisplay();
ctx->fillRect(KDRect(0, bounds().height()-nameSize.height() - 2*k_nameHeightMargin, bounds().width(), nameSize.height()+2*k_nameHeightMargin), Palette::HomeBackground);
}
m_backgroundView->drawRect(ctx, KDRect(0, bounds().height()-nameSize.height() - 2*k_nameHeightMargin, bounds().width(), nameSize.height()+2*k_nameHeightMargin));
}
int AppCell::numberOfSubviews() const {
return m_visible ? 2 : 0;
@@ -33,9 +34,20 @@ void AppCell::layoutSubviews(bool force) {
m_nameView.setFrame(KDRect((bounds().width()-nameSize.width())/2-k_nameWidthMargin, bounds().height()-nameSize.height() - 2*k_nameHeightMargin, nameSize.width()+2*k_nameWidthMargin, nameSize.height()+2*k_nameHeightMargin), force);
}
void AppCell::setExtAppDescriptor(const char* name, const uint8_t *icon, size_t iconLength) {
m_external_app = true;
m_iconView.setImage(icon, iconLength);
m_iconView.setImage(nullptr);
m_nameView.setText(name);
m_nameView.setTextColor(Palette::HomeCellTextExternal);
m_nameView.setMessage(I18n::Message::Default);
layoutSubviews();
}
void AppCell::setExtAppDescriptor(const char* name, const Image* icon) {
m_external_app = true;
m_iconView.setImage(icon);
m_iconView.setImage(nullptr, 0);
m_nameView.setText(name);
m_nameView.setTextColor(Palette::HomeCellTextExternal);
m_nameView.setMessage(I18n::Message::Default);
@@ -45,6 +57,7 @@ void AppCell::setExtAppDescriptor(const char* name, const Image* icon) {
void AppCell::setAppDescriptor(::App::Descriptor * descriptor) {
m_external_app = false;
m_iconView.setImage(descriptor->icon());
m_iconView.setImage(nullptr, 0);
m_nameView.setMessage(descriptor->name());
m_nameView.setTextColor(Palette::HomeCellText);
m_nameView.setText(nullptr);
@@ -58,6 +71,10 @@ void AppCell::setVisible(bool visible) {
}
}
void AppCell::setBackgroundView(const BackgroundView * backgroundView) {
m_backgroundView = backgroundView;
}
void AppCell::reloadCell() {
m_nameView.setTextColor(isHighlighted() ? (m_external_app ? Palette::HomeCellTextExternalActive : Palette::HomeCellTextActive) : (m_external_app ? Palette::HomeCellTextExternal : Palette::HomeCellText));
m_nameView.setBackgroundColor(isHighlighted() ? Palette::HomeCellBackgroundActive : Palette::HomeCellBackground);

View File

@@ -15,17 +15,20 @@ public:
void layoutSubviews(bool force = false) override;
void setVisible(bool visible);
void setBackgroundView(const BackgroundView * backgroundView);
void reloadCell() override;
void setAppDescriptor(::App::Descriptor * appDescriptor);
void setExtAppDescriptor(const char* name, const Image* icon);
void setExtAppDescriptor(const char* name, const uint8_t *icon, size_t iconLength);
private:
static constexpr KDCoordinate k_iconMargin = 22;
static constexpr KDCoordinate k_iconWidth = 55;
static constexpr KDCoordinate k_iconHeight = 56;
static constexpr KDCoordinate k_nameWidthMargin = 4;
static constexpr KDCoordinate k_nameHeightMargin = 1;
ImageView m_iconView;
IconView m_iconView;
MessageTextView m_nameView;
const BackgroundView * m_backgroundView;
bool m_visible;
bool m_external_app;
};

View File

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

View File

@@ -1,4 +1,6 @@
Apps = "Anwendungen"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Diese Anwendung ist im"
ForbidenAppInExamMode2 = "Prüfungsmodus nicht erlaubt."
DfuWarning1 = "DFU-Schutzwarnung"
DfuWarning2 = "Mehr Informationen: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Applications"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "This application is"
ForbidenAppInExamMode2 = "forbidden in exam mode"
DfuWarning1 = "DFU Protection Warning"
DfuWarning2 = "More informations: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Aplicaciones"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Esta aplicación está prohibida"
ForbidenAppInExamMode2 = "en el modo de examen"
DfuWarning1 = "Advertencia de protección DFU"
DfuWarning2 = "Más información: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Applications"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Cette application n'est"
ForbidenAppInExamMode2 = "pas autorisée en mode examen."
DfuWarning1 = "Alerte protection DFU"
DfuWarning2 = "Plus d'infos: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Alkalmazások"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Ez az alkalmazás"
ForbidenAppInExamMode2 = "tilos vizsga módban"
DfuWarning1 = "DFU védelmi figyelmeztetés"
DfuWarning2 = "További információk: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Applicazioni"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Questa applicazione è"
ForbidenAppInExamMode2 = "proibita nella modalità d'esame"
DfuWarning1 = "Avviso protezione DFU"
DfuWarning2 = "Più informazioni: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Applicaties"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Deze applicatie is"
ForbidenAppInExamMode2 = "uitgesloten in examenstand"
DfuWarning1 = "DFU-beveiligingswaarschuwing"
DfuWarning2 = "Meer informatie: bit.ly/upsiDfu"

View File

@@ -1,4 +1,6 @@
Apps = "Aplicações"
AppsCapital = "OMEGA"
AppsCapital = "UPSILON"
ForbidenAppInExamMode1 = "Esta aplicação é"
ForbidenAppInExamMode2 = "proibida no Modo de Exame"
DfuWarning1 = "Aviso de proteção DFU"
DfuWarning2 = "Mais informações: bit.ly/upsiDfu"

View File

@@ -18,11 +18,11 @@ extern "C" {
namespace Home {
Controller::ContentView::ContentView(Controller * controller, SelectableTableViewDataSource * selectionDataSource) :
m_selectableTableView(controller, controller, selectionDataSource, controller)
m_selectableTableView(controller, controller, &m_backgroundView, selectionDataSource, controller),
m_backgroundView()
{
m_selectableTableView.setVerticalCellOverlap(0);
m_selectableTableView.setMargins(0, k_sideMargin, k_bottomMargin, k_sideMargin);
m_selectableTableView.setBackgroundColor(Palette::HomeBackground);
static_cast<ScrollView::BarDecorator *>(m_selectableTableView.decorator())->verticalBar()->setMargin(k_indicatorMargin);
}
@@ -31,7 +31,7 @@ SelectableTableView * Controller::ContentView::selectableTableView() {
}
void Controller::ContentView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(bounds(), Palette::HomeBackground);
m_selectableTableView.drawRect(ctx, rect);
}
void Controller::ContentView::reloadBottomRow(SimpleTableViewDataSource * dataSource, int numberOfIcons, int numberOfColumns) {
@@ -45,6 +45,10 @@ void Controller::ContentView::reloadBottomRow(SimpleTableViewDataSource * dataSo
}
}
BackgroundView * Controller::ContentView::backgroundView() {
return &m_backgroundView;
}
int Controller::ContentView::numberOfSubviews() const {
return 1;
}
@@ -56,6 +60,8 @@ View * Controller::ContentView::subviewAtIndex(int index) {
void Controller::ContentView::layoutSubviews(bool force) {
m_selectableTableView.setFrame(bounds(), force);
m_backgroundView.setFrame(KDRect(0, Metric::TitleBarHeight, Ion::Display::Width, Ion::Display::Height-Metric::TitleBarHeight), force);
m_backgroundView.updateDataValidity();
}
Controller::Controller(Responder * parentResponder, SelectableTableViewDataSource * selectionDataSource, ::App * app) :
@@ -63,12 +69,51 @@ Controller::Controller(Responder * parentResponder, SelectableTableViewDataSourc
m_view(this, selectionDataSource)
{
m_app = app;
for (int i = 0; i < k_maxNumberOfCells; i++) {
m_cells[i].setBackgroundView(m_view.backgroundView());
}
m_view.backgroundView()->setDefaultColor(Palette::HomeBackground);
#ifdef HOME_DISPLAY_EXTERNALS
int index = External::Archive::indexFromName("wallpaper.obm");
if(index > -1) {
External::Archive::File image;
External::Archive::fileAtIndex(index, image);
m_view.backgroundView()->setBackgroundImage(image.data);
}
#endif
}
bool Controller::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::Six) {
GlobalPreferences::sharedGlobalPreferences()->dfuIncreaseStep();
if (GlobalPreferences::sharedGlobalPreferences()->dfuCurrentStep() >= GlobalPreferences::DfuUnlockStep && !GlobalPreferences::sharedGlobalPreferences()->dfuStatus()) {
if (!GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
Ion::LED::setColor(KDColorPurple);
Ion::LED::setBlinking(500, 0.5f);
}
GlobalPreferences::sharedGlobalPreferences()->setDfuStatus(true);
App::app()->displayWarning(I18n::Message::DfuWarning1, I18n::Message::DfuWarning2);
return true;
} else if (GlobalPreferences::sharedGlobalPreferences()->dfuStatus()) {
if (!GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
Ion::LED::setColor(KDColorBlack);
}
GlobalPreferences::sharedGlobalPreferences()->dfuResetStep();
GlobalPreferences::sharedGlobalPreferences()->setDfuStatus(false);
}
}
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
AppsContainer * container = AppsContainer::sharedAppsContainer();
if (!GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
Ion::LED::setColor(KDColorBlack);
}
GlobalPreferences::sharedGlobalPreferences()->dfuResetStep();
GlobalPreferences::sharedGlobalPreferences()->setDfuStatus(false);
int index = selectionDataSource()->selectedRow()*k_numberOfColumns+selectionDataSource()->selectedColumn()+1;
#ifdef HOME_DISPLAY_EXTERNALS
if (index >= container->numberOfApps()) {
@@ -189,9 +234,8 @@ void Controller::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) {
if (img_index != -1) {
External::Archive::File image_file;
if (External::Archive::fileAtIndex(img_index, image_file)) {
const Image* img = new Image(55, 56, image_file.data, image_file.dataLength);
appCell->setExtAppDescriptor(app_file.name, img);
// const Image* img = new Image(55, 56, image_file.data, image_file.dataLength);
appCell->setExtAppDescriptor(app_file.name, image_file.data, image_file.dataLength);
} else {
appCell->setExtAppDescriptor(app_file.name, ImageStore::ExternalIcon);
}
@@ -234,7 +278,7 @@ void Controller::tableViewDidChangeSelection(SelectableTableView * t, int previo
* (so the previous one is always visible). */
int appIndex = (t->selectedColumn()+t->selectedRow()*k_numberOfColumns)+1;
if (appIndex >= this->numberOfIcons()+1) {
t->selectCellAtLocation(previousSelectedCellX, previousSelectedCellY);
t->selectCellAtLocation((this->numberOfIcons()%3)-1, (this->numberOfIcons() / k_numberOfColumns));
}
}

View File

@@ -2,6 +2,7 @@
#define HOME_CONTROLLER_H
#include <escher.h>
#include "selectable_table_view_with_background.h"
#include "app_cell.h"
namespace Home {
@@ -35,11 +36,13 @@ private:
SelectableTableView * selectableTableView();
void drawRect(KDContext * ctx, KDRect rect) const override;
void reloadBottomRow(SimpleTableViewDataSource * dataSource, int numberOfIcons, int numberOfColumns);
BackgroundView * backgroundView();
private:
int numberOfSubviews() const override;
View * subviewAtIndex(int index) override;
void layoutSubviews(bool force = false) override;
SelectableTableView m_selectableTableView;
SelectableTableViewWithBackground m_selectableTableView;
BackgroundView m_backgroundView;
};
static constexpr KDCoordinate k_sideMargin = 4;
static constexpr KDCoordinate k_bottomMargin = 14;

View File

@@ -0,0 +1,16 @@
#include "selectable_table_view_with_background.h"
SelectableTableViewWithBackground::SelectableTableViewWithBackground(Responder * parentResponder, TableViewDataSource * dataSource, BackgroundView * backgroundView, SelectableTableViewDataSource * selectionDataSource, SelectableTableViewDelegate * delegate) :
SelectableTableView(parentResponder, dataSource, selectionDataSource, delegate),
m_backgroundInnerView(this, backgroundView)
{
}
void SelectableTableViewWithBackground::BackgroundInnerView::drawRect(KDContext * ctx, KDRect rect) const {
m_backgroundView->drawRect(ctx, rect);
}
void SelectableTableViewWithBackground::BackgroundInnerView::setBackgroundView(const uint8_t * data) {
m_backgroundView->setBackgroundImage(data);
}

View File

@@ -0,0 +1,25 @@
#ifndef ESCHER_SELECTABLE_TABLE_VIEW_WITH_BACKGROUND_H
#define ESCHER_SELECTABLE_TABLE_VIEW_WITH_BACKGROUND_H
#include <escher/selectable_table_view.h>
#include <escher/background_view.h>
class SelectableTableViewWithBackground : public SelectableTableView {
public:
SelectableTableViewWithBackground(Responder * parentResponder, TableViewDataSource * dataSource, BackgroundView * backgroundView,
SelectableTableViewDataSource * selectionDataSource = nullptr, SelectableTableViewDelegate * delegate = nullptr);
View * subviewAtIndex(int index) override { return (index == 0) ? &m_backgroundInnerView : decorator()->indicatorAtIndex(index); }
protected:
virtual InnerView * getInnerView() { return &m_backgroundInnerView; }
class BackgroundInnerView : public ScrollView::InnerView {
public:
BackgroundInnerView(ScrollView * scrollView, BackgroundView * backgroundView): InnerView(scrollView), m_backgroundView(backgroundView) {}
void drawRect(KDContext * ctx, KDRect rect) const override;
void setBackgroundView(const uint8_t * data);
private:
BackgroundView * m_backgroundView;
};
BackgroundInnerView m_backgroundInnerView;
};
#endif

View File

@@ -23,13 +23,9 @@ parser.add_argument('--codepoints', help='the code_points.h file')
parser.add_argument('--countrypreferences', help='the country_preferences.csv file')
parser.add_argument('--languagepreferences', help='the language_preferences.csv file')
parser.add_argument('--files', nargs='+', help='an i18n file')
parser.add_argument('--generateISO6391locales', type=int, nargs='+', help='whether to generate the ISO6391 codes for the languages (for instance "en" for english)')
args = parser.parse_args()
def generate_ISO6391():
return args.generateISO6391locales[0] == 1
def has_glyph(glyph):
return glyph in codepoints
@@ -196,13 +192,6 @@ def print_header(data, path, locales, countries):
lambda arg: arg.upper(),
" Message::Language")
if generate_ISO6391():
print_block_from_list(f,
"constexpr const Message LanguageISO6391Names[NumberOfLanguages] = {\n",
locales,
lambda arg: arg.upper(),
" Message::LanguageISO6391")
# Countries enumeration
print_block_from_list(f,
"enum class Country : uint8_t {\n",
@@ -236,6 +225,12 @@ def print_header(data, path, locales, countries):
f.write(line[:-2] + "),\n")
f.write("};\n\n")
# Language ISO639-1 codes
f.write("constexpr const char * LanguageISO6391Codes[NumberOfLanguages] = {\n");
for locale in locales:
f.write(" \"" + locale + "\",\n")
f.write("};\n\n")
f.write("}\n\n")
f.write("#endif\n")
f.close()

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