diff --git a/docs/manual-general b/docs/manual-general
--- a/docs/manual-general
+++ b/docs/manual-general
@@ -15,79 +15,79 @@
- we let the children select the difficulty level and do nothing to determine it is appropriate or not for her
- we do nothing to make the children addict
- the software does not replace a teacher or a parent
- - the software does not really teaches, it is a complement to a traditional teaching course
+ - the software does not really teach, it is a complement to a traditional teaching course
- activities must bring something more than doing the same activity on paper
***Distribution
The source code of GCompris is under GNU GPLv3, it is free software. It runs best on Free-Software operating systems like GNU/Linux, where it is of course available for free.
We also support proprietary operating systems, but there we sell the full version. For Windows you can buy an activation code on our website to unlock the full version. For Android, the software must be purchased from the play store.
-However for schools, you should contact us directly to get a lower price ( sales@gcompris.net ).
+However for schools, you should contact us directly to get a lower price (sales@gcompris.net).
Note that the latest version of GCompris for OSX and iOS are not available yet, we are looking at bringing them back soon.
**Quick start tour
--On first launch, we ask to download the pack of voices depending on selected language if it is not already done, as well as the additional image set.
+On first launch, we ask to download the pack of voices depending on selected language if it is not already done, as well as the additional image set.
On the main menu page, the activities are listed by categories, with the different animals and their attributes at the top.
- -The cat is for computer activities, where children can learn to use a keyboard and a mouse or touchpad.
- -The penguin (tux, the mascot of Linux) is for discovery activities, to initiate and discover lot of different topics.
- -The pig is for experience activities, mostly related to science topics.
- -The dragon (Konqi, the mascot of KDE), is for fun activities, which are more relaxing and.. fun.
- -The sheep is for math activities, to learn numbers and operations.
- -The panda is for puzzle activities, with all kinds of puzzle games to learn logic.
- -The cow is for reading activities, to learn letters and words.
- -The frog is for strategy activities, with some classical strategy games including checkers and chess.
+ - The cat is for computer activities, where children can learn to use a keyboard and a mouse or touchpad.
+ - The penguin (Tux, the mascot of Linux) is for discovery activities, to initiate and discover lot of different topics.
+ - The pig is for experience activities, mostly related to science topics.
+ - The dragon (Konqi, the mascot of KDE), is for fun activities, which are more relaxing and... fun.
+ - The sheep is for math activities, to learn numbers and operations.
+ - The panda is for puzzle activities, with all kinds of puzzle games to learn logic.
+ - The cow is for reading activities, to learn letters and words.
+ - The frog is for strategy activities, with some classical strategy games including checkers and chess.
On the left, the Sun is meant to access your favorite set of activities. To add an activity to favorites, click the little sun icon on it to activate it.
On the right, there is a search category where you can find activities by keywords.
- The activities also have some difficulty indications, with the little stars on the top-left corner of their icons. it goes from 1 yellow star for the easiest to 3 red stars for the hardest.
+ The activities also have some difficulty indications, with the little stars on the top-left corner of their icons. It goes from 1 yellow star for the easiest to 3 red stars for the hardest.
On the bottom, there is the menu-bar, which different controls depending on the activity running.
In the main menu page, this bar contains:
--A quit button
--The G button to access infos about GCompris
--The question mark to access the help page
--The Settings button to access the global settings page.
+- A quit button
+- The G button to access infos about GCompris
+- The question mark to access the help page
+- The Settings button to access the global settings page.
**Main options
In the global settings page, you find several options to configure the software to your needs.
--first, a line checking if you have the full version. If not, this is where you can enter the activation code.
+- first, a line checking if you have the full version. If not, this is where you can enter the activation code.
--enable audio voices: to turn off/on the voices
--enable audio effects: to turn off/on the sound effects
--Fullscreen: start in fullscreen or window mode
--virtual keyboard: to add a virtual keyboard on the screen
+- Enable audio voices: to turn off/on the voices
+- Enable audio effects: to turn off/on the sound effects
+- Fullscreen: start in fullscreen or window mode
+- virtual keyboard: to add a virtual keyboard on the screen
--Enable automatic downloads: if you disable it, GCompris will never automatically download any additional content.
--Download full word image set: if you have not already the additional image set, you can disable this option to never ask for it.
+- Enable automatic downloads: if you disable it, GCompris will never automatically download any additional content.
+- Download full word image set: if you have not already the additional image set, you can disable this option to never ask for it.
--The activity section menu is visible: with this option you can restrict the user to the current section selected. So if you add some favorites, when starting with this option it will only show those.
+- The activity section menu is visible: with this option you can restrict the user to the current section selected. So if you add some favorites, when starting with this option it will only show those.
--The next setting is for the font, where you can select a different font type and adapt the size.
+- The next setting is for the font, where you can select a different font type and adapt the size.
We ship two fonts, Andika-R.otf which supports lots of languages, and OpenDyslexic-Regular.ttf for those who need it. Else you can select any third-party font installed in your system instead.
The Default Button restores the default font size.
--Then a setting about font capitalization: you can select only lower case or only upper case instead of Mixed case.
+- Then a setting about font capitalization: you can select only lower case or only upper case instead of Mixed case.
--You can adapt the letter spacing
+- You can adapt the letter spacing
--Very important setting: set the application language with the language selector
+- Very important setting: set the application language with the language selector
The line under shows if you already have the corresponding voices, the button next to it allows to download them.
--Another very important setting: Difficulty filter
+- Another very important setting: Difficulty filter
with this, you can select which activities should be available depending on their difficulty level.
It is a fast and simple way to adapt the content to the user level.
diff --git a/org.kde.gcompris.appdata.xml b/org.kde.gcompris.appdata.xml
--- a/org.kde.gcompris.appdata.xml
+++ b/org.kde.gcompris.appdata.xml
@@ -12,6 +12,7 @@
GCompris Educational GameJuego educativo GComprisHariv mäng GCompris
+ GCompris hezkuntza-jokoaGCompris, opettavainen peliJeu éducatif GComprisXogo educativo GCompris
@@ -44,6 +45,7 @@
Multi-Activity Educational game for children 2 to 10Juego educativo multiactividad para niños de 2 a 10 añosRohkete tegevustega hariv mäng lastele vanuses 2-10
+ Jarduera anitzeko Hezkuntza-jokoa 2 eta 10 urte arteko haurrentzatUseampitoimintoinen opettavainen peli 2–10-vuotiaille lapsilleJeu éducatif multi-activités pour les enfants de 2 à 10 ansXogo educativo con varias actividades para nenos de entre 2 e 10 anos
@@ -77,6 +79,7 @@
Το GCompris είναι μια σουίτα εκπαιδευτικού λογισμικού με πολυάριθμες δραστηριότητες για παιδιά ηλικίας 2 έως 10 ετών.
GCompris is a high quality educational software suite, including a large number of activities for children aged 2 to 10.
GCompris es un conjunto de programas educativos de alta calidad que contiene un gran número de actividades para niños entre 2 y 10 años.
+
GCompris kalitate handiko hezkuntza-softwarea multzo bat da, 2 eta 10 urte bitarteko haurrentzako jarduera ugari dituena.
GCompris on laadukas monitoimintoinen opetusohjelmisto 2–10-vuotiaille lapsille.
GCompris est un logiciel éducatif qui propose des activités variées aux enfants de 2 à 10 ans. Il est plébiscité par les écoles maternelles et primaires de part sa qualité et son spectre couvrant les cycles 1, 2 et 3.
GCompris é unha colección de programas educativos que inclúe numerosas actividades para nenas e nenos de entre 2 e 10 anos.
@@ -108,6 +111,7 @@
Some of the activities are game orientated, but nonetheless still educational.
Algunas de las actividades son juegos, aunque siguen siendo educativas.
Mõned tegevused on mängulisemad, aga siiski õppeotstarbega.
+
Jardueretako batzuk jolasera zuzenduak daude, hala eta guztiz ere, heztea dute helburu.
Jotkin toiminnoista ovat pelimäisiä mutta silti opettavaisia.
Certaines activités sont ludiques mais ont toujours un intérêt pédagogique.
Algunhas das actividades están orientadas ao xogo, pero son aínda así educativas.
@@ -141,11 +145,12 @@
Below you can find a list of categories with some of the activities available in that category.
A continuación puede encontrar una lista de categorías con algunas de las actividades disponibles en cada una de ellas.
Allpool leiab kategooriate loetelu koos mõningate neile omaste tegevustega.
+
Behean kategoria zerrenda bat aurki dezakezu, kategoria horretan erabilgarri dauden jardueretako batzuekin.
Alta löydät luettelot luokista sekä maininnan joistakin kuhunkin luokkaan kuuluvista toiminnoista.
Vous pouvez trouver ci-dessous une liste des catégories avec certaines de leurs activités.
A continuación atopará unha lista de categorías e as actividades dispoñíbeis en cada unha desas categorías.
नीचे आप उस श्रेणी में उपलब्ध कुछ गतिविधियों के साथ श्रेणियों की एक सूची पा सकते हैं।
-
Di bawah ini kamu dapat menemukan daftar kategori dengan beberapa kegiatan yang tersedia di dalam setiap kategori tersebut.
+
Di bawah ini kamu bisa menemukan daftar kategori dengan beberapa kegiatan yang tersedia di dalam setiap kategori tersebut.
Di seguito puoi trovare un elenco di categorie con alcune delle attività disponibili per categoria.
아래에서 분류 목록과 해당 분류의 활동을 찾을 수 있습니다.
താഴെ, വിഭാഗങ്ങളുടെ ഒരു പട്ടിക നിങ്ങൾക്ക് കാണാം, ആ വിഭാഗങ്ങളിൽ ചില പ്രവർത്തനങ്ങളും ലഭ്യമാണ്.
@@ -174,11 +179,12 @@
computer discovery: keyboard, mouse, different mouse gestures, ...
descubrimiento del ordenador: teclado, ratón, distintos gestos con el ratón...
arvuti tundmaõppimine: klaviatuur, hiir, erinevad hiireliigutused ...
+
ordenagailua ezagutzea: teklatua, sagua, saguaren mugimendu ezberdinak, ...
tietokoneen oppiminen: näppäimistö, hiiri, eri hiirieleet…
découverte de l'ordinateur : clavier, souris, mouvements de la souris…
Descubrimento do computador: teclado, rato, xestos do rato, etc.
कंप्यूटर की खोज: कीबोर्ड, माउस, अलग माउस इशारों, ...
-
Pengenalan komputer: keyboard, mouse, gerakan mouse yang berbeda, ...
+
Pengenalan komputer: keyboard, mouse, gestur mouse yang berbeda, ...
scoperta del computer: tastiera, mouse, vari gesti con il mouse, ...
컴퓨터와 친해지기: 키보드, 마우스, 마우스 제스처, ...
കമ്പ്യൂട്ടർ പഠിക്കാം: കീബോർഡ്, മൗസ്, മൗസ് കൊണ്ടുള്ള വ്യത്യസ്ത ചലനങ്ങൾ, ...
autre : apprendre à dire l'heure, le système braille, le labyrinthe, les instruments de musique…
Outros: aprender a dicir as horas, o sistema braille, labirinto, instrumentos musicais, etc.
@@ -372,11 +383,12 @@
Currently GCompris offers in excess of 100 activities and more are being developed. GCompris is free software, that means that you can adapt it to your own needs, improve it and, most importantly, share it with children everywhere.
En la actualidad, GCompris ofrece más de 100 actividades y hay muchas más en desarrollo. GCompris es software libre, lo que significa que puede adaptarlo a sus necesidades, mejorarlo y, lo que es más importante, compartirlo con los niños de todo el mundo.
Praegu pakub GCompris üle 100 tegevuse ja neid tuleb aina juurde. GCompris on vaba tarkvara, mis tähendab, et seda saab kohandada oma vajadustele, täiustada, ja mis peamine, jagada oma täiustusi lastega kogu maailmas.
+
Gaur egun GCompris-ek 100 jardueratik gora eskaintzen ditu eta gehiago garatzen ari dira. GCompris software askea da, horrek esan nahi du zure beharretara egokitu dezakezula, hobetu dezakezula eta, garrantzitsuagoa dena, haurrekin partekatu dezakezu dauden lekuan daudela.
GComprisissa on nykyisellään yli sata toimintoa, ja lisää kehitetään. GCompris on vapaata ohjelmistoa, mikä tarkoittaa, että voit muokata sitä tarpeisiisi, parannella sitä ja mikä tärkeintä jakaa sitä lapsille kaikkialla.
Actuellement, GCompris contient plus de 100 activités et d'autres sont en cours de développement. GCompris est un logiciel libre, ce qui veut dire que vous pouvez l'adapter à vos propres besoins, le modifier et, le plus important, le partager avec des enfants où que ce soit.
Actualmente GCompris ofrece máis de 100 actividades e hai máis en desenvolvemento. GCompris é software libre, o que significa que pode adaptalo para axustalo ás súas necesidades, melloralo e, o máis importante, compartilo con nenos de todo o mundo.
वर्तमान में जी कॉम्पप्रस 100 गतिविधियों से अधिक प्रदान करता है और अधिक विकसित किए जा रहे हैं। जी कॉम्पप्रस मुफ्त सॉफ्टवेयर है, इसका मतलब है कि आप इसे अपनी आवश्यकताओं के अनुसार अनुकूलित कर सकते हैं, इसमें सुधार कर सकते हैं, और सबसे महत्वपूर्ण बात, इसे हर जगह बच्चों के साथ साझा कर सकते हैं।
-
Saat ini GCompris menawarkan lebih dari 100 aktivitas dan masih banyak lagi yang sedang dikembangkan. GCompris adalah software bebas, itu berarti kamu dapat menyesuaikannya dengan kebutuhanmu sendiri, memperbaikinya dan yang terpenting, bagikan dengan anak-anak di mana-mana.
+
Saat ini GCompris menawarkan lebih dari 100 aktivitas dan masih banyak lagi yang sedang dikembangkan. GCompris adalah software bebas, itu berarti kamu bisa menyesuaikannya dengan kebutuhanmu sendiri, memperbaikinya dan yang terpenting, bagikan dengan anak-anak di mana-mana.
Attualmente GCompris offre più di 100 attività e altre sono in fase di sviluppo. GCompris è software libero, che significa che puoi adattarlo alle tue necessità, migliorarlo e, cosa più importante, condividerlo con tutti i bambini.
GCompris는 100개 이상의 활동을 포함하고 있으며 더 많은 활동을 개발하고 있습니다. GCompris는 자유 소프트웨어이며, 필요에 따라서 활동을 개선할 수 있으며 전 세계의 사람들과 공유할 수 있습니다.
ഇപ്പോൾ ജികോംപ്രിയിൽ 100 ലധികം പ്രവർത്തനങ്ങൾ ഉണ്ട്, അതിൽ കൂടുതൽ ഡെവലപ്പ് ചെയ്തുകൊണ്ടിരിക്കുന്നുമുണ്ട്. ജികോംപ്രി ഒരു സ്വതന്ത്ര സോഫ്റ്റുവെയർ ആണ്, അതായത് നിങ്ങൾക്ക് അതിനെ നിങ്ങളുടെ ആവശ്യങ്ങൾക്കനുസരിച്ച് രൂപപ്പെടുത്താം, അതിനെ മെച്ചപ്പെടുത്താം, ഏറ്റവും പ്രധാനമായി, എല്ലായിടങ്ങളിലുള്ള കുട്ടികളുമായി അത് പങ്കുവെയ്ക്കാം.
@@ -407,6 +419,7 @@
Κύριο μενού του GCompris
GCompris main menu
Menú principal de GCompris
+
GCompris menu nagusia
GComprisin päävalikko
Menu principal de GCompris
Menú principal de GCompris
@@ -432,6 +445,7 @@
Δραστηριότητα "Κλικ σε κεφαλαίο γράμμα"
"Click on an uppercase letter" activity
Actividad «Pulsa en una letra mayúscula»
+
"Egin klik letra larri batean" jarduera
”Napsauta suuraakkosta” -toiminto
L'activité « Trouver la lettre majuscule »
Actividade de «Premer unha letra maiúscula»
@@ -457,6 +471,7 @@
Δραστηριότητα "Ρολόι"
"Learning Clock" activity
Actividad «Juego del reloj»
+
"Erlojua ezagutzea" jarduera
”Kellon oppiminen” -toiminto
L'activité « Trouver l'heure »
Actividade de «Aprender o reloxo»
@@ -482,6 +497,7 @@
Δραστηριότητα "Μείξη χρωμάτων"
"Mixing colour of paint" activity
Actividad «Mezcla de colores»
+
"Margo koloreak nahastea" jarduera
”Värien sekoitus” -toiminto
L'activité « Mélange de la couleur de peinture »
Actividade de «Mesturar a cor da pintura»
@@ -507,6 +523,7 @@
Δραστηριότητα "Χρώματα"
"Colours" activity
Actividad «Colores»
+
"Koloreak" jarduera
”Värit”-toiminto
L'activité « Trouver la couleur »
Actividade de «Cores»
@@ -532,6 +549,7 @@
Δραστηριότητα "Φτιάξε το ίδιο"
"Build the same model" activity
Actividad «Grúa»
+
"Eraiki eredu bera" jarduera
”Rakenna sama malli” -toiminto
L'activité « Reconstruire le modèle »
Actividade de «Constrúe o mesmo modelo»
@@ -557,6 +575,7 @@
Δραστηριότητα "Μέτρα τα αντικείμενα"
"Count the items" activity
Actividad «Enumeración»
+
"Zenbatu elementuak" jarduera
”Laske kohteet” -toiminto
L'activité « Compter les éléments »
Actividade de «Contar os elementos»
@@ -582,6 +601,7 @@
Δραστηριότητα "Δεκαπέντε"
"The fifteen game" activity
Actividad «Quince»
+
"Hamabosteko jokoa" jarduera
L'activité « Le jeu du taquin »
Actividade de «O xogo dos quince»
Attività «Il gioco del quindici»
@@ -606,6 +626,7 @@
Δραστηριότητα "Εξάγωνο"
"Hexagon" activity
Actividad «Hexágono»
+
"Hexagonoa" jarduera
L'activité « Localiser la fraise »
Actividade de «Hexágono»
Attività «Esagono»
@@ -630,6 +651,7 @@
Δραστηριότητα "Ισορρόπησε τη ζυγαριά"
"Balance the scales properly" activity
Actividad «Balanzas»
+
"Orekatu balantzak behar bezala" jarduera
”Tasapainota vaaka oikein” -toiminto
L'activité « Trouver le poids »
Actividade de «Equilibra a balanza de forma axeitada»
@@ -655,6 +677,7 @@
Δραστηριότητα "Το σκάκι στο τέλος"
"End of chess game" activity
Actividad «Final de partida de ajedrez»
+
"Xake jokoaren amaierako zatia" jarduera
”Šakin loppupeli” -toiminto
L'activité « Le jeu des échecs »
Actividade de «Final dunha partida de xadrez»
@@ -680,6 +703,7 @@
Δραστηριότητα "Βγάζω το αυτοκίνητο"
"A sliding-block puzzle game" activity
Actividad «Tráfico»
+
"Bloke irristagarrien puzzle joko bat" jarduera
L'activité « Sortir la voiture du parking »
Actividade de «Un crebacabezas de bloques que se moven»
Attività «Un rompicapo con blocchi scorrevoli»
diff --git a/org.kde.gcompris.desktop b/org.kde.gcompris.desktop
--- a/org.kde.gcompris.desktop
+++ b/org.kde.gcompris.desktop
@@ -9,6 +9,7 @@
Name[en_GB]=GCompris Educational Game
Name[es]=Juego educativo GCompris
Name[et]=Hariv mäng GCompris
+Name[eu]=GCompris hezkuntza-jokoa
Name[fi]=GCompris, opettavainen peli
Name[fr]=Jeu éducatif GCompris
Name[gl]=Xogo educativo GCompris
@@ -43,6 +44,7 @@
GenericName[en_GB]=Educational game
GenericName[es]=Juego educativo
GenericName[et]=Hariv mäng
+GenericName[eu]=Hezkuntza-jokoa
GenericName[fi]=Opettavainen peli
GenericName[fr]=Jeu éducatif
GenericName[gl]=Xogo educativo
@@ -75,6 +77,7 @@
Comment[en_GB]=Multi-Activity Educational game for children 2 to 10
Comment[es]=Juego educativo multiactividad para niños de 2 a 10 años
Comment[et]=Rohkete tegevustega hariv mäng lastele vanuses 2-10
+Comment[eu]=Jarduera anitzeko Hezkuntza-jokoa 2 eta 10 urte arteko haurrentzat
Comment[fi]=Useampitoimintoinen opettavainen peli 2–10-vuotiaille lapsille
Comment[fr]=Jeu éducatif multi-activités pour les enfants de 2 à 10 ans
Comment[gl]=Xogo educativo con varias actividades para nenos de entre 2 e 10 anos
diff --git a/platforms/sailfishOS/harbour-gcompris-qt.desktop b/platforms/sailfishOS/harbour-gcompris-qt.desktop
--- a/platforms/sailfishOS/harbour-gcompris-qt.desktop
+++ b/platforms/sailfishOS/harbour-gcompris-qt.desktop
@@ -9,6 +9,7 @@
Name[en_GB]=GCompris Educational Game
Name[es]=Juego educativo GCompris
Name[et]=Hariv mäng GCompris
+Name[eu]=GCompris hezkuntza-jokoa
Name[fi]=GCompris, opettavainen peli
Name[fr]=Jeu éducatif GCompris
Name[gl]=Xogo educativo GCompris
@@ -43,6 +44,7 @@
GenericName[en_GB]=Educational game
GenericName[es]=Juego educativo
GenericName[et]=Hariv mäng
+GenericName[eu]=Hezkuntza-jokoa
GenericName[fi]=Opettavainen peli
GenericName[fr]=Jeu éducatif
GenericName[gl]=Xogo educativo
@@ -75,6 +77,7 @@
Comment[en_GB]=Multi-Activity Educational game for children 2 to 10
Comment[es]=Juego educativo multiactividad para niños de 2 a 10 años
Comment[et]=Rohkete tegevustega hariv mäng lastele vanuses 2-10
+Comment[eu]=Jarduera anitzeko Hezkuntza-jokoa 2 eta 10 urte arteko haurrentzat
Comment[fi]=Useampitoimintoinen opettavainen peli 2–10-vuotiaille lapsille
Comment[fr]=Jeu éducatif multi-activités pour les enfants de 2 à 10 ans
Comment[gl]=Xogo educativo con varias actividades para nenos de entre 2 e 10 anos
diff --git a/src/activities/activities.txt b/src/activities/activities.txt
--- a/src/activities/activities.txt
+++ b/src/activities/activities.txt
@@ -11,6 +11,7 @@
alphabet-sequence
babymatch
babyshapes
+baby_tangram
baby_wordprocessor
balancebox
ballcatch
@@ -126,6 +127,7 @@
planegame
play_piano
play_rhythm
+programmingMaze
railroad
readingh
readingv
diff --git a/src/activities/advanced_colors/ActivityInfo.qml b/src/activities/advanced_colors/ActivityInfo.qml
--- a/src/activities/advanced_colors/ActivityInfo.qml
+++ b/src/activities/advanced_colors/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You will see dancing butterflies of different colors and a question. You have to find the correct butterfly and touch it.")
credit: ""
- section: "discovery colors"
+ section: "reading colors vocabulary"
createdInVersion: 0
}
diff --git a/src/activities/algebra_by/ActivityInfo.qml b/src/activities/algebra_by/ActivityInfo.qml
--- a/src/activities/algebra_by/ActivityInfo.qml
+++ b/src/activities/algebra_by/ActivityInfo.qml
@@ -35,6 +35,7 @@
//: Help manual
manual: qsTr("A multiplication is displayed on the screen. Quickly find the result and use your computer's keyboard or the on-screen keypad to type the product of the numbers. You have to be fast and submit the answer before the penguins in their balloon land!")
credit: ""
- section: "math multiplication"
+ section: "math multiplication arithmetic"
createdInVersion: 0
+ levels: "1,2,3,4"
}
diff --git a/src/activities/algebra_by/AlgebraBy.qml b/src/activities/algebra_by/AlgebraBy.qml
--- a/src/activities/algebra_by/AlgebraBy.qml
+++ b/src/activities/algebra_by/AlgebraBy.qml
@@ -23,9 +23,10 @@
import "../../core"
import "../algebra_by"
+import "algebra.js" as Activity
Algebra {
onStart: {
- operand.text = "x"
+ operand.text = Activity.OperandsEnum.TIMES_SIGN
}
}
diff --git a/src/activities/algebra_by/algebra.js b/src/activities/algebra_by/algebra.js
--- a/src/activities/algebra_by/algebra.js
+++ b/src/activities/algebra_by/algebra.js
@@ -27,6 +27,12 @@
var secondOperandVal
var firstOperandVal
var operations = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
+var OperandsEnum = {
+ TIMES_SIGN : "\u00D7",
+ PLUS_SIGN : "\u002B",
+ MINUS_SIGN : "\u2212",
+ DIVIDE_SIGN : "\u2215"
+}
var nbLevel = operations.length
@@ -40,7 +46,7 @@
// currentLevel * N (N behind random)
// where the last levels will do:
// N * currentLevel
- if(operand.text === "x" || operand.text === "+")
+ if(operand.text === OperandsEnum.TIMES_SIGN || operand.text === OperandsEnum.PLUS_SIGN)
nbLevel = 2 * operations.length
else
nbLevel = operations.length
@@ -82,19 +88,19 @@
{
switch(operand.text)
{
- case "x":
+ case OperandsEnum.TIMES_SIGN:
firstOperandVal = coreItems.bar.level
secondOperandVal = operations[coreItems.score.currentSubLevel - 1]
break;
- case "+":
+ case OperandsEnum.PLUS_SIGN:
firstOperandVal = coreItems.bar.level
secondOperandVal = operations[coreItems.score.currentSubLevel - 1]
break;
- case "-":
+ case OperandsEnum.MINUS_SIGN:
firstOperandVal = coreItems.bar.level + 9
secondOperandVal = operations[coreItems.score.currentSubLevel - 1]
break;
- case "/":
+ case OperandsEnum.DIVIDE_SIGN:
firstOperandVal = coreItems.bar.level * operations[coreItems.score.currentSubLevel - 1]
secondOperandVal = coreItems.bar.level
break;
@@ -115,16 +121,16 @@
function getAnswer() {
switch(operand.text)
{
- case "x":
+ case OperandsEnum.TIMES_SIGN:
return (firstOperandVal * secondOperandVal)
- case "+":
+ case OperandsEnum.PLUS_SIGN:
return (firstOperandVal + secondOperandVal)
- case "-":
+ case OperandsEnum.MINUS_SIGN:
return (firstOperandVal - secondOperandVal)
- case "/":
+ case OperandsEnum.DIVIDE_SIGN:
return (firstOperandVal / secondOperandVal)
}
}
diff --git a/src/activities/algebra_by/resource/1/Data.qml b/src/activities/algebra_by/resource/1/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/algebra_by/resource/1/Data.qml
@@ -0,0 +1,49 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("This is a long long long long objective. We want to see it it can display long long texts. But it is not long long long enough. Or maybe it is...")
+ data: [
+ {
+ "maxNumber": 1, /* Max number on each domino side */
+ "minNumber": 1,
+ "numberOfFish": 3
+ },
+ {
+ "maxNumber": 2,
+ "minNumber": 1,
+ "numberOfFish": 4
+ },
+ {
+ "maxNumber": 3,
+ "minNumber": 1,
+ "numberOfFish": 5
+ },
+ {
+ "maxNumber": 4,
+ "minNumber": 1,
+ "numberOfFish": 5
+ }
+ ]
+}
diff --git a/src/activities/algebra_by/resource/2/Data.qml b/src/activities/algebra_by/resource/2/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/algebra_by/resource/2/Data.qml
@@ -0,0 +1,49 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("obj 2")
+ data: [
+ {
+ "maxNumber": 1, /* Max number on each domino side */
+ "minNumber": 1,
+ "numberOfFish": 3
+ },
+ {
+ "maxNumber": 2,
+ "minNumber": 1,
+ "numberOfFish": 4
+ },
+ {
+ "maxNumber": 3,
+ "minNumber": 1,
+ "numberOfFish": 5
+ },
+ {
+ "maxNumber": 4,
+ "minNumber": 1,
+ "numberOfFish": 5
+ }
+ ]
+}
diff --git a/src/activities/algebra_by/resource/3/Data.qml b/src/activities/algebra_by/resource/3/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/algebra_by/resource/3/Data.qml
@@ -0,0 +1,49 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("obj 3")
+ data: [
+ {
+ "maxNumber": 1, /* Max number on each domino side */
+ "minNumber": 1,
+ "numberOfFish": 3
+ },
+ {
+ "maxNumber": 2,
+ "minNumber": 1,
+ "numberOfFish": 4
+ },
+ {
+ "maxNumber": 3,
+ "minNumber": 1,
+ "numberOfFish": 5
+ },
+ {
+ "maxNumber": 4,
+ "minNumber": 1,
+ "numberOfFish": 5
+ }
+ ]
+}
diff --git a/src/activities/algebra_by/resource/4/Data.qml b/src/activities/algebra_by/resource/4/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/algebra_by/resource/4/Data.qml
@@ -0,0 +1,49 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("obj 4")
+ data: [
+ {
+ "maxNumber": 1, /* Max number on each domino side */
+ "minNumber": 1,
+ "numberOfFish": 3
+ },
+ {
+ "maxNumber": 2,
+ "minNumber": 1,
+ "numberOfFish": 4
+ },
+ {
+ "maxNumber": 3,
+ "minNumber": 1,
+ "numberOfFish": 5
+ },
+ {
+ "maxNumber": 4,
+ "minNumber": 1,
+ "numberOfFish": 5
+ }
+ ]
+}
diff --git a/src/activities/algebra_div/ActivityInfo.qml b/src/activities/algebra_div/ActivityInfo.qml
--- a/src/activities/algebra_div/ActivityInfo.qml
+++ b/src/activities/algebra_div/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A division is displayed on the screen. Quickly find the result and use your computer's keyboard or the on-screen keypad to type it. You have to be fast and submit the answer before the penguins in their balloon land!")
credit: ""
- section: "math division"
+ section: "math division arithmetic"
createdInVersion: 4000
}
diff --git a/src/activities/algebra_div/AlgebraDiv.qml b/src/activities/algebra_div/AlgebraDiv.qml
--- a/src/activities/algebra_div/AlgebraDiv.qml
+++ b/src/activities/algebra_div/AlgebraDiv.qml
@@ -22,9 +22,10 @@
import "../../core"
import "../algebra_by/"
+import "../algebra_by/algebra.js" as Activity
Algebra {
onStart: {
- operand.text = "/"
+ operand.text = Activity.OperandsEnum.DIVIDE_SIGN
}
}
diff --git a/src/activities/algebra_minus/ActivityInfo.qml b/src/activities/algebra_minus/ActivityInfo.qml
--- a/src/activities/algebra_minus/ActivityInfo.qml
+++ b/src/activities/algebra_minus/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A subtraction is displayed on the screen. Quickly find the result and use your computer's keyboard or the on-screen keypad to type it. You have to be fast and submit the answer before the penguins in their balloon land!")
credit: ""
- section: "math subtraction"
+ section: "math subtraction arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/algebra_minus/AlgebraMinus.qml b/src/activities/algebra_minus/AlgebraMinus.qml
--- a/src/activities/algebra_minus/AlgebraMinus.qml
+++ b/src/activities/algebra_minus/AlgebraMinus.qml
@@ -23,10 +23,10 @@
import "../../core"
import "../algebra_by/"
-
+import "../algebra_by/algebra.js" as Activity
Algebra {
onStart: {
- operand.text = "-"
+ operand.text = Activity.OperandsEnum.MINUS_SIGN
}
}
diff --git a/src/activities/algebra_plus/ActivityInfo.qml b/src/activities/algebra_plus/ActivityInfo.qml
--- a/src/activities/algebra_plus/ActivityInfo.qml
+++ b/src/activities/algebra_plus/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("An addition is displayed on the screen. Quickly find the result and use your computer's keyboard or the on-screen keypad to type it. You have to be fast and submit the answer before the penguins land in their balloon!")
credit: ""
- section: "math addition"
+ section: "math addition arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/algebra_plus/AlgebraPlus.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/algebra_plus/AlgebraPlus.qml
@@ -22,9 +22,10 @@
import "../../core"
import "../algebra_by/"
+import "../algebra_by/algebra.js" as Activity
Algebra {
onStart: {
- operand.text = "+"
+ operand.text = Activity.OperandsEnum.PLUS_SIGN
}
}
diff --git a/src/activities/algorithm/ActivityInfo.qml b/src/activities/algorithm/ActivityInfo.qml
--- a/src/activities/algorithm/ActivityInfo.qml
+++ b/src/activities/algorithm/ActivityInfo.qml
@@ -33,6 +33,6 @@
//: Help manual
manual: qsTr("Look at the two sequences. Each fruit in the first sequence has been replaced by another fruit in the second sequence. Complete the second sequence by using the correct fruits, after studying this pattern.")
credit: ""
- section: "discovery"
+ section: "discovery logic"
createdInVersion: 0
}
diff --git a/src/activities/alphabet-sequence/ActivityInfo.qml b/src/activities/alphabet-sequence/ActivityInfo.qml
--- a/src/activities/alphabet-sequence/ActivityInfo.qml
+++ b/src/activities/alphabet-sequence/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Catch the alphabet letters. With a keyboard use the arrow keys to move the helicopter. With a pointing device you just click or tap on the target location. To know which letter you have to catch you can either remember it or check the bottom right corner.")
credit: ""
- section: "reading"
- createdInVersion: 0
+ section: "reading letters"
+ createdInVersion: 0
}
diff --git a/src/activities/hanoi/ActivityInfo.qml b/src/activities/baby_tangram/ActivityInfo.qml
copy from src/activities/hanoi/ActivityInfo.qml
copy to src/activities/baby_tangram/ActivityInfo.qml
--- a/src/activities/hanoi/ActivityInfo.qml
+++ b/src/activities/baby_tangram/ActivityInfo.qml
@@ -1,6 +1,6 @@
/* GCompris - ActivityInfo.qml
*
- * Copyright (C) 2015 Johnny Jazeix
+ * Copyright (C) 2019 Johnny Jazeix
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,23 +18,23 @@
import GCompris 1.0
ActivityInfo {
- name: "hanoi/Hanoi.qml"
- difficulty: 2
- icon: "hanoi/hanoi.svg"
+ name: "baby_tangram/BabyTangram.qml"
+ difficulty: 1
+ icon: "baby_tangram/baby_tangram.svg"
author: "Johnny Jazeix <jazeix@gmail.com>"
demo: true
//: Activity title
- title: qsTr("Simplified Tower of Hanoi")
+ title: qsTr("Reassemble the shapes")
//: Help title
- description: qsTr("Reproduce the given tower")
- //intro: "Rebuild the same tower in the empty area as the one you see on the right hand side."
+ description: qsTr("The objective is to form a given shape")
+ // intro: "Click on each object to obtain the same figure. You can change their orientation by clicking on the arrows."
//: Help goal
- goal: qsTr("Reproduce the tower on the right in the empty space on the left")
+ goal: ""
//: Help prerequisite
prerequisite: qsTr("Mouse-manipulation")
//: Help manual
- manual: qsTr("Drag and Drop one top piece at a time, from one peg to another, to reproduce the tower on the right in the empty space on the left.")
- credit: qsTr("Concept taken from EPI games.")
+ manual: qsTr("Select the object to form. Move a piece by dragging it. The symmetrical button appears on items that supports it. Click on the rotation button or drag around it to show the rotation you want. More complicated levels can be found in tangram activity.")
+ credit: ""
section: "puzzle"
- createdInVersion: 4000
+ createdInVersion: 9800
}
diff --git a/src/activities/find_the_day/FindTheDay.qml b/src/activities/baby_tangram/BabyTangram.qml
copy from src/activities/find_the_day/FindTheDay.qml
copy to src/activities/baby_tangram/BabyTangram.qml
--- a/src/activities/find_the_day/FindTheDay.qml
+++ b/src/activities/baby_tangram/BabyTangram.qml
@@ -1,9 +1,10 @@
-/* GCompris - find_the_day.qml
+/* GCompris - BabyTangram.qml
*
- * Copyright (C) 2018 Amit Sagtani
+ * Copyright (C) 2019 Johnny Jazeix
*
* Authors:
- * Amit Sagtani
+ * Yves Combe / Philippe Banwarth (GTK+ version)
+ * Johnny Jazeix / Bruno Coudoin (Qt Quick port)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,11 +20,14 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../calendar"
-import "find_the_day_dataset.js" as Dataset
+import "dataset.js" as Dataset
+import "../tangram"
+import "."
-Calendar {
+Tangram {
+ id: activity
dataset: Dataset
-
+ resourceUrl: "qrc:/gcompris/src/activities/baby_tangram/resource/"
}
diff --git a/src/activities/baby_tangram/CMakeLists.txt b/src/activities/baby_tangram/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/src/activities/baby_tangram/CMakeLists.txt
@@ -0,0 +1 @@
+GCOMPRIS_ADD_RCC(activities/baby_tangram *.qml *.svg dataset.js resource/*/*)
diff --git a/src/activities/baby_tangram/baby_tangram.svg b/src/activities/baby_tangram/baby_tangram.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/baby_tangram/baby_tangram.svg
@@ -0,0 +1,863 @@
+
+
+
+
diff --git a/src/activities/baby_tangram/dataset.js b/src/activities/baby_tangram/dataset.js
new file mode 100644
--- /dev/null
+++ b/src/activities/baby_tangram/dataset.js
@@ -0,0 +1,717 @@
+.pragma library
+
+/* dataset format
+ - for each level we have:
+ - bg: an optional background image
+ - colorMask: the color of the shadowed target items
+ - a list of pieces that each holds:
+ - img: piece file name
+ - flippable: is the piece flippable
+ - flipping: target flipping state
+ - x: target x position
+ - y: target y position
+ - width: item width
+ - height: item height
+ - rotation: item target rotation
+ - moduloRotation: modulo rotation
+ - initX: initial x position
+ - initY: innitial y position
+ - initRotation: initial rotation
+ - initFlipping: initial flipping
+*/
+
+var dataset = [
+ {
+ 'bg': '',
+ 'name': 'train1',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'train/loco.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.238,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84868,
+ 'initY': 0.14357,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.237,
+ 'x': 0.16136986301369866,
+ 'y': 0.5003377010125074
+ },
+ {
+ 'img': 'train/coal.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.144,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.40198,
+ 'initY': 0.10248,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.221,
+ 'x': 0.38829064919595,
+ 'y': 0.5456027397260274
+ },
+ {
+ 'img': 'train/wood.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.141,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.58434,
+ 'initY': 0.23488,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.235,
+ 'x': 0.6111453245979751,
+ 'y': 0.5469714115544966
+ },
+ {
+ 'img': 'train/passenger.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.213,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.15311,
+ 'initY': 0.15368,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.238,
+ 'x': 0.8362608695652176,
+ 'y': 0.5122281119714115
+ },
+ ]
+ },
+ {
+ 'bg': '',
+ 'name': 'train2',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'train/loco.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.238,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84868,
+ 'initY': 0.14357,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.237,
+ 'x': 0.16136986301369866,
+ 'y': 0.5003377010125074
+ },
+ {
+ 'img': 'train/coal.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.144,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.40198,
+ 'initY': 0.10248,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.221,
+ 'x': 0.6116378796902918,
+ 'y': 0.5491762954139369
+ },
+ {
+ 'img': 'train/wood.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.141,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.58434,
+ 'initY': 0.23488,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.235,
+ 'x': 0.8368749255509234,
+ 'y': 0.5493537820131029
+ },
+ {
+ 'img': 'train/passenger.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.213,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.15311,
+ 'initY': 0.15368,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.238,
+ 'x': 0.3913531864204886,
+ 'y': 0.5140148898153662
+ },
+ ]
+ },
+ {
+ 'bg': '',
+ 'name': 'train3',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'train/loco.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.238,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84868,
+ 'initY': 0.14357,
+ 'moduloRotation': 360,
+ 'rotation': 45,
+ 'width': 0.237,
+ 'x': 0.19114949374627757,
+ 'y': 0.22279154258487197
+ },
+ {
+ 'img': 'train/coal.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.144,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.40198,
+ 'initY': 0.10248,
+ 'moduloRotation': 360,
+ 'rotation': 45,
+ 'width': 0.221,
+ 'x': 0.6336748064324003,
+ 'y': 0.7272584871947588
+ },
+ {
+ 'img': 'train/wood.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.141,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.58434,
+ 'initY': 0.23488,
+ 'moduloRotation': 360,
+ 'rotation': 45,
+ 'width': 0.235,
+ 'x': 0.4801149493746279,
+ 'y': 0.5791334127456819
+ },
+ {
+ 'img': 'train/passenger.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.213,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84311,
+ 'initY': 0.42368,
+ 'moduloRotation': 360,
+ 'rotation': 45,
+ 'width': 0.238,
+ 'x': 0.34251459201905915,
+ 'y': 0.3925139964264443
+ },
+ ]
+ },
+ {
+ 'bg': '',
+ 'name': 'train4',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'train/loco.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.238,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84868,
+ 'initY': 0.14357,
+ 'moduloRotation': 360,
+ 'rotation': 315,
+ 'width': 0.237,
+ 'x': 0.20365693865396073,
+ 'y': 0.4241018463371054
+ },
+ {
+ 'img': 'train/coal.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.144,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.40198,
+ 'initY': 0.10248,
+ 'moduloRotation': 360,
+ 'rotation': 90,
+ 'width': 0.221,
+ 'x': 0.7575580702799286,
+ 'y': 0.6540005955926147
+ },
+ {
+ 'img': 'train/wood.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.141,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.58434,
+ 'initY': 0.23488,
+ 'moduloRotation': 360,
+ 'rotation': 45,
+ 'width': 0.235,
+ 'x': 0.6689178082191782,
+ 'y': 0.4540589636688504
+ },
+ {
+ 'img': 'train/passenger.svg',
+ 'flippable': 0,
+ 'flipping': false,
+ 'height': 0.213,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84311,
+ 'initY': 0.42368,
+ 'moduloRotation': 360,
+ 'rotation': 0,
+ 'width': 0.238,
+ 'x': 0.4550815961882075,
+ 'y': 0.3317635497319833
+ },
+ ]
+ },
+ {
+ 'bg': '',
+ 'name': 'train5',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'train/loco.svg',
+ 'flippable': 1,
+ 'flipping': true,
+ 'height': 0.238,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.84868,
+ 'initY': 0.14357,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.237,
+ 'x': 0.8474925550923169,
+ 'y': 0.48902144133412745
+ },
+ {
+ 'img': 'train/coal.svg',
+ 'flippable': 1,
+ 'flipping': true,
+ 'height': 0.144,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.40198,
+ 'initY': 0.10248,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.221,
+ 'x': 0.619976176295414,
+ 'y': 0.5354776652769506
+ },
+ {
+ 'img': 'train/wood.svg',
+ 'flippable': 1,
+ 'flipping': true,
+ 'height': 0.141,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.58434,
+ 'initY': 0.2348,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.235,
+ 'x': 0.39375402025014905,
+ 'y': 0.5374419297200713
+ },
+ {
+ 'img': 'train/passenger.svg',
+ 'flippable': 1,
+ 'flipping': true,
+ 'height': 0.213,
+ 'initFlipping': 0,
+ 'initRotation': 0,
+ 'initX': 0.15311,
+ 'initY': 0.15368,
+ 'moduloRotation': 0,
+ 'rotation': 0,
+ 'width': 0.238,
+ 'x': 0.16741036331149514,
+ 'y': 0.5015074449076831
+ },
+ ]
+ },
+ {
+ 'name': 'Level 1',
+ 'bg': 'truck/traffic_bg.svg',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'truck/engine.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.860,
+ 'y': 0.573,
+ 'width': 0.233,
+ 'height': 0.109,
+ 'rotation': 0,
+ 'moduloRotation': 0,
+ 'initX': 0.866,
+ 'initY': 0.754,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/cabin.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.847,
+ 'y': 0.435,
+ 'width': 0.207,
+ 'height': 0.178,
+ 'rotation': 0,
+ 'moduloRotation': 0,
+ 'initX': 0.153,
+ 'initY': 0.789,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/container.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.358,
+ 'y': 0.489,
+ 'width': 0.676,
+ 'height': 0.271,
+ 'rotation': 0,
+ 'moduloRotation': 0,
+ 'initX': 0.338,
+ 'initY': 0.135,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/back_road.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.181,
+ 'y': 0.633,
+ 'width': 0.198,
+ 'height': 0.092,
+ 'rotation': 0,
+ 'moduloRotation': 0,
+ 'initX': 0.799,
+ 'initY': 0.146,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/front_road.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.766,
+ 'y': 0.617,
+ 'width': 0.403,
+ 'height': 0.121,
+ 'rotation': 0,
+ 'moduloRotation': 0,
+ 'initX': 0.501,
+ 'initY': 0.760,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ }
+ ]
+ },
+ {
+ 'name': 'Level 2',
+ 'bg': 'truck/traffic_bg.svg',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'truck/engine.svg',
+ 'flippable': 1,
+ 'flipping': 0,
+ 'x': 0.860,
+ 'y': 0.573,
+ 'width': 0.233,
+ 'height': 0.109,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.866,
+ 'initY': 0.754,
+ 'initRotation': 0,
+ 'initFlipping': 1
+ },
+ {
+ 'img': 'truck/cabin.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.847,
+ 'y': 0.435,
+ 'width': 0.207,
+ 'height': 0.178,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.153,
+ 'initY': 0.789,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/container.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.358,
+ 'y': 0.489,
+ 'width': 0.676,
+ 'height': 0.271,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.338,
+ 'initY': 0.135,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/back_road.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.181,
+ 'y': 0.633,
+ 'width': 0.198,
+ 'height': 0.092,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.799,
+ 'initY': 0.146,
+ 'initRotation': 270,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/front_road.svg',
+ 'flippable': 1,
+ 'flipping': 0,
+ 'x': 0.766,
+ 'y': 0.617,
+ 'width': 0.403,
+ 'height': 0.121,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.501,
+ 'initY': 0.760,
+ 'initRotation': 90,
+ 'initFlipping': 1
+ }
+ ]
+ },
+ {
+ 'name': 'Level 3',
+ 'bg': 'truck/traffic_bg.svg',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'truck/engine.svg',
+ 'flippable': 1,
+ 'flipping': 0,
+ 'x': 0.860,
+ 'y': 0.573,
+ 'width': 0.233,
+ 'height': 0.109,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.866,
+ 'initY': 0.754,
+ 'initRotation': 0,
+ 'initFlipping': 1
+ },
+ {
+ 'img': 'truck/cabin.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.847,
+ 'y': 0.435,
+ 'width': 0.207,
+ 'height': 0.178,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.153,
+ 'initY': 0.789,
+ 'initRotation': 45,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/container.svg',
+ 'flippable': 1,
+ 'flipping': 0,
+ 'x': 0.358,
+ 'y': 0.489,
+ 'width': 0.676,
+ 'height': 0.271,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.338,
+ 'initY': 0.135,
+ 'initRotation': 0,
+ 'initFlipping': 1
+ },
+ {
+ 'img': 'truck/back_road.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.181,
+ 'y': 0.633,
+ 'width': 0.198,
+ 'height': 0.092,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.799,
+ 'initY': 0.146,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'truck/front_road.svg',
+ 'flippable': 1,
+ 'flipping': 0,
+ 'x': 0.766,
+ 'y': 0.617,
+ 'width': 0.403,
+ 'height': 0.121,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.501,
+ 'initY': 0.760,
+ 'initRotation': 270,
+ 'initFlipping': 0
+ }
+ ]
+ },
+ {
+ 'name': 'Level 4',
+ 'bg': 'car1/car.svg',
+ 'colorMask': '#999',
+ 'pieces': [
+ {
+ 'img': 'car1/windshield.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.492,
+ 'y': 0.309,
+ 'width': 0.563,
+ 'height': 0.227,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.301,
+ 'initY': 0.133,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'car1/tire_right.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.226,
+ 'y': 0.720,
+ 'width': 0.126,
+ 'height': 0.147,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.863,
+ 'initY': 0.123,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'car1/tire_right.svg',
+ 'flippable': 0,
+ 'flipping': 1,
+ 'x': 0.782,
+ 'y': 0.720,
+ 'width': 0.126,
+ 'height': 0.147,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.663,
+ 'initY': 0.123,
+ 'initRotation': 0,
+ 'initFlipping': 1
+ },
+ {
+ 'img': 'car1/bumper.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.502,
+ 'y': 0.656,
+ 'width': 0.710,
+ 'height': 0.184,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.405,
+ 'initY': 0.892,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'car1/grille.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.505,
+ 'y': 0.600,
+ 'width': 0.365,
+ 'height': 0.051,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.382,
+ 'initY': 0.825,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'car1/headlights.svg',
+ 'flippable': 0,
+ 'flipping': 0,
+ 'x': 0.782,
+ 'y': 0.506,
+ 'width': 0.134,
+ 'height': 0.125,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.90,
+ 'initY': 0.85,
+ 'initRotation': 0,
+ 'initFlipping': 0
+ },
+ {
+ 'img': 'car1/headlights.svg',
+ 'flippable': 0,
+ 'flipping': 1,
+ 'x': 0.222,
+ 'y': 0.506,
+ 'width': 0.134,
+ 'height': 0.125,
+ 'rotation': 0,
+ 'moduloRotation': 360,
+ 'initX': 0.90,
+ 'initY': 0.30,
+ 'initRotation': 0,
+ 'initFlipping': 1
+ }
+ ]
+ }
+ ]
diff --git a/src/activities/tangram/resource/README b/src/activities/baby_tangram/resource/README
copy from src/activities/tangram/resource/README
copy to src/activities/baby_tangram/resource/README
--- a/src/activities/tangram/resource/README
+++ b/src/activities/baby_tangram/resource/README
@@ -9,11 +9,6 @@
car1/windshield.svg
tangram/background.svg
tangram/flip.svg
-tangram/p0.svg
-tangram/p1.svg
-tangram/p2.svg
-tangram/p3.svg
-tangram/p4.svg
train/coal.svg
train/loco.svg
train/passenger.svg
diff --git a/src/activities/tangram/resource/car1/bumper.svg b/src/activities/baby_tangram/resource/car1/bumper.svg
rename from src/activities/tangram/resource/car1/bumper.svg
rename to src/activities/baby_tangram/resource/car1/bumper.svg
diff --git a/src/activities/tangram/resource/car1/car.svg b/src/activities/baby_tangram/resource/car1/car.svg
rename from src/activities/tangram/resource/car1/car.svg
rename to src/activities/baby_tangram/resource/car1/car.svg
diff --git a/src/activities/tangram/resource/car1/grille.svg b/src/activities/baby_tangram/resource/car1/grille.svg
rename from src/activities/tangram/resource/car1/grille.svg
rename to src/activities/baby_tangram/resource/car1/grille.svg
diff --git a/src/activities/tangram/resource/car1/headlights.svg b/src/activities/baby_tangram/resource/car1/headlights.svg
rename from src/activities/tangram/resource/car1/headlights.svg
rename to src/activities/baby_tangram/resource/car1/headlights.svg
diff --git a/src/activities/tangram/resource/car1/tire_right.svg b/src/activities/baby_tangram/resource/car1/tire_right.svg
rename from src/activities/tangram/resource/car1/tire_right.svg
rename to src/activities/baby_tangram/resource/car1/tire_right.svg
diff --git a/src/activities/tangram/resource/car1/windshield.svg b/src/activities/baby_tangram/resource/car1/windshield.svg
rename from src/activities/tangram/resource/car1/windshield.svg
rename to src/activities/baby_tangram/resource/car1/windshield.svg
diff --git a/src/activities/tangram/resource/m-car1/bumper.svg b/src/activities/baby_tangram/resource/m-car1/bumper.svg
rename from src/activities/tangram/resource/m-car1/bumper.svg
rename to src/activities/baby_tangram/resource/m-car1/bumper.svg
diff --git a/src/activities/tangram/resource/m-car1/grille.svg b/src/activities/baby_tangram/resource/m-car1/grille.svg
rename from src/activities/tangram/resource/m-car1/grille.svg
rename to src/activities/baby_tangram/resource/m-car1/grille.svg
diff --git a/src/activities/tangram/resource/m-car1/headlights.svg b/src/activities/baby_tangram/resource/m-car1/headlights.svg
rename from src/activities/tangram/resource/m-car1/headlights.svg
rename to src/activities/baby_tangram/resource/m-car1/headlights.svg
diff --git a/src/activities/tangram/resource/m-car1/tire_right.svg b/src/activities/baby_tangram/resource/m-car1/tire_right.svg
rename from src/activities/tangram/resource/m-car1/tire_right.svg
rename to src/activities/baby_tangram/resource/m-car1/tire_right.svg
diff --git a/src/activities/tangram/resource/m-car1/windshield.svg b/src/activities/baby_tangram/resource/m-car1/windshield.svg
rename from src/activities/tangram/resource/m-car1/windshield.svg
rename to src/activities/baby_tangram/resource/m-car1/windshield.svg
diff --git a/src/activities/tangram/resource/m-train/coal.svg b/src/activities/baby_tangram/resource/m-train/coal.svg
rename from src/activities/tangram/resource/m-train/coal.svg
rename to src/activities/baby_tangram/resource/m-train/coal.svg
diff --git a/src/activities/tangram/resource/m-train/loco.svg b/src/activities/baby_tangram/resource/m-train/loco.svg
rename from src/activities/tangram/resource/m-train/loco.svg
rename to src/activities/baby_tangram/resource/m-train/loco.svg
diff --git a/src/activities/tangram/resource/m-train/passenger.svg b/src/activities/baby_tangram/resource/m-train/passenger.svg
rename from src/activities/tangram/resource/m-train/passenger.svg
rename to src/activities/baby_tangram/resource/m-train/passenger.svg
diff --git a/src/activities/tangram/resource/m-train/wood.svg b/src/activities/baby_tangram/resource/m-train/wood.svg
rename from src/activities/tangram/resource/m-train/wood.svg
rename to src/activities/baby_tangram/resource/m-train/wood.svg
diff --git a/src/activities/tangram/resource/m-truck/back_road.svg b/src/activities/baby_tangram/resource/m-truck/back_road.svg
rename from src/activities/tangram/resource/m-truck/back_road.svg
rename to src/activities/baby_tangram/resource/m-truck/back_road.svg
diff --git a/src/activities/tangram/resource/m-truck/cabin.svg b/src/activities/baby_tangram/resource/m-truck/cabin.svg
rename from src/activities/tangram/resource/m-truck/cabin.svg
rename to src/activities/baby_tangram/resource/m-truck/cabin.svg
diff --git a/src/activities/tangram/resource/m-truck/container.svg b/src/activities/baby_tangram/resource/m-truck/container.svg
rename from src/activities/tangram/resource/m-truck/container.svg
rename to src/activities/baby_tangram/resource/m-truck/container.svg
diff --git a/src/activities/tangram/resource/m-truck/engine.svg b/src/activities/baby_tangram/resource/m-truck/engine.svg
rename from src/activities/tangram/resource/m-truck/engine.svg
rename to src/activities/baby_tangram/resource/m-truck/engine.svg
diff --git a/src/activities/tangram/resource/m-truck/front_road.svg b/src/activities/baby_tangram/resource/m-truck/front_road.svg
rename from src/activities/tangram/resource/m-truck/front_road.svg
rename to src/activities/baby_tangram/resource/m-truck/front_road.svg
diff --git a/src/activities/baby_tangram/resource/tangram/background.svg b/src/activities/baby_tangram/resource/tangram/background.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/baby_tangram/resource/tangram/background.svg
@@ -0,0 +1,69 @@
+
+
+
+
diff --git a/src/activities/baby_tangram/resource/tangram/flip.svg b/src/activities/baby_tangram/resource/tangram/flip.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/baby_tangram/resource/tangram/flip.svg
@@ -0,0 +1,86 @@
+
+
+
+
diff --git a/src/activities/tangram/resource/train/README b/src/activities/baby_tangram/resource/train/README
rename from src/activities/tangram/resource/train/README
rename to src/activities/baby_tangram/resource/train/README
diff --git a/src/activities/tangram/resource/train/coal.svg b/src/activities/baby_tangram/resource/train/coal.svg
rename from src/activities/tangram/resource/train/coal.svg
rename to src/activities/baby_tangram/resource/train/coal.svg
diff --git a/src/activities/tangram/resource/train/loco.svg b/src/activities/baby_tangram/resource/train/loco.svg
rename from src/activities/tangram/resource/train/loco.svg
rename to src/activities/baby_tangram/resource/train/loco.svg
diff --git a/src/activities/tangram/resource/train/passenger.svg b/src/activities/baby_tangram/resource/train/passenger.svg
rename from src/activities/tangram/resource/train/passenger.svg
rename to src/activities/baby_tangram/resource/train/passenger.svg
diff --git a/src/activities/tangram/resource/train/wood.svg b/src/activities/baby_tangram/resource/train/wood.svg
rename from src/activities/tangram/resource/train/wood.svg
rename to src/activities/baby_tangram/resource/train/wood.svg
diff --git a/src/activities/tangram/resource/truck/back_road.svg b/src/activities/baby_tangram/resource/truck/back_road.svg
rename from src/activities/tangram/resource/truck/back_road.svg
rename to src/activities/baby_tangram/resource/truck/back_road.svg
diff --git a/src/activities/tangram/resource/truck/cabin.svg b/src/activities/baby_tangram/resource/truck/cabin.svg
rename from src/activities/tangram/resource/truck/cabin.svg
rename to src/activities/baby_tangram/resource/truck/cabin.svg
diff --git a/src/activities/tangram/resource/truck/container.svg b/src/activities/baby_tangram/resource/truck/container.svg
rename from src/activities/tangram/resource/truck/container.svg
rename to src/activities/baby_tangram/resource/truck/container.svg
diff --git a/src/activities/tangram/resource/truck/engine.svg b/src/activities/baby_tangram/resource/truck/engine.svg
rename from src/activities/tangram/resource/truck/engine.svg
rename to src/activities/baby_tangram/resource/truck/engine.svg
diff --git a/src/activities/tangram/resource/truck/front_road.svg b/src/activities/baby_tangram/resource/truck/front_road.svg
rename from src/activities/tangram/resource/truck/front_road.svg
rename to src/activities/baby_tangram/resource/truck/front_road.svg
diff --git a/src/activities/tangram/resource/truck/traffic_bg.svg b/src/activities/baby_tangram/resource/truck/traffic_bg.svg
rename from src/activities/tangram/resource/truck/traffic_bg.svg
rename to src/activities/baby_tangram/resource/truck/traffic_bg.svg
diff --git a/src/activities/baby_wordprocessor/ActivityInfo.qml b/src/activities/baby_wordprocessor/ActivityInfo.qml
--- a/src/activities/baby_wordprocessor/ActivityInfo.qml
+++ b/src/activities/baby_wordprocessor/ActivityInfo.qml
@@ -38,6 +38,6 @@
Press 'Shift' and use the arrow keys to select the text. Use Ctrl+C to copy, Ctrl+V to paste and Crtl+X to cut text. Ctrl+Z can be used to undo changes.
Try to fiddle around and find more shortcuts. For example, what is the shortcut to select all the text?")
credit: ""
- section: "computer keyboard reading"
+ section: "computer keyboard reading letters"
createdInVersion: 6000
}
diff --git a/src/activities/babymatch/ActivityInfo.qml b/src/activities/babymatch/ActivityInfo.qml
--- a/src/activities/babymatch/ActivityInfo.qml
+++ b/src/activities/babymatch/ActivityInfo.qml
@@ -38,6 +38,6 @@
//: Help manual
manual: qsTr("In the main board area, a set of objects is displayed. In the vertical box (at the left of the main board) another set of objects is shown, each object in the group on the left matching exactly one object in the main board area. This game challenges you to find the logical link between these objects. How do they fit together? Drag each object to the correct red space in the main area.")
credit: ""
- section: "discovery"
+ section: "reading vocabulary"
createdInVersion: 4000
}
diff --git a/src/activities/babyshapes/ActivityInfo.qml b/src/activities/babyshapes/ActivityInfo.qml
--- a/src/activities/babyshapes/ActivityInfo.qml
+++ b/src/activities/babyshapes/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Complete the puzzle by dragging each piece from the set of pieces on the left, to the matching space in the puzzle.")
credit: qsTr("The dog is provided by Andre Connes and released under the GPL")
- section: "discovery"
+ section: "computer"
createdInVersion: 4000
}
diff --git a/src/activities/binary_bulb/ActivityInfo.qml b/src/activities/binary_bulb/ActivityInfo.qml
--- a/src/activities/binary_bulb/ActivityInfo.qml
+++ b/src/activities/binary_bulb/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Turn on the right bulbs to represent the binary of the given decimal number. When you have achieved it, press OK.")
credit: ""
- section: "experiment"
+ section: "sciences experiment"
createdInVersion: 9500
}
diff --git a/src/activities/braille_alphabets/ActivityInfo.qml b/src/activities/braille_alphabets/ActivityInfo.qml
--- a/src/activities/braille_alphabets/ActivityInfo.qml
+++ b/src/activities/braille_alphabets/ActivityInfo.qml
@@ -36,6 +36,6 @@
manual: qsTr("The screen has 3 sections: an interactive braille cell, an instruction telling you the letter to reproduce, " +
"and at the top the Braille letters to use as a reference. Each level teaches a set of 10 letters.")
credit: ""
- section: "discovery braille"
+ section: "reading letters braille"
createdInVersion: 0
}
diff --git a/src/activities/braille_fun/ActivityInfo.qml b/src/activities/braille_fun/ActivityInfo.qml
--- a/src/activities/braille_fun/ActivityInfo.qml
+++ b/src/activities/braille_fun/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Enter the braille code in the tile for the letters on the banner pulled by Tux in his plane across the screen. Check the braille chart by clicking on the toggle button for help.")
credit: ""
- section: "discovery braille"
+ section: "reading braille letters"
createdInVersion: 4000
}
diff --git a/src/activities/calendar/ActivityInfo.qml b/src/activities/calendar/ActivityInfo.qml
--- a/src/activities/calendar/ActivityInfo.qml
+++ b/src/activities/calendar/ActivityInfo.qml
@@ -35,6 +35,7 @@
//: Help manual
manual: qsTr("Read the instructions and select the correct date on the calendar.")
credit: ""
- section: "discovery"
+ section: "math measures"
createdInVersion: 9000
+ levels: "1,2,3"
}
diff --git a/src/activities/calendar/CMakeLists.txt b/src/activities/calendar/CMakeLists.txt
--- a/src/activities/calendar/CMakeLists.txt
+++ b/src/activities/calendar/CMakeLists.txt
@@ -1 +1 @@
-GCOMPRIS_ADD_RCC(activities/calendar *.qml *.svg *.js)
+GCOMPRIS_ADD_RCC(activities/calendar *.qml *.svg *.js resource/* resource/*/*/*.qml)
diff --git a/src/activities/calendar/Calendar.qml b/src/activities/calendar/Calendar.qml
--- a/src/activities/calendar/Calendar.qml
+++ b/src/activities/calendar/Calendar.qml
@@ -27,13 +27,17 @@
import "../../core"
import "calendar.js" as Activity
import "calendar_dataset.js" as Dataset
+import "tutorial_instructions.js" as Instructions
ActivityBase {
id: activity
property var dataset: Dataset
onStart: focus = true
onStop: {}
+ property var tutorialInstructions: Instructions.get()
+ property bool showTutorial: true
+
pageComponent: Image {
id: background
signal start
@@ -43,6 +47,7 @@
sourceSize.width: Math.max(parent.width, parent.height)
Component.onCompleted: {
+ dialogActivityConfig.initialize()
activity.start.connect(start)
activity.stop.connect(stop)
}
@@ -57,15 +62,17 @@
property alias calendar: calendar
property alias okButton: okButton
property alias questionItem: questionItem
+ property var levels: activity.datasetLoader.item.data
property alias score: score
property alias answerChoices: answerChoices
property alias questionDelay: questionDelay
property alias okButtonParticles: okButtonParticles
property bool horizontalLayout: background.width >= background.height * 1.5
property alias daysOfTheWeekModel: daysOfTheWeekModel
+ property bool showTutorial: activity.showTutorial
}
- onStart: { Activity.start(items, dataset) }
+ onStart: { Activity.start(items) }
onStop: { Activity.stop() }
Keys.onPressed: (answerChoices.visible) ? answerChoices.handleKeys(event) : handleKeys(event);
@@ -345,6 +352,7 @@
Rectangle {
id: questionItemBackground
+ visible: !showTutorial
color: "#373737"
border.width: 2
border.color: "#f2f2f2"
@@ -362,6 +370,7 @@
// Displays the question.
GCText {
id: questionItem
+ visible: !showTutorial
anchors.fill: questionItemBackground
anchors.bottom: questionItemBackground.bottom
fontSizeMode: Text.Fit
@@ -372,15 +381,42 @@
horizontalAlignment: Text.AlignHCenter
}
+ //Tutorial section starts
+ Loader {
+ active: showTutorial
+ anchors.fill: parent
+ z: 1
+ sourceComponent: tutorialComponent
+ Component {
+ id: tutorialComponent
+ Image {
+ id: tutorialImage
+ source: "../digital_electricity/resource/texture01.png"
+ anchors.fill: parent
+ fillMode: Image.Tile
+ Tutorial {
+ id: tutorialSection
+ tutorialDetails: tutorialInstructions
+ useImage: false
+ onSkipPressed: {
+ showTutorial = false
+ Activity.initLevel()
+ }
+ }
+ }
+ }
+ }
+ // Tutorial section ends
+
// Answer Submission button.
BarButton {
id: okButton
source: "qrc:/gcompris/src/core/resource/bar_ok.svg"
+ visible: !showTutorial
height: bar.height * 0.8
width: okButton.height
sourceSize.width: okButton.width
sourceSize.height: okButton.height
- z: 10
anchors.top: calendarBox.bottom
anchors.right: calendarBox.right
anchors.margins: items.horizontalLayout ? 30 : 6
@@ -397,17 +433,39 @@
}
}
+ DialogChooseLevel {
+ id: dialogActivityConfig
+ currentActivity: activity.activityInfo
+
+ onSaveData: {
+ levelFolder = dialogActivityConfig.chosenLevel
+ currentActivity.currentLevel = dialogActivityConfig.chosenLevel
+ ApplicationSettings.setCurrentLevel(currentActivity.name, dialogActivityConfig.chosenLevel)
+ background.start()
+ home()
+ }
+ onClose: {
+ home()
+ }
+ onStartActivity: {
+ background.start()
+ }
+ }
+
DialogHelp {
id: dialogHelp
onClose: home()
}
Bar {
id: bar
- content: BarEnumContent { value: help | home | level }
+ content: BarEnumContent { value: items.showTutorial ? (help | home) : (help | home | level | activityConfig)}
onHelpClicked: {
displayDialog(dialogHelp)
}
+ onActivityConfigClicked: {
+ displayDialog(dialogActivityConfig)
+ }
onPreviousLevelClicked: Activity.previousLevel()
onNextLevelClicked: Activity.nextLevel()
onHomeClicked: activity.home()
@@ -420,6 +478,7 @@
Score {
id: score
+ visible: !showTutorial
height: okButton.height
width: height
anchors.top: calendarBox.bottom
diff --git a/src/activities/calendar/calendar.js b/src/activities/calendar/calendar.js
--- a/src/activities/calendar/calendar.js
+++ b/src/activities/calendar/calendar.js
@@ -40,11 +40,11 @@
var maxRange //sum of max. visible month and year on calendar for navigation bar next/prev button visibility.
var correctAnswer
var mode
+var daysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
-function start(items_, dataset_) {
+function start(items_) {
items = items_
- dataset = dataset_.get()
- numberOfLevel = dataset.length
+ numberOfLevel = items.levels.length
currentLevel = 0
if(Qt.locale(GCompris.ApplicationSettings.locale).firstDayOfWeek == Qml.Locale.Monday) {
@@ -59,7 +59,7 @@
function initLevel() {
currentSubLevel = 1;
items.bar.level = currentLevel + 1
- currentLevelConfig = dataset[currentLevel][0][0]
+ currentLevelConfig = items.levels[currentLevel]
setCalendarConfigurations()
initQuestion();
}
@@ -92,20 +92,117 @@
monthSelected = currentLevelConfig["visibleMonth"]
items.answerChoices.visible = (mode === "findDayOfWeek") ? true : false
items.okButton.visible = !items.answerChoices.visible
- currentDataSet = dataset[currentLevel][1]
+ currentDataSet = currentLevelConfig["questionAnswers"]
currentDataSet = Core.shuffle(currentDataSet)
items.score.numberOfSubLevels = currentDataSet.length
items.score.currentSubLevel = currentSubLevel
}
+function isLeapYear(year) {
+ if(year % 100 == 0 && year % 400 != 0) {
+ return false
+ } else if(year % 4 == 0) {
+ return true
+ } else {
+ return false
+ }
+}
+
+function getDateInLongFormat(date) {
+ var months = [qsTr("January"), qsTr("February"), qsTr("March"), qsTr("April"), qsTr("May"), qsTr("June"), qsTr("July"),
+ qsTr("August"), qsTr("September"), qsTr("October"), qsTr("November"), qsTr("December")];
+ //: return current date with format including current day, current month(in textual format) and current year
+ return qsTr("%1 %2 %3").arg(date.day).arg(months[date.month]).arg(date.year)
+}
+
+function generateRandomYearMonthDay(minimumDate, maximumDate) {
+ var minYear = Number(minimumDate.slice(0, 4))
+ var maxYear = Number(maximumDate.slice(0, 4))
+ var minMonth = Number(minimumDate.slice(5, 7))
+ var maxMonth = Number(maximumDate.slice(5, 7))
+ var minDate = Number(minimumDate.slice(8, 10))
+ var currentYear = minYear + Math.floor(Math.random() * Math.floor((maxYear - minYear + 1)))
+ var currentMonth
+ if(currentLevelConfig.questionAnswers.maxOffset) {
+ currentMonth = minMonth + Math.floor(Math.random() * Math.floor((maxMonth - minMonth - currentLevelConfig.questionAnswers.maxOffset / 30)))
+ } else {
+ currentMonth = minMonth + Math.floor(Math.random() * Math.floor((maxMonth - minMonth + 1)))
+ }
+ currentMonth = Math.max(currentMonth, 1)
+ var currentDate
+ daysInMonths[1] = (isLeapYear(currentYear)) ? 29 : 28;
+ currentDate = minDate + Math.floor(Math.random() * Math.floor((daysInMonths[currentMonth - 1] - minDate + 1)))
+ return { year: currentYear, month: currentMonth - 1, day: currentDate }
+}
+
+function addOffsetToCurrentDate(currentDate) {
+ var maxOffset = currentLevelConfig.questionAnswers.maxOffset
+ var offset = Math.floor(maxOffset / 2) + Math.floor(Math.random() * Math.floor(maxOffset))
+ var storedOffset = offset
+ daysInMonths[1] = (isLeapYear(currentDate.year)) ? 29 : 28;
+ offset += currentDate.day
+ var answerDate = 1;
+ var answerMonth = currentDate.month
+ var answerYear = currentDate.year
+ while(offset > 0) {
+ if(offset - daysInMonths[answerMonth] > 0) {
+ offset -= daysInMonths[answerMonth]
+ answerMonth++;
+ } else {
+ answerDate = offset;
+ offset = 0
+ }
+ if(answerMonth > 11) {
+ answerYear++;
+ daysInMonths[1] = (isLeapYear(answerYear)) ? 29 : 28;
+ answerMonth = 0;
+ }
+ }
+ return { year: answerYear, month: answerMonth, day: answerDate, offset: storedOffset }
+}
+
+function getTemplateQuestionText(mode, date) {
+ var questionText
+ if(mode == "findDayOfWeek") {
+ questionText = qsTr("What day of the week is on %1 of given month?").arg(date.day)
+ } else if(mode == "findDay") {
+ questionText = qsTr("Select day %1").arg(date.day)
+ } else if(mode == "findMonthOnly") {
+ questionText = qsTr("Find month number %1").arg(date.month + 1)
+ } else {
+ if(date.offset) {
+ //: The second argument represents the given date in complete format(with complete month name) and the first argument represents the difference in days between given date and answer date.
+ questionText = qsTr("Find the date %1 days after %2").arg(date.offset).arg(getDateInLongFormat(date))
+ } else
+ //: The argument represents the answer date in complete format(with complete month name)
+ questionText = qsTr("Find the date %1").arg(getDateInLongFormat(date))
+ }
+ return questionText
+}
+
function initQuestion() {
if(currentDataSet.length < currentSubLevel) {
items.bonus.good("lion")
}
else {
- items.score.currentSubLevel = currentSubLevel
- items.questionItem.text = currentDataSet[currentSubLevel-1]["question"]
- correctAnswer = currentDataSet[currentSubLevel-1]["answer"]
+ if(!currentLevelConfig.questionsExplicitlyGiven) {
+ var randomDate = generateRandomYearMonthDay(currentLevelConfig.minimumDate, currentLevelConfig.maximumDate)
+ items.score.currentSubLevel = currentSubLevel
+ if(currentLevelConfig.mode == "findDayOfWeek") {
+ var selectedDate = new Date(randomDate.year, randomDate.month - 1, randomDate.day)
+ correctAnswer.dayOfWeek = Number(selectedDate.getDay())
+ } else if(currentLevelConfig.mode == "findYearMonthDay" && currentLevelConfig.questionAnswers.maxOffset) {
+ correctAnswer = addOffsetToCurrentDate(randomDate)
+ randomDate.offset = correctAnswer.offset
+ } else {
+ correctAnswer = randomDate
+ }
+ items.questionItem.text = getTemplateQuestionText(currentLevelConfig.mode, randomDate)
+ } else {
+ items.score.currentSubLevel = currentSubLevel
+ items.questionItem.text = currentDataSet[currentSubLevel-1]["question"]
+ correctAnswer = currentDataSet[currentSubLevel-1]["answer"]
+ }
}
}
@@ -134,8 +231,14 @@
isCorrectAnswer = true
}
}
+ // For levels having question based on day only.
+ else if(mode === "findDay") {
+ if(daySelected === correctAnswer["day"]) {
+ isCorrectAnswer = true
+ }
+ }
// For levels having questions based on dayOfWeek, month and year.
- else if(mode !== "findDayOfWeek") {
+ else {
if(monthSelected === correctAnswer["month"] && daySelected === correctAnswer["day"] && yearSelected === correctAnswer["year"]) {
isCorrectAnswer = true
}
diff --git a/src/activities/calendar/calendar_dataset.js b/src/activities/calendar/calendar_dataset.js
--- a/src/activities/calendar/calendar_dataset.js
+++ b/src/activities/calendar/calendar_dataset.js
@@ -38,7 +38,8 @@
"maximumDate": "2018-03-31",
"visibleMonth": 2,
"visibleYear": 2018,
- "mode": "findDay"
+ "mode": "findDay",
+ "questionsExplicitly": false
}
],
[ // Level 1 Questions
@@ -78,7 +79,8 @@
"maximumDate": "2018-03-31",
"visibleMonth": 2,
"visibleYear": 2018,
- "mode": "findDayOfWeek"
+ "mode": "findDayOfWeek",
+ "questionsExplicitly": false
}
],
[ // Level 2 Questions
@@ -121,7 +123,8 @@
"maximumDate": "2018-03-31",
"visibleMonth": 2,
"visibleYear": 2018,
- "mode": "findDay"
+ "mode": "findDay",
+ "questionsExplicitly": false
}
],
@@ -165,7 +168,8 @@
"maximumDate": "2018-03-31",
"visibleMonth": 2,
"visibleYear": 2018,
- "mode": "findDay"
+ "mode": "findDay",
+ "questionsExplicitly": false
}
],
[ // Level 4 Questions
@@ -200,7 +204,8 @@
"maximumDate": "2018-12-31",
"visibleMonth": 1,
"visibleYear": 2018,
- "mode": "findMonthOnly"
+ "mode": "findMonthOnly",
+ "questionsExplicitly": false
}
],
[ // Level 5 Questions
@@ -231,11 +236,13 @@
[ // Level 6 Configurations
{
"navigationBarVisible" : true,
- "minimumDate": "2017-01-01",
- "maximumDate": "2019-12-31",
- "visibleMonth": 2,
+ "minimumDate": "2018-09-01",
+ "maximumDate": "2019-01-31",
+ "visibleMonth": 10,
"visibleYear": 2018,
- "mode": "findYearMonthDay"
+ "mode": "findYearMonthDay",
+ "questionsExplicitly": true,
+ "maxOffset": 30,
}
],
@@ -287,7 +294,8 @@
"maximumDate": "2019-12-31",
"visibleMonth": 1,
"visibleYear": 2018,
- "mode": "findYearMonthDay"
+ "mode": "findYearMonthDay",
+ "questionsExplicitly": true
}
],
[ // Level 7 Questions
diff --git a/src/activities/calendar/resource/1/Data.qml b/src/activities/calendar/resource/1/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/calendar/resource/1/Data.qml
@@ -0,0 +1,223 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Calendar Questions for a single month")
+ difficulty: 4
+ data: [
+ {
+ "navigationBarVisible" : false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5
+ }
+ },
+ {
+ "navigationBarVisible" : false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Select day 23"),
+ "answer": {"year": 2018, "month": 2, "day": 23}
+ },
+ {
+ "question": qsTr("Select day 1"),
+ "answer": {"year": 2018, "month": 2, "day": 1}
+ },
+ {
+ "question": qsTr("Select day 16"),
+ "answer": {"year": 2018, "month": 2, "day": 16}
+ },
+ {
+ "question": qsTr("Select day 28"),
+ "answer": {"year": 2018, "month": 2, "day": 28}
+ },
+ {
+ "question": qsTr("Select day 11"),
+ "answer": {"year": 2018, "month": 2, "day": 11}
+ },
+ {
+ "question": qsTr("Select day 20"),
+ "answer": {"year": 2018, "month": 2, "day": 20}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible" : false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDayOfWeek",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 7
+ }
+ },
+ {
+ "navigationBarVisible" : false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDayOfWeek",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("What day of week is the 4th of given month?"),
+ "answer": {"dayOfWeek": 0}
+ },
+ {
+ "question": qsTr("What day of the week is the 12th of given month?"),
+ "answer": {"dayOfWeek": 1}
+ },
+ {
+ "question": qsTr("What day of the week is the 20th of given month?"),
+ "answer": {"dayOfWeek": 2}
+ },
+ {
+ "question": qsTr("What day of the week is the 28th of given month?"),
+ "answer": {"dayOfWeek": 3}
+ },
+ {
+ "question": qsTr("What day of the week is the 22nd of given month?"),
+ "answer": {"dayOfWeek": 4}
+ },
+ {
+ "question": qsTr("What day of the week is the 16th of given month?"),
+ "answer": {"dayOfWeek": 5}
+ },
+ {
+ "question": qsTr("What day of the week is the 10th of given month?"),
+ "answer": {"dayOfWeek": 6}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible": false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Select a Monday between days 1 and 7 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 5}
+ },
+ {
+ "question": qsTr("Select a Tuesday between days 8 and 16 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 13}
+ },
+ {
+ "question": qsTr("Select a Wednesday between days 15 and 22 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 21}
+ },
+ {
+ "question": qsTr("Select a Thursday between days 26 and 31 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 29}
+ },
+ {
+ "question": qsTr("Select a Friday between days 20 and 25 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 23}
+ },
+ {
+ "question": qsTr("Select a Saturday between days 13 and 23 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 17}
+ },
+ {
+ "question": qsTr("Select a Sunday between days 5 and 17 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 11}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible" : false,
+ "minimumDate": "2018-03-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Select a Monday between days 1 and 7 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 5}
+ },
+ {
+ "question": qsTr("Select a Tuesday between days 8 and 16 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 13}
+ },
+ {
+ "question": qsTr("Select a Wednesday between days 15 and 22 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 21}
+ },
+ {
+ "question": qsTr("Select a Thursday between days 26 and 31 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 29}
+ },
+ {
+ "question": qsTr("Select a Friday between days 20 and 25 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 23}
+ },
+ {
+ "question": qsTr("Select a Saturday between days 13 and 23 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 17}
+ },
+ {
+ "question": qsTr("Select a Sunday between days 5 and 17 of given month"),
+ "answer": {"year": 2018, "month": 2, "day": 11}
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/activities/calendar/resource/2/Data.qml b/src/activities/calendar/resource/2/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/calendar/resource/2/Data.qml
@@ -0,0 +1,135 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Calendar Questions involving 2 months")
+ difficulty: 5
+ data: [
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 30
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 2,
+ "visibleYear": 2018,
+ "mode": "findDayOfWeek",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("What day of week is 30 days after 10 March?"),
+ "answer": {"dayOfWeek": 1}
+ },
+ {
+ "question": qsTr("What day of the week is 40 days after 15 July?"),
+ "answer": {"dayOfWeek": 5}
+ },
+ {
+ "question": qsTr("What day of the week is 20 days after 1 June?"),
+ "answer": {"dayOfWeek": 5}
+ },
+ {
+ "question": qsTr("What day of the week is 60 days after 10 April?"),
+ "answer": {"dayOfWeek": 6}
+ },
+ {
+ "question": qsTr("What day of the week is 10 days after 15 December?"),
+ "answer": {"dayOfWeek": 2}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 60
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2017-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Human Rights Day is celebrated five days after December 5. Find the date of Human Rights Day in 2017."),
+ "answer": {"year": 2017, "month": 11, "day": 10}
+ },
+ {
+ "question": qsTr("Braille Day is celebrated one day before January 5. Find the date of Braille Day in 2018"),
+ "answer": {"year": 2018, "month": 0, "day": 4}
+ },
+ {
+ "question": qsTr("Mark's birthday is on November 4. In 2017 his party was exactly two weeks later. Find the date of his party in 2017"),
+ "answer": {"year": 2017, "month": 10, "day": 18}
+ },
+ {
+ "question": qsTr("International Women's Day is celebrated two days before March 10. Find the date of International Women's Day in 2018."),
+ "answer": {"year": 2018, "month": 2, "day": 8}
+ },
+ {
+ "question": qsTr("Sports competition was held on last Friday of September 2017. Select the date of sports competition on the calendar."),
+ "answer": {"year": 2017, "month": 8, "day": 29}
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/activities/calendar/resource/3/Data.qml b/src/activities/calendar/resource/3/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/calendar/resource/3/Data.qml
@@ -0,0 +1,151 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Calendar Questions involving several months")
+ difficulty: 6
+ data: [
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findMonthOnly",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find the month starting a Thursday and having 28 days"),
+ "answer": {"month": [1]}
+ },
+ {
+ "question": qsTr("Find a month starting a Monday and having 31 days"),
+ "answer": {"month": [0, 9]}
+ },
+ {
+ "question": qsTr("Find the month between June and August"),
+ "answer": {"month": [6]}
+ },
+ {
+ "question": qsTr("Find a month starting a Saturday"),
+ "answer": {"month": [8, 11]}
+ },
+ {
+ "question": qsTr("Find a month having 30 days"),
+ "answer": {"month": [3, 5, 8, 10]}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 90
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 120
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find the first Monday of January month of year 2019"),
+ "answer": {"year": 2019, "month": 0, "day": 7}
+ },
+ {
+ "question": qsTr("Find the second Wednesday of February month of year 2019"),
+ "answer": {"year": 2019, "month": 1, "day": 13}
+ },
+ {
+ "question": qsTr("Find the third Friday of March month of year 2019"),
+ "answer": {"year": 2019, "month": 2, "day": 15}
+ },
+ {
+ "question": qsTr("Find the fifth Sunday of April month of year 2018"),
+ "answer": {"year": 2018, "month": 3, "day": 29}
+ },
+ {
+ "question": qsTr("Find the fourth Tuesday of July month of year 2018"),
+ "answer": {"year": 2018, "month": 6, "day": 24}
+ },
+ {
+ "question": qsTr("Find the first Monday of August month of year 2018"),
+ "answer": {"year": 2018, "month": 7, "day": 6}
+ },
+ {
+ "question": qsTr("Find the third Thursday of September month of year 2017"),
+ "answer": {"year": 2017, "month": 8, "day": 21}
+ },
+ {
+ "question": qsTr("Find the fifth Sunday of October month of year 2017"),
+ "answer": {"year": 2017, "month": 9, "day": 29}
+ },
+ {
+ "question": qsTr("Find the second Friday of December month of year 2017"),
+ "answer": {"year": 2017, "month": 11, "day": 8}
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial1.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial1.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial1.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial1.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,11 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("January \t February \t March \t April \t May \t June \t July \t August \t September \t October \t November \t December.")
}
+
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial2.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial2.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial2.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial2.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,10 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("Sunday \t Monday \t Tuesday \t Wednesday \t Thusday \t Friday \t Saturday \t")
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial3.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial3.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial3.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial3.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,10 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("February has 29 days if the year is a leap year and 28 days if it is not.")
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial4.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial4.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial4.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial4.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,10 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("If an year is divisible by 400 then it is a leap year.\nIf an year is divisible by 100 and not 400 then it is not a leap year.\nIf none of the above cases hold then only the years which are divisible by 4 are leap years.")
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial5.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial5.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial5.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial5.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,13 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("Select Leap year")
+ firstNumber: qsTr("2018")
+ secondNumber: qsTr("2016")
+ answer: 2016
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/calendar/resource/Tutorial6.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/calendar/resource/Tutorial6.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/calendar/resource/Tutorial6.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial6.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,11 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ firstNumber: qsTr("111")
+ secondNumber: qsTr("108")
}
diff --git a/src/activities/calendar/resource/TutorialBase.qml b/src/activities/calendar/resource/TutorialBase.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/calendar/resource/TutorialBase.qml
@@ -0,0 +1,126 @@
+/* GCompris - TutorialBase.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+ property alias firstNumber: firstNumber.textLabel
+ property alias secondNumber: secondNumber.textLabel
+ property alias questionText: question.text
+ property int answer
+
+ GCText {
+ id: question
+ fontSizeMode: Text.Fit
+ fontSize: mediumSize
+ anchors.left: tutorialRectangle.left
+ anchors.leftMargin: parent.height * 0.01
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+
+ AnswerButton {
+ id: firstNumber
+ visible: answer
+ textLabel: ""
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.2
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: Number(textLabel) === tutorialRectangle.answer
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+ }
+
+ AnswerButton {
+ id: secondNumber
+ textLabel: ""
+ visible: answer
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.65
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: Number(textLabel) === tutorialRectangle.answer
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+
+ }
+
+ Rectangle {
+ id: messageRectangle
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ top: parent.top
+ topMargin: parent.height * 0.75
+ }
+ opacity: 0.8
+ radius: 10
+ border.width: 6
+ color: "white"
+ border.color: "#87A6DD"
+ width: parent.width * 1.15
+ height: parent.height * 0.4
+ visible: false
+
+ GCText {
+ id: message
+ anchors {
+ centerIn: parent
+ margins: parent.border.width+1
+ }
+ text: ""
+ fontSizeMode: Text.Fit
+ fontSize: smallSize
+ color: "black"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+ }
+}
diff --git a/src/activities/calendar/tutorial_instructions.js b/src/activities/calendar/tutorial_instructions.js
new file mode 100644
--- /dev/null
+++ b/src/activities/calendar/tutorial_instructions.js
@@ -0,0 +1,51 @@
+/* GCompris - tutorial_instructions.js
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+
+function get() {
+ return [
+ {
+ "instruction": qsTr("This activity teaches how to use a calendar."),
+ "instructionQml": ""
+ },
+ {
+ "instruction": qsTr("For every year there are 12 months namely,"),
+ "instructionQml": "qrc:/gcompris/src/activities/calendar/resource/Tutorial1.qml"
+ },
+
+ {
+ "instruction": qsTr("For every week there are 7 days namely,"),
+ "instructionQml" : "qrc:/gcompris/src/activities/calendar/resource/Tutorial2.qml"
+ },
+
+ {
+ "instruction": qsTr("The number of days in a month are fixed for every year, except for february."),
+ "instructionQml" : "qrc:/gcompris/src/activities/calendar/resource/Tutorial3.qml"
+ },
+ {
+ "instruction": qsTr("Calculating Leap years."),
+ "instructionQml": "qrc:/gcompris/src/activities/calendar/resource/Tutorial4.qml"
+ },
+ {
+ "instruction": qsTr("Select the leap year out of the two."),
+ "instructionQml": "qrc:/gcompris/src/activities/calendar/resource/Tutorial5.qml"
+ }
+ ]
+}
diff --git a/src/activities/canal_lock/ActivityInfo.qml b/src/activities/canal_lock/ActivityInfo.qml
--- a/src/activities/canal_lock/ActivityInfo.qml
+++ b/src/activities/canal_lock/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You are in charge of the canal lock. Open the gates and the locks in the right order, so Tux can travel through the gates in both directions.")
credit: qsTr("Drawing by Stephane Cabaraux.")
- section: "experiment"
+ section: "sciences experiment"
createdInVersion: 0
}
diff --git a/src/activities/categorization/ActivityInfo.qml b/src/activities/categorization/ActivityInfo.qml
--- a/src/activities/categorization/ActivityInfo.qml
+++ b/src/activities/categorization/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Review the instructions and then drag and drop the elements as specified")
credit: ""
- section: "fun"
+ section: "reading vocabulary"
createdInVersion: 8000
}
diff --git a/src/activities/categorization/resource/board/category_colors.qml b/src/activities/categorization/resource/board/category_colors.qml
--- a/src/activities/categorization/resource/board/category_colors.qml
+++ b/src/activities/categorization/resource/board/category_colors.qml
@@ -31,25 +31,25 @@
"image": imagesPrefix + "others/color2.png",
"content": [
{
- "instructions": "Place the objects matching GREEN color to right and others to the left",
+ "instructions": qsTr("Place the objects matching GREEN color to right and others to the left"),
"image": imagesPrefix + "green.png",
"maxNumberOfGood": 5,
"maxNumberOfBad": 4,
"prefix": "qrc:/gcompris/data/words/",
"good": ["artichoke.png","cabbage.png","cucumber.png","cactus.png","clover.png"],
"bad": ["left.png","lobster.png","mail.png","post.png"]
},
{
- "instructions": "Place the objects matching WHITE color to right and others to the left",
+ "instructions": qsTr("Place the objects matching WHITE color to right and others to the left"),
"image": imagesPrefix + "white.png",
"maxNumberOfGood": 6,
"maxNumberOfBad": 6,
"prefix": "qrc:/gcompris/data/words/",
"good": ["milk.png","paper.png","dove.png","mail.png","egg.png", "bead.png"],
"bad": ["flash.png","plum.png","potato.png","pumpkin.png","rabbit.png","kiwi.png"]
},
{
- "instructions": "Place the objects matching PINK color to right and others to the left",
+ "instructions": qsTr("Place the objects matching PINK color to right and others to the left"),
"image": imagesPrefix + "pink.png",
"maxNumberOfGood": 5,
"maxNumberOfBad": 4,
@@ -59,25 +59,25 @@
},
{
"tags": ["red"],
- "instructions": "Place the objects matching RED color to right and others to the left",
+ "instructions": qsTr("Place the objects matching RED color to right and others to the left"),
"image": imagesPrefix + "red.png",
"maxNumberOfGood": 5,
"maxNumberOfBad": 4,
"prefix": "qrc:/gcompris/data/words/",
"good": ["shapes/dice.svg","lobster.png","pair.png","ladybug.png","post.png"],
"bad": ["shapes/halforange.svg","radio.png","ramp.png","wheat.png"]
},
{
- "instructions": "Place the objects matching BROWN color to right and others to the left",
+ "instructions": qsTr("Place the objects matching BROWN color to right and others to the left"),
"image": imagesPrefix + "brown.png",
"maxNumberOfGood": 6,
"maxNumberOfBad": 6,
"prefix": "qrc:/gcompris/data/words/",
"good": ["shapes/cookie.svg","date_fruit.png","chocolate.png","board.png","potato.png","kiwi.png"],
"bad": ["cheese.png","bright.png","shapes/conehat.svg","dolphin.png","shapes/cd.svg","drip.png"]
},
{
- "instructions": "Place the objects matching PURPLE color to right and others to the left",
+ "instructions": qsTr("Place the objects matching PURPLE color to right and others to the left"),
"categorise": "PURPLE",
"image": imagesPrefix + "others/purple.png",
"maxNumberOfGood": 6,
@@ -87,25 +87,25 @@
"bad": ["bulb.png","bell.png","blackbird.png","umbrella.png","pumpkin.png","shapes/halfmoon.svg"]
},
{
- "instructions": "Place the objects matching GREY color to right and others to the left",
+ "instructions": qsTr("Place the objects matching GREY color to right and others to the left"),
"image": imagesPrefix + "gray.png",
"maxNumberOfGood": 6,
"maxNumberOfBad": 6,
"prefix": "qrc:/gcompris/data/words/",
"good": ["chain.png","rabbit.png","ramp.png","dolphin.png","faucet.png","shapes/halfmoon.svg"],
"bad": ["shapes/backcard.svg","radio.png","clover.png","left.png","flash.png","ink.png"]
},
{
- "instructions": "Place the objects matching ORANGE color to right and others to the left",
+ "instructions": qsTr("Place the objects matching ORANGE color to right and others to the left"),
"image": imagesPrefix + "orange-color.png",
"maxNumberOfGood": 3,
"maxNumberOfBad": 3,
"prefix": "qrc:/gcompris/data/words/",
"good": ["pumpkin.png","shapes/halforange.svg","orange.png"],
"bad": ["plum.png","potato.png","post.png"]
},
{
- "instructions": "Place the objects matching YELLOW color to right and others to the left",
+ "instructions": qsTr("Place the objects matching YELLOW color to right and others to the left"),
"categorise":"YELLOW",
"image": imagesPrefix + "yellow.png",
"maxNumberOfGood": 6,
diff --git a/src/activities/chronos/ActivityInfo.qml b/src/activities/chronos/ActivityInfo.qml
--- a/src/activities/chronos/ActivityInfo.qml
+++ b/src/activities/chronos/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Pick from the pictures on the left and put them on the red dots")
credit: qsTr("Moon photo is copyright NASA. The space sounds come from Tuxpaint and Vegastrike which are released under the GPL license. The transportation images are copyright Franck Doucet. Dates of Transportation are based on those found in <http://www.wikipedia.org>.")
- section: "discovery"
+ section: "sciences history"
createdInVersion: 4000
}
diff --git a/src/activities/click_on_letter/ActivityInfo.qml b/src/activities/click_on_letter/ActivityInfo.qml
--- a/src/activities/click_on_letter/ActivityInfo.qml
+++ b/src/activities/click_on_letter/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A letter is spoken. Click on the matching letter in the main area. You can listen to the letter again, by clicking on the mouth icon.")
credit: ""
- section: "reading"
+ section: "reading letters"
createdInVersion: 0
}
diff --git a/src/activities/click_on_letter_up/ActivityInfo.qml b/src/activities/click_on_letter_up/ActivityInfo.qml
--- a/src/activities/click_on_letter_up/ActivityInfo.qml
+++ b/src/activities/click_on_letter_up/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A letter is spoken. Click on the matching letter in the main area. You can listen to the letter again, by clicking on the mouth icon in the bottom box.")
credit: ""
- section: "reading"
+ section: "reading letters"
createdInVersion: 0
}
diff --git a/src/activities/clockgame/ActivityInfo.qml b/src/activities/clockgame/ActivityInfo.qml
--- a/src/activities/clockgame/ActivityInfo.qml
+++ b/src/activities/clockgame/ActivityInfo.qml
@@ -35,6 +35,7 @@
//: Help manual
manual: qsTr("Set the clock to the given time, in the time-units shown (hours:minutes or hours:minutes:seconds). Drag the different arrows, to make the respective time unit go up or down.")
credit: ""
- section: "discovery"
+ section: "math measures"
createdInVersion: 0
+ levels: "1,2"
}
diff --git a/src/activities/clockgame/CMakeLists.txt b/src/activities/clockgame/CMakeLists.txt
--- a/src/activities/clockgame/CMakeLists.txt
+++ b/src/activities/clockgame/CMakeLists.txt
@@ -1 +1 @@
-GCOMPRIS_ADD_RCC(activities/clockgame *.qml *.svg *.js resource/*)
+GCOMPRIS_ADD_RCC(activities/clockgame *.qml *.svg *.js resource/* resource/*/*/*.qml)
diff --git a/src/activities/clockgame/Clockgame.qml b/src/activities/clockgame/Clockgame.qml
--- a/src/activities/clockgame/Clockgame.qml
+++ b/src/activities/clockgame/Clockgame.qml
@@ -44,6 +44,7 @@
signal stop
Component.onCompleted: {
+ dialogActivityConfig.initialize()
activity.start.connect(start)
activity.stop.connect(stop)
}
@@ -62,6 +63,10 @@
property int currentS: 43
property int numberOfTry: 3
property int currentTry: 0
+ property var levels: activity.datasetLoader.item.data
+ property bool minutesHandVisible
+ property bool secondsHandVisible
+ property bool zonesVisible
}
onStart: {
@@ -135,7 +140,7 @@
/* The clock */
Image {
id: clock
- source: Activity.url + "clock_bg.svg"
+ source: activity.resourceUrl + "clock_bg.svg"
anchors.centerIn: parent
fillMode: Image.PreserveAspectFit
sourceSize.height: parent.height
@@ -145,18 +150,18 @@
/* The yellow zones */
Image {
id: zones
- source: Activity.url + "clock_zones.svg"
+ source: activity.resourceUrl + "clock_zones.svg"
anchors.centerIn: parent
fillMode: Image.PreserveAspectFit
sourceSize.height: parent.height * 0.7
- visible: items.bar.level < 5
+ visible: items.zonesVisible
z: 2
}
/* The setter */
Image {
id: setter
- source: Activity.url + "clock_setter.svg"
+ source: activity.resourceUrl + "clock_setter.svg"
anchors {
verticalCenter: parent.verticalCenter
left: parent.right
@@ -189,10 +194,10 @@
}
z: 4
color: "#d56a3a"
- visible: items.bar.level < 6
+ visible: items.minutesHandVisible
}
}
-
+ /* The seconds */
Repeater {
model: 60
@@ -211,7 +216,7 @@
(index + 1) * 2 * Math.PI / 60)
}
z: 4
- visible: items.bar.level < 8
+ visible: items.secondsHandVisible
}
}
@@ -279,7 +284,7 @@
}
z: 4
color: "#2a2a2a"
- visible: items.bar.level < 4
+ visible: false
}
/* Arrow H */
@@ -319,6 +324,7 @@
width: height / 20
radius: width / 2
color: "#d56a3a"
+ visible: items.minutesHandVisible
transform: Rotation {
id: rotm
origin.x: m.width / 2
@@ -348,6 +354,7 @@
width: height / 30
radius: width / 2
color: "#2ccf4b"
+ visible: items.secondsHandVisible
transform: Rotation {
id: rots
origin.x: s.width / 2
@@ -367,7 +374,6 @@
verticalCenterOffset: s.height / 2
}
z: 7
- visible: items.bar.level > 2
}
/* Center */
@@ -396,9 +402,9 @@
var dh = Math.min(Math.abs(a - agnh),
Math.abs(a - agnh - 360),
Math.abs(a - agnh + 360))
- var dm = Math.min(Math.abs(a - angm),
- Math.abs(a - angm - 360),
- Math.abs(a - angm + 360))
+ var dm = m.visible ? Math.min(Math.abs(a - angm),
+ Math.abs(a - angm - 360),
+ Math.abs(a - angm + 360)) : 9999
var ds = s.visible ? Math.min(
Math.abs(a - angs),
Math.abs(a - angs - 360),
@@ -416,6 +422,7 @@
onReleased: {
Activity.selectedArrow = null
+ //todo replace this with Ok button
if (items.currentH === items.targetH
&& items.currentM === items.targetM
&& items.currentS === items.targetS) {
@@ -457,19 +464,43 @@
}
}
+ DialogChooseLevel {
+ id: dialogActivityConfig
+ currentActivity: activity.activityInfo
+
+ onSaveData: {
+ levelFolder = dialogActivityConfig.chosenLevel
+ currentActivity.currentLevel = dialogActivityConfig.chosenLevel
+ ApplicationSettings.setCurrentLevel(currentActivity.name, dialogActivityConfig.chosenLevel)
+ home()
+ }
+ onClose: {
+ home()
+ }
+ onStartActivity: {
+ background.start()
+ }
+ }
+
DialogHelp {
id: dialogHelp
onClose: home()
}
Bar {
id: bar
content: BarEnumContent {
- value: help | home | level
+ value: help | home | level | hint | activityConfig
}
onHelpClicked: {
displayDialog(dialogHelp)
}
+ onHintClicked: {
+ helper.visible = !helper.visible
+ }
+ onActivityConfigClicked: {
+ displayDialog(dialogActivityConfig)
+ }
onPreviousLevelClicked: Activity.previousLevel()
onNextLevelClicked: Activity.nextLevel()
onHomeClicked: activity.home()
diff --git a/src/activities/clockgame/clockgame.js b/src/activities/clockgame/clockgame.js
--- a/src/activities/clockgame/clockgame.js
+++ b/src/activities/clockgame/clockgame.js
@@ -19,49 +19,60 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*/
-var url = "qrc:/gcompris/src/activities/clockgame/resource/"
var currentLevel = 0
var numberOfLevel = 10
var items
var selectedArrow
function start(items_) {
items = items_
currentLevel = 0
+ numberOfLevel = items.levels.length
initLevel()
}
function stop() {}
function initLevel() {
items.bar.level = currentLevel + 1
+ items.numberOfTry = items.levels[currentLevel].numberOfSubLevels
items.currentH = Math.floor(Math.random() * 12)
items.targetH = Math.floor(Math.random() * 12)
-
- /* Set hours */
- switch (items.bar.level) {
- case 1:
- items.currentM = Math.floor(Math.random() * 4) * 15
- items.targetM = Math.floor(Math.random() * 4) * 15
- break
- case 2:
- items.currentM = Math.floor(Math.random() * 12) * 5
- items.targetM = Math.floor(Math.random() * 12) * 5
- break
- default:
+ items.minutesHandVisible = items.levels[currentLevel].displayMinutesHand
+ if(!items.minutesHandVisible) {
+ items.currentM = 0
+ items.targetM = 0
+ }
+ else if(items.levels[currentLevel].fixedMinutes !== undefined) {
+ items.currentM = Math.floor(Math.random() * 60)
+ items.targetM = items.levels[currentLevel].fixedMinutes
+ }
+ else {
items.currentM = Math.floor(Math.random() * 60)
items.targetM = Math.floor(Math.random() * 60)
- break
}
- if (items.bar.level > 3) {
- items.currentS = Math.floor(Math.random() * 60)
- items.targetS = Math.floor(Math.random() * 60)
- } else {
+ items.secondsHandVisible = items.levels[currentLevel].displaySecondsHand
+ if(!items.secondsHandVisible) {
items.currentS = 0
items.targetS = 0
}
+ else if(items.levels[currentLevel].fixedSeconds !== undefined) {
+ items.currentS = Math.floor(Math.random() * 60)
+ items.targetS = items.levels[currentLevel].fixedSeconds
+ }
+ else {
+ items.currentS = Math.floor(Math.random() * 60)
+ items.targetS = Math.floor(Math.random() * 60)
+ }
+
+ if(items.levels[currentLevel].zonesVisible !== undefined) {
+ items.zonesVisible = items.levels[currentLevel].zonesVisible
+ }
+ else {
+ items.zonesVisible = true
+ }
}
function nextTry() {
diff --git a/src/activities/clockgame/resource/1/Data.qml b/src/activities/clockgame/resource/1/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/clockgame/resource/1/Data.qml
@@ -0,0 +1,58 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("Set and display time on analog clock for full half and quarters of an hour.")
+ difficulty: 2
+ data: [
+ {
+ "numberOfSubLevels": 5,
+ "fixedMinutes": 0,
+ "displayMinutesHand": false,
+ "fixedSeconds": 0,
+ "displaySecondsHand": false
+ },
+ {
+ "numberOfSubLevels": 5,
+ "fixedMinutes": 15,
+ "displayMinutesHand": true,
+ "fixedSeconds": 0,
+ "displaySecondsHand": false
+ },
+ {
+ "numberOfSubLevels": 5,
+ "fixedMinutes": 30,
+ "displayMinutesHand": true,
+ "fixedSeconds": 0,
+ "displaySecondsHand": false
+ },
+ {
+ "numberOfSubLevels": 5,
+ "fixedMinutes": 45,
+ "displayMinutesHand": true,
+ "fixedSeconds": 0,
+ "displaySecondsHand": false
+ }
+ ]
+}
diff --git a/src/activities/clockgame/resource/2/Data.qml b/src/activities/clockgame/resource/2/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/clockgame/resource/2/Data.qml
@@ -0,0 +1,54 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2018 Johnny Jazeix
+ *
+ * Authors:
+ * Johnny Jazeix
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+Dataset {
+ objective: qsTr("Set and display time on analog clock for a time containing minutes and seconds.")
+ difficulty: 4
+ data: [
+ {
+ "numberOfSubLevels": 5,
+ "displayMinutesHand": true,
+ "fixedSeconds": 0,
+ "displaySecondsHand": false
+ },
+ {
+ "numberOfSubLevels": 5,
+ "fixedMinutes": 0,
+ "displayMinutesHand": true,
+ "fixedSeconds": 30,
+ "displaySecondsHand": true
+ },
+ {
+ "numberOfSubLevels": 5,
+ "displayMinutesHand": true,
+ "displaySecondsHand": true
+ },
+ {
+ "numberOfSubLevels": 10,
+ "displayMinutesHand": true,
+ "displaySecondsHand": true,
+ "zonesVisible": false
+ }
+ ]
+}
diff --git a/src/activities/color_mix/ActivityInfo.qml b/src/activities/color_mix/ActivityInfo.qml
--- a/src/activities/color_mix/ActivityInfo.qml
+++ b/src/activities/color_mix/ActivityInfo.qml
@@ -39,6 +39,6 @@
In case of paints the inks absorb different colors of light falling on it, subtracting it from what you see. The more ink you add, the more light is absorbed, and the darker the combined color gets. We can mix just three primary colors to make many new colors. The primary colors for paint/ink are cyan (a special shade of blue), magenta (a special shade of pink), and yellow.
")
credit: qsTr("Images from http://openclipart.org")
- section: "experiment color"
+ section: "sciences experiment color"
createdInVersion: 0
}
diff --git a/src/activities/color_mix_light/ActivityInfo.qml b/src/activities/color_mix_light/ActivityInfo.qml
--- a/src/activities/color_mix_light/ActivityInfo.qml
+++ b/src/activities/color_mix_light/ActivityInfo.qml
@@ -38,6 +38,6 @@
In case of light it is just the opposite of mixing color with paints! The more light you add the lighter the resultant color will get. Primary colors of light are red, green and blue.")
credit: qsTr("Images from http://openclipart.org")
- section: "experiment color"
+ section: "sciences experiment color"
createdInVersion: 0
}
diff --git a/src/activities/colors/ActivityInfo.qml b/src/activities/colors/ActivityInfo.qml
--- a/src/activities/colors/ActivityInfo.qml
+++ b/src/activities/colors/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Listen to the color and touch the matching duck.")
credit: ""
- section: "discovery color"
+ section: "reading color vocabulary"
createdInVersion: 0
}
diff --git a/src/activities/details/ActivityInfo.qml b/src/activities/details/ActivityInfo.qml
--- a/src/activities/details/ActivityInfo.qml
+++ b/src/activities/details/ActivityInfo.qml
@@ -38,6 +38,6 @@
//: Help manual
manual: qsTr("Complete the puzzle by dragging each piece from the set of pieces on the left, to the matching space in the puzzle.")
credit: qsTr("The images are from Wikimedia Commons.")
- section: "discovery"
+ section: "discovery arts"
createdInVersion: 4000
}
diff --git a/src/activities/digital_electricity/ActivityInfo.qml b/src/activities/digital_electricity/ActivityInfo.qml
--- a/src/activities/digital_electricity/ActivityInfo.qml
+++ b/src/activities/digital_electricity/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Drag electrical components from the selector and drop them in the working area. In the working area, you can move the components by dragging them. To delete a component, select the deletion tool on top of the component selector, and select the component. You can click on the component and then on the rotate button to rotate it or info button to get information about it. You can click on the switch to open and close it. To connect two terminals, click on first terminal, then on second terminal. To deselect terminal or delete tool, click on any empty area. The simulation is updated in real time by any user action.")
credit: ""
- section: "experimental"
+ section: "sciences experiment"
createdInVersion: 9000
}
diff --git a/src/activities/drawletters/ActivityInfo.qml b/src/activities/drawletters/ActivityInfo.qml
--- a/src/activities/drawletters/ActivityInfo.qml
+++ b/src/activities/drawletters/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Draw the letter by connecting the dots in the correct order")
credit: ""
- section: "reading"
+ section: "reading letters"
createdInVersion: 7000
}
diff --git a/src/activities/explore_farm_animals/ActivityInfo.qml b/src/activities/explore_farm_animals/ActivityInfo.qml
--- a/src/activities/explore_farm_animals/ActivityInfo.qml
+++ b/src/activities/explore_farm_animals/ActivityInfo.qml
@@ -42,6 +42,6 @@
In level three, a random text prompt is displayed and you must click on the animal that matches the text. When you have matched all texts correctly, you win!
")
credit: ""
- section: "discovery sound_group"
+ section: "sciences experiment"
createdInVersion: 0
}
diff --git a/src/activities/explore_monuments/ActivityInfo.qml b/src/activities/explore_monuments/ActivityInfo.qml
--- a/src/activities/explore_monuments/ActivityInfo.qml
+++ b/src/activities/explore_monuments/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the given keys to learn more of the monuments and then identify where the monuments is on the map by its name.")
credit: qsTr("Photos taken from Wikipedia.")
- section: "discovery"
+ section: "discovery arts"
createdInVersion: 6000
}
diff --git a/src/activities/explore_world_animals/ActivityInfo.qml b/src/activities/explore_world_animals/ActivityInfo.qml
--- a/src/activities/explore_world_animals/ActivityInfo.qml
+++ b/src/activities/explore_world_animals/ActivityInfo.qml
@@ -44,6 +44,6 @@
In level two, a random text prompt is displayed and you must click on the animal that matches the text. When you have matched all texts correctly, you win!
")
credit: ""
- section: "discovery miscellaneous"
+ section: "sciences experiment"
createdInVersion: 0
}
diff --git a/src/activities/explore_world_music/ActivityInfo.qml b/src/activities/explore_world_music/ActivityInfo.qml
--- a/src/activities/explore_world_music/ActivityInfo.qml
+++ b/src/activities/explore_world_music/ActivityInfo.qml
@@ -42,6 +42,6 @@
The third level is also a matching game. You must select the location that matches the text description on the screen. You win the level when you have correctly matched all text prompts.
")
credit: qsTr("Images from http://commons.wikimedia.org/wiki, http://archive.org")
- section: "discovery sound_group"
+ section: "discovery music"
createdInVersion: 0
}
diff --git a/src/activities/family/ActivityInfo.qml b/src/activities/family/ActivityInfo.qml
--- a/src/activities/family/ActivityInfo.qml
+++ b/src/activities/family/ActivityInfo.qml
@@ -37,6 +37,6 @@
"The circles are linked with lines to mark the relations. Married couples are marked with a ring on the link.\n" +
"You are the person in the white circle. Select the name you should call the person in the orange circle.\n")
credit: ""
- section: "discovery"
+ section: "sciences history"
createdInVersion: 9000
}
diff --git a/src/activities/family_find_relative/ActivityInfo.qml b/src/activities/family_find_relative/ActivityInfo.qml
--- a/src/activities/family_find_relative/ActivityInfo.qml
+++ b/src/activities/family_find_relative/ActivityInfo.qml
@@ -37,6 +37,6 @@
"The circles are linked with lines to mark the relations. Married couples are marked with a ring on the link.\n" +
"Click on a pair of family members which corresponds to the given relation.")
credit: ""
- section: "discovery"
+ section: "sciences history"
createdInVersion: 9000
}
diff --git a/src/activities/fifteen/ActivityInfo.qml b/src/activities/fifteen/ActivityInfo.qml
--- a/src/activities/fifteen/ActivityInfo.qml
+++ b/src/activities/fifteen/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click or drag on any pieces that has a free block beside it, and it will be swapped with the empty one.")
credit: ""
- section: "puzzle"
+ section: "discovery logic"
createdInVersion: 0
}
diff --git a/src/activities/find_the_day/ActivityInfo.qml b/src/activities/find_the_day/ActivityInfo.qml
--- a/src/activities/find_the_day/ActivityInfo.qml
+++ b/src/activities/find_the_day/ActivityInfo.qml
@@ -35,6 +35,7 @@
//: Help manual
manual: qsTr("Read the instructions and perform the requested calculation to find a date. Then select this date on the calendar.")
credit: ""
- section: "discovery"
+ section: "math measures"
createdInVersion: 9000
+ levels: "1,2,3"
}
diff --git a/src/activities/find_the_day/FindTheDay.qml b/src/activities/find_the_day/FindTheDay.qml
--- a/src/activities/find_the_day/FindTheDay.qml
+++ b/src/activities/find_the_day/FindTheDay.qml
@@ -22,8 +22,9 @@
import "../calendar"
import "find_the_day_dataset.js" as Dataset
+import "tutorial_instructions.js" as Instructions
Calendar {
dataset: Dataset
-
+ tutorialInstructions: Instructions.get()
}
diff --git a/src/activities/find_the_day/resource/1/Data.qml b/src/activities/find_the_day/resource/1/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/find_the_day/resource/1/Data.qml
@@ -0,0 +1,142 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Find the date less than one month away")
+ difficulty: 4
+ data: [
+
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-01-31",
+ "visibleMonth": 0,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ }
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5
+ }
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 10
+ }
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 20
+ }
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 7,
+ "visibleYear": 2018,
+ "mode": "findDayOfWeek",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find day of week 3 days after December 5."),
+ "answer": {"dayOfWeek": 6}
+ },
+ {
+ "question": qsTr("Find day of week 12 days before November 12."),
+ "answer": {"dayOfWeek": 3}
+ },
+ {
+ "question": qsTr("Find day of week 32 days after January 5."),
+ "answer": {"dayOfWeek": 2}
+ },
+ {
+ "question": qsTr("Find day of week 5 days after February 23."),
+ "answer": {"dayOfWeek": 3}
+ },
+ {
+ "question": qsTr("Find day of week 17 days before August 16."),
+ "answer": {"dayOfWeek": 1}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-05-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 30
+ }
+ }
+ ]
+}
diff --git a/src/activities/find_the_day/resource/2/Data.qml b/src/activities/find_the_day/resource/2/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/find_the_day/resource/2/Data.qml
@@ -0,0 +1,129 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Find the date less than two month away")
+ difficulty: 5
+ data: [
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-03-31",
+ "visibleMonth": 1,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 30
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 45
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 60
+ }
+ },
+ {
+ "navigationBarVisible": true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 7,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find the date 2 weeks and 3 days after January 12."),
+ "answer": {"year": 2018, "month": 0, "day": 29}
+ },
+ {
+ "question": qsTr("Find the date 3 weeks and 2 days after March 22."),
+ "answer": {"year": 2018, "month": 3, "day": 14}
+ },
+ {
+ "question": qsTr("Find the date 5 weeks and 6 days after October 5."),
+ "answer": {"year": 2018, "month": 10, "day": 15}
+ },
+ {
+ "question": qsTr("Find the date 1 week and 1 day before August 8."),
+ "answer": {"year": 2018, "month": 6, "day": 31}
+ },
+ {
+ "question": qsTr("Find the date 2 weeks and 5 days before July 2."),
+ "answer": {"year": 2018, "month": 5, "day": 13}
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/activities/find_the_day/resource/3/Data.qml b/src/activities/find_the_day/resource/3/Data.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/find_the_day/resource/3/Data.qml
@@ -0,0 +1,147 @@
+/* GCompris - Data.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../../../core"
+
+/*
+Contains the questions, answers and calendar configurations of every level.
+Add more levels by inserting questions and answers below.
+Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6)
+Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11)
+If questions are provided explicitly field questionAnswers contains an array of questions and answers and
+if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional
+parameter maxOffset for questions where the user has to find date some days ahead of the given date.
+[
+ //MODES
+ // findMonthOnly --> For questions based on finding month only.
+ // findYearMonthDay --> For questions based on finding year, month and day.
+ // findDayOfWeek --> For questions based on finding day of week only.
+ // findDay --> For questions based on finding day of a given month and year.
+ ]
+*/
+
+Dataset {
+ objective: qsTr("Find the date several months away")
+ difficulty: 6
+ data: [
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 0,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 60
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2019-12-31",
+ "visibleMonth": 10,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": false,
+ "questionAnswers": {
+ "length": 5,
+ "maxOffset": 90
+ }
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 7,
+ "visibleYear": 2018,
+ "mode": "findDayOfWeek",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find day of week 5 months and 2 days after July 3."),
+ "answer": {"dayOfWeek": 3}
+ },
+ {
+ "question": qsTr("Find day of week 2 months and 4 days after October 8."),
+ "answer": {"dayOfWeek": 3}
+ },
+ {
+ "question": qsTr("Find day of week 1 month and 3 days before December 28."),
+ "answer": {"dayOfWeek": 0}
+ },
+ {
+ "question": qsTr("Find day of week 8 months and 7 days after February 28."),
+ "answer": {"dayOfWeek": 0}
+ },
+ {
+ "question": qsTr("Find day of week 3 months and 3 days before September 15."),
+ "answer": {"dayOfWeek": 2}
+ }
+ ]
+ },
+ {
+ "navigationBarVisible" : true,
+ "minimumDate": "2018-01-01",
+ "maximumDate": "2018-12-31",
+ "visibleMonth": 7,
+ "visibleYear": 2018,
+ "mode": "findYearMonthDay",
+ "questionsExplicitlyGiven": true,
+ "questionAnswers": [
+ {
+ "question": qsTr("Find the date 2 months, 1 week and 5 days after January 12."),
+ "answer": {"year": 2018, "month": 2, "day": 24}
+ },
+ {
+ "question": qsTr("Find the date 3 months, 2 weeks and 1 day after August 23."),
+ "answer": {"year": 2018, "month": 11, "day": 8}
+ },
+ {
+ "question": qsTr("Find the date 5 months, 3 weeks and 2 days after March 20."),
+ "answer": {"year": 2018, "month": 8, "day": 12}
+ },
+ {
+ "question": qsTr("Find the date 1 month 1 week and 1 day before September 10."),
+ "answer": {"year": 2018, "month": 7, "day": 2}
+ },
+ {
+ "question": qsTr("Find the date 2 months, 1 week and 8 days before April 7."),
+ "answer": {"year": 2018, "month": 0, "day": 23}
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/find_the_day/resource/Tutorial1.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/find_the_day/resource/Tutorial1.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/find_the_day/resource/Tutorial1.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial1.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,11 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("We add 5 to the current date, which gives us the new date 20, and since December has 31 days and the new date is less than that. So the answer will be 20 December 2018.")
}
+
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/find_the_day/resource/Tutorial2.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/find_the_day/resource/Tutorial2.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/find_the_day/resource/Tutorial2.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial2.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,10 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("Since July has 31 days, out of 20 the first 7 days will change the month from July to August. Now we have to add the remaining 20 - 7 = 14 days to 1 August 2018 which will make the final date equal to 14 August 2018")
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/find_the_day/resource/Tutorial3.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/find_the_day/resource/Tutorial3.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/find_the_day/resource/Tutorial3.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial3.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,13 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("Select the correct option")
+ firstNumber: qsTr("16")
+ secondNumber: qsTr("14")
+ answer: 16
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/find_the_day/resource/Tutorial4.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/find_the_day/resource/Tutorial4.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/find_the_day/resource/Tutorial4.qml
@@ -1,9 +1,9 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial4.qml
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Akshay Kumar
*
* Authors:
- * Bruno Coudoin
+ * Akshay Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +19,13 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../../core"
-import "../algebra_by/"
+import "../../../core"
-Algebra {
- onStart: {
- operand.text = "+"
- }
+TutorialBase {
+ questionText: qsTr("Select the correct option")
+ firstNumber: qsTr("18")
+ secondNumber: qsTr("13")
+ answer: 13
}
diff --git a/src/activities/find_the_day/resource/TutorialBase.qml b/src/activities/find_the_day/resource/TutorialBase.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/find_the_day/resource/TutorialBase.qml
@@ -0,0 +1,126 @@
+/* GCompris - TutorialBase.qml
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+ property alias firstNumber: firstNumber.textLabel
+ property alias secondNumber: secondNumber.textLabel
+ property alias questionText: question.text
+ property int answer
+
+ GCText {
+ id: question
+ fontSizeMode: Text.Fit
+ fontSize: mediumSize
+ anchors.left: tutorialRectangle.left
+ anchors.leftMargin: parent.height * 0.01
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+
+ AnswerButton {
+ id: firstNumber
+ visible: answer
+ textLabel: ""
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.2
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: Number(textLabel) === tutorialRectangle.answer
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+ }
+
+ AnswerButton {
+ id: secondNumber
+ textLabel: ""
+ visible: answer
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.65
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: Number(textLabel) === tutorialRectangle.answer
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+
+ }
+
+ Rectangle {
+ id: messageRectangle
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ top: parent.top
+ topMargin: parent.height * 0.75
+ }
+ opacity: 0.8
+ radius: 10
+ border.width: 6
+ color: "white"
+ border.color: "#87A6DD"
+ width: parent.width * 1.15
+ height: parent.height * 0.4
+ visible: false
+
+ GCText {
+ id: message
+ anchors {
+ centerIn: parent
+ margins: parent.border.width+1
+ }
+ text: ""
+ fontSizeMode: Text.Fit
+ fontSize: smallSize
+ color: "black"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+ }
+}
diff --git a/src/activities/find_the_day/tutorial_instructions.js b/src/activities/find_the_day/tutorial_instructions.js
new file mode 100644
--- /dev/null
+++ b/src/activities/find_the_day/tutorial_instructions.js
@@ -0,0 +1,45 @@
+/* GCompris - tutorial_instructions.js
+ *
+ * Copyright (C) 2019 Akshay Kumar
+ *
+ * Authors:
+ * Akshay Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+
+function get() {
+ return [
+ {
+ "instruction": qsTr("This activity teaches students to find the exact date."),
+ "instructionQml": ""
+ },
+ {
+ "instruction": qsTr("For example if today is 15 December 2019, find the date 5 days after today,"),
+ "instructionQml": "qrc:/gcompris/src/activities/find_the_day/resource/Tutorial1.qml"
+ },
+ {
+ "instruction": qsTr("What will be the date 20 days after 25 July 2018"),
+ "instructionQml" : "qrc:/gcompris/src/activities/find_the_day/resource/Tutorial2.qml"
+ },
+ {
+ "instruction": qsTr("What will be the date 5 days after 11 August 2018."),
+ "instructionQml" : "qrc:/gcompris/src/activities/find_the_day/resource/Tutorial3.qml"
+ },
+ {
+ "instruction": qsTr("What will be the date 25 days after 18 April 2018."),
+ "instructionQml": "qrc:/gcompris/src/activities/find_the_day/resource/Tutorial4.qml"
+ }
+ ]
+}
diff --git a/src/activities/geo-country/ActivityInfo.qml b/src/activities/geo-country/ActivityInfo.qml
--- a/src/activities/geo-country/ActivityInfo.qml
+++ b/src/activities/geo-country/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Drag and drop different regions of the country to correct locations to redraw the whole country.")
credit: ""
- section: "discovery"
+ section: "sciences geography"
createdInVersion: 4000
}
diff --git a/src/activities/geography/ActivityInfo.qml b/src/activities/geography/ActivityInfo.qml
--- a/src/activities/geography/ActivityInfo.qml
+++ b/src/activities/geography/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Drag and drop the map pieces to correct locations to redraw the whole map.")
credit: ""
- section: "discovery"
+ section: "sciences geography"
createdInVersion: 4000
}
diff --git a/src/activities/gletters/ActivityInfo.qml b/src/activities/gletters/ActivityInfo.qml
--- a/src/activities/gletters/ActivityInfo.qml
+++ b/src/activities/gletters/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Type the falling letters before they reach the ground")
credit: ""
- section: "computer keyboard reading"
+ section: "computer keyboard reading letters"
createdInVersion: 0
}
diff --git a/src/activities/gletters/resource/default-ml.json b/src/activities/gletters/resource/default-ml.json
new file mode 100644
--- /dev/null
+++ b/src/activities/gletters/resource/default-ml.json
@@ -0,0 +1,256 @@
+{
+ "levels" : [
+ {
+ "level" : "1",
+ "words" : [
+ "അ",
+ "ആ",
+ "ഇ",
+ "ഈ",
+ "ഉ",
+ "ഊ",
+ "ഋ"
+ ]
+ },
+ {
+ "level" : "2",
+ "words" : [
+ "എ",
+ "ഏ",
+ "ഐ",
+ "ഒ",
+ "ഓ",
+ "ഔ",
+ "അം",
+ "അഃ"
+ ]
+ },
+ {
+ "level" : "3",
+ "words" : [
+ "അ",
+ "ആ",
+ "ഇ",
+ "ഈ",
+ "ഉ",
+ "ഊ",
+ "ഋ",
+ "എ",
+ "ഏ",
+ "ഐ",
+ "ഒ",
+ "ഓ",
+ "ഔ",
+ "അം",
+ "അഃ"
+ ]
+ },
+ {
+ "level" : "4",
+ "words" : [
+ "ക",
+ "ഖ",
+ "ഗ",
+ "ഘ",
+ "ങ",
+ "ച",
+ "ഛ",
+ "ജ",
+ "ഝ",
+ "ഞ",
+ "ട",
+ "ഠ",
+ "ഡ",
+ "ഢ",
+ "ണ"
+ ]
+ },
+ {
+ "level" : "5",
+ "words" : [
+ "ട",
+ "ഠ",
+ "ഡ",
+ "ഢ",
+ "ണ",
+ "ത",
+ "ഥ",
+ "ദ",
+ "ധ",
+ "ന",
+ "പ",
+ "ഫ",
+ "ബ",
+ "ഭ",
+ "മ"
+ ]
+ },
+ {
+ "level" : "6",
+ "words" : [
+ "പ",
+ "ഫ",
+ "ബ",
+ "ഭ",
+ "മ",
+ "യ",
+ "ര",
+ "ല",
+ "വ",
+ "ശ",
+ "ഷ",
+ "സ",
+ "ഹ",
+ "ള",
+ "ഴ",
+ "റ"
+ ]
+ },
+ {
+ "level" : "7",
+ "words" : [
+ "യ",
+ "ര",
+ "ല",
+ "വ",
+ "ശ",
+ "ഷ",
+ "സ",
+ "ഹ",
+ "ള",
+ "ഴ",
+ "റ",
+ "ൻ",
+ "ൾ",
+ "ർ",
+ "ൺ",
+ "ൽ"
+ ]
+ },
+ {
+ "level" : "8",
+ "words" : [
+ "ക",
+ "ഖ",
+ "ഗ",
+ "ഘ",
+ "ങ",
+ "ച",
+ "ഛ",
+ "ജ",
+ "ഝ",
+ "ഞ",
+ "ട",
+ "ഠ",
+ "ഡ",
+ "ഢ",
+ "ണ",
+ "ത",
+ "ഥ",
+ "ദ",
+ "ധ",
+ "ന",
+ "പ",
+ "ഫ",
+ "ബ",
+ "ഭ",
+ "മ",
+ "യ",
+ "ര",
+ "ല",
+ "വ",
+ "ശ",
+ "ഷ",
+ "സ",
+ "ഹ",
+ "ള",
+ "ഴ",
+ "റ",
+ "ൻ",
+ "ൾ",
+ "ർ",
+ "ൺ",
+ "ൽ"
+ ]
+ },
+ {
+ "level" : "9",
+ "words" : [
+ "അ",
+ "ആ",
+ "ഇ",
+ "ഈ",
+ "ഉ",
+ "ഊ",
+ "ഋ",
+ "എ",
+ "ഏ",
+ "ഐ",
+ "ഒ",
+ "ഓ",
+ "ഔ",
+ "അം",
+ "അഃ",
+ "ക",
+ "ഖ",
+ "ഗ",
+ "ഘ",
+ "ങ",
+ "ച",
+ "ഛ",
+ "ജ",
+ "ഝ",
+ "ഞ",
+ "ട",
+ "ഠ",
+ "ഡ",
+ "ഢ",
+ "ണ",
+ "ത",
+ "ഥ",
+ "ദ",
+ "ധ",
+ "ന",
+ "പ",
+ "ഫ",
+ "ബ",
+ "ഭ",
+ "മ",
+ "യ",
+ "ര",
+ "ല",
+ "വ",
+ "ശ",
+ "ഷ",
+ "സ",
+ "ഹ",
+ "ള",
+ "ഴ",
+ "റ",
+ "ൻ",
+ "ൾ",
+ "ർ",
+ "ൺ",
+ "ൽ"
+ ]
+ },
+ {
+ "level" : "10",
+ "words" : [
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "0"
+ ]
+ }
+ ],
+ "name" : "default-ml",
+ "locale" : "ml",
+ "description" : "Malayalam"
+}
diff --git a/src/activities/gnumch-equality/ActivityInfo.qml b/src/activities/gnumch-equality/ActivityInfo.qml
--- a/src/activities/gnumch-equality/ActivityInfo.qml
+++ b/src/activities/gnumch-equality/ActivityInfo.qml
@@ -39,6 +39,6 @@
"
" +
qsTr("Take care to avoid the Troggles.")
credit: ""
- section: "math"
+ section: "math arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/gnumch-factors/ActivityInfo.qml b/src/activities/gnumch-factors/ActivityInfo.qml
--- a/src/activities/gnumch-factors/ActivityInfo.qml
+++ b/src/activities/gnumch-factors/ActivityInfo.qml
@@ -17,7 +17,6 @@
*/
import GCompris 1.0
-// Must be updated once GnumchEquality is reviewed
ActivityInfo {
name: "gnumch-factors/GnumchFactors.qml"
difficulty: 5
@@ -40,6 +39,6 @@
"
" +
qsTr("Take care to avoid the Troggles.")
credit: ""
- section: "math"
+ section: "math arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/gnumch-primes/ActivityInfo.qml b/src/activities/gnumch-primes/ActivityInfo.qml
--- a/src/activities/gnumch-primes/ActivityInfo.qml
+++ b/src/activities/gnumch-primes/ActivityInfo.qml
@@ -17,7 +17,6 @@
*/
import GCompris 1.0
-// Must be updated once GnumchEquality is reviewed
ActivityInfo {
name: "gnumch-primes/GnumchPrimes.qml"
difficulty: 6
@@ -40,6 +39,6 @@
"
" +
qsTr("Take care to avoid the Troggles.")
credit: ""
- section: "math"
+ section: "math arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/graph-coloring/ActivityInfo.qml b/src/activities/graph-coloring/ActivityInfo.qml
--- a/src/activities/graph-coloring/ActivityInfo.qml
+++ b/src/activities/graph-coloring/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: ""
credit: ""
- section: "math"
+ section: "discovery logic"
createdInVersion: 6000
}
diff --git a/src/activities/guesscount/ActivityInfo.qml b/src/activities/guesscount/ActivityInfo.qml
--- a/src/activities/guesscount/ActivityInfo.qml
+++ b/src/activities/guesscount/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Drag the appropriate numbers and the operators to the boxes to obtain the number to guess in the instruction.")
credit: ""
- section: "math"
+ section: "math arithmetic"
createdInVersion: 8000
}
diff --git a/src/activities/hangman/ActivityInfo.qml b/src/activities/hangman/ActivityInfo.qml
--- a/src/activities/hangman/ActivityInfo.qml
+++ b/src/activities/hangman/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You can enter the letters using the virtual keyboard on the screen or with the real keyboard.")
credit: ""
- section: "keyboard reading"
+ section: "keyboard reading words"
createdInVersion: 5000
}
diff --git a/src/activities/hanoi/ActivityInfo.qml b/src/activities/hanoi/ActivityInfo.qml
--- a/src/activities/hanoi/ActivityInfo.qml
+++ b/src/activities/hanoi/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Drag and Drop one top piece at a time, from one peg to another, to reproduce the tower on the right in the empty space on the left.")
credit: qsTr("Concept taken from EPI games.")
- section: "puzzle"
+ section: "discovery logic"
createdInVersion: 4000
}
diff --git a/src/activities/hanoi_real/ActivityInfo.qml b/src/activities/hanoi_real/ActivityInfo.qml
--- a/src/activities/hanoi_real/ActivityInfo.qml
+++ b/src/activities/hanoi_real/ActivityInfo.qml
@@ -38,6 +38,6 @@
//: Help manual
manual: qsTr("Drag and drop the top pieces only from one peg to another, to reproduce the initial left side tower on the right peg.")
credit: qsTr("The puzzle was invented by the French mathematician Edouard Lucas in 1883. There is a legend about a Hindu temple whose priests were constantly engaged in moving a set of 64 discs according to the rules of the Tower of Hanoi puzzle. According to the legend, the world would end when the priests finished their work. The puzzle is therefore also known as the Tower of Brahma puzzle. It is not clear whether Lucas invented this legend or was inspired by it. (source Wikipedia: http://en.wikipedia.org/wiki/Tower_of_hanoi)")
- section: "puzzle"
+ section: "discovery logic"
createdInVersion: 4000
}
diff --git a/src/activities/imagename/ActivityInfo.qml b/src/activities/imagename/ActivityInfo.qml
--- a/src/activities/imagename/ActivityInfo.qml
+++ b/src/activities/imagename/ActivityInfo.qml
@@ -37,6 +37,6 @@
prerequisite: qsTr("Reading")
//: Help manual
manual: qsTr("Drag each image from the (vertical) box on the left to its (corresponding) name on the right. Click the OK button to check your answer.")
- section: "reading"
+ section: "reading words"
createdInVersion: 4000
}
diff --git a/src/activities/intro_gravity/ActivityInfo.qml b/src/activities/intro_gravity/ActivityInfo.qml
--- a/src/activities/intro_gravity/ActivityInfo.qml
+++ b/src/activities/intro_gravity/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Follow the instructions when you run the activity.")
credit: ""
- section: "experiment"
+ section: "sciences experiment"
createdInVersion: 4000
}
diff --git a/src/activities/land_safe/ActivityInfo.qml b/src/activities/land_safe/ActivityInfo.qml
--- a/src/activities/land_safe/ActivityInfo.qml
+++ b/src/activities/land_safe/ActivityInfo.qml
@@ -43,7 +43,7 @@
The landing platform is green if your speed is fine for a safe landing.")
credit: ""
- section: "experiment"
+ section: "sciences experiment"
enabled: ApplicationInfo.isBox2DInstalled //ApplicationInfo.hasShader
createdInVersion: 6000
}
diff --git a/src/activities/lang/ActivityInfo.qml b/src/activities/lang/ActivityInfo.qml
--- a/src/activities/lang/ActivityInfo.qml
+++ b/src/activities/lang/ActivityInfo.qml
@@ -43,6 +43,6 @@
+ "When done, you are suggested an exercise in which, given the voice, "
+ "you must find the right word. In the configuration, you can select the language you want to learn.")
credit: qsTr("The images and voices come from the Art4Apps project: http://www.art4apps.org/.")
- section: "reading"
+ section: "reading vocabulary"
createdInVersion: 5000
}
diff --git a/src/activities/lang/resource/content-be.json b/src/activities/lang/resource/content-be.json
--- a/src/activities/lang/resource/content-be.json
+++ b/src/activities/lang/resource/content-be.json
@@ -464,4 +464,4 @@
"wrist.ogg": "запясце",
"write.ogg": "пісаць",
"zoo.ogg": "заапарк"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-br.json b/src/activities/lang/resource/content-br.json
--- a/src/activities/lang/resource/content-br.json
+++ b/src/activities/lang/resource/content-br.json
@@ -3,7 +3,7 @@
"11.ogg": "unnek",
"12.ogg": "daouzek",
"16.ogg": "c'hwezek",
- "U0030.ogg": "zero",
+ "U0030.ogg": "mann",
"U0031.ogg": "unan",
"U0032.ogg": "daou",
"U0033.ogg": "tri",
@@ -18,33 +18,33 @@
"acorn.ogg": "ur vezenn",
"actor.ogg": "un aktour",
"air_horn.ogg": "ur c'horn",
- "alarmclock.ogg": "ur munuter",
+ "alarmclock.ogg": "un dihuner",
"alligator.ogg": "un aligator",
"alphabet.ogg": "ul lizherenneg",
"anchor.ogg": "un eor",
"angel.ogg": "un ael",
"angry.ogg": "kounnaret",
- "animal.ogg": "ul loen",
+ "animal.ogg": "loened ",
"ankle.ogg": "an ibil-troad",
"ant.ogg": "ur verienenn",
"anteater.ogg": "ur merionaer",
"antelope.ogg": "un antilopenn",
"apple.ogg": "un aval",
"apple_tree.ogg": "ur wezenn avaloù",
"appliance.ogg": "un ardivink",
- "apricot.ogg": "un abrikezenn",
+ "apricot.ogg": "abrikez",
"arm.ogg": "ar vrec'h",
"armchair.ogg": "ur gador-vrec'h",
- "artichoke.ogg": "un artichaodenn",
+ "artichoke.ogg": "artichaod",
"artist.ogg": "un arzour",
- "asparagus.ogg": "un asperjezenn",
+ "asparagus.ogg": "asperjez",
"astronaut.ogg": "un egoraer",
"athlete.ogg": "ur sportour",
- "avocado.ogg": "un avoukezenn",
+ "avocado.ogg": "avoukez",
"ax.ogg": "ur vouc'hal",
"baby_bottle.ogg": "ur vured",
"back.ogg": "ar c'hein",
- "badge.ogg": "ur badj",
+ "badge.ogg": "ur vedalenn",
"bag.ogg": "ur sac'h",
"bait.ogg": "ur vouedenn",
"balance.ogg": "ur valañs",
@@ -62,7 +62,7 @@
"bathing_suit.ogg": "ur sae gouronkañ",
"bay.ogg": "un hugenn",
"beach.ogg": "un draezhenn",
- "bean.ogg": "ur favenn",
+ "bean.ogg": "fav",
"bear.ogg": "un arzh",
"beard.ogg": "ar barv",
"beat.ogg": "skeiñ",
@@ -78,7 +78,7 @@
"bench.ogg": "ur bank",
"bib.ogg": "un divabouzouer",
"big.ogg": "bras",
- "big_top.ogg": "un uhelenn",
+ "big_top.ogg": "ur babell",
"bike.ogg": "ur velo",
"bird.ogg": "un evn",
"bit.ogg": "un tamm",
@@ -97,7 +97,7 @@
"board.ogg": "ur plankenn",
"boat.ogg": "ur vag",
"boil.ogg": "birviñ",
- "bolt.ogg": "ur prenn",
+ "bolt.ogg": "ur boulon",
"bomb.ogg": "ur vombezenn",
"bone.ogg": "un askorn",
"book.ogg": "ul levr",
@@ -126,7 +126,7 @@
"bud.ogg": "ur vroñsenn",
"buffalo.ogg": "ur bizon",
"bug.ogg": "un amprevan",
- "bulb.ogg": "ur glogorenn",
+ "bulb.ogg": "ur glogorenn dredan",
"bull.ogg": "un tarv",
"bump.ogg": "ur bos",
"bun.ogg": "bara dous",
@@ -137,87 +137,87 @@
"butterfly.ogg": "ur valafenn",
"button.ogg": "ur bouton",
"cabbage.ogg": "ur gaolenn",
- "cabin.ogg": "ur gabinenn",
+ "cabin.ogg": "ur gabanenn",
"cacao.ogg": "kakao",
"cactus.ogg": "ur gaktuzenn",
"cage.ogg": "ur gaoued",
"cake.ogg": "ur wastell",
"call.ogg": "gervel",
"camel.ogg": "ur c'hañval",
- "camera.ogg": "ur c'hamera",
+ "camera.ogg": "ur poltreder",
"camp.ogg": "ar c'hampiñ",
- "can.ogg": "ur boubellenn",
+ "can.ogg": "boestoù-mir",
"canary.ogg": "ur c'hanari",
"candle.ogg": "ur c'houlaouenn",
"candy.ogg": "ur madig",
"cane.ogg": "ur vazh-kamm",
"canoe.ogg": "ur c'hanoe",
"canon.ogg": "ur c'hanol",
"canyon.ogg": "ur c'hanion",
- "cap.ogg": "ur boned",
- "cape.ogg": "ur c'habell",
+ "cap.ogg": "ur gasketenn",
+ "cape.ogg": "ur c'hab",
"car.ogg": "ur c'harr",
"carafe.ogg": "ur garafenn",
"card.ogg": "ur gartenn",
"carnival.ogg": "ar Meurlarjez",
"carpenter.ogg": "ur c'halvez",
"carpet.ogg": "un tapis",
"carrot.ogg": "ur garotezenn",
"cart.ogg": "ur garrigell",
- "cash.ogg": "pezhioù moneiz",
+ "cash.ogg": "arc'hant",
"castle.ogg": "ur c'hastell",
"cat.ogg": "ur c'hazh",
"cat_female.ogg": "ur gazhez",
"catch.ogg": "tapout",
"caterpillar.ogg": "ur viskoulenn",
"cauldron.ogg": "ur chaodouron",
"cauliflower.ogg": "ur gaolenn-fleur",
- "cave.ogg": "ur c'hav",
+ "cave.ogg": "ur c'hroc'h",
"cavern.ogg": "ur vougev",
"celery.ogg": "un achenn",
"centipede.ogg": "ur mil-kraban",
- "cereal.ogg": "edaj",
+ "cereal.ogg": "ed",
"chain.ogg": "ur chadenn",
"chair.ogg": "ur gador",
"chalk.ogg": "krei",
"chameleon.ogg": "ur c'hameleon",
"chandelier.ogg": "ur c'hantoller",
"chat.ogg": "flapiñ",
"cheek.ogg": "ur jod",
- "cheer.ogg": "strakal an daouarn",
+ "cheer.ogg": "youc'hal",
"cheese.ogg": "fourmaj",
- "chef.ogg": "ur chef",
+ "chef.ogg": "ur mestr-keginer",
"cherry.ogg": "kerez",
"chest.ogg": "ur c'hofr",
"chick.ogg": "ur pousin",
"chicken.ogg": "ur yarig",
"child.ogg": "ur bugel",
"chimney.ogg": "ur siminal",
"chimp.ogg": "ur chimpanze",
- "chin.ogg": "un elgezh",
+ "chin.ogg": "an elgezh",
"chocolate.ogg": "chokolad",
"chop.ogg": "troc'hañ",
"chores.ogg": "labourioù an ti",
"christmas.ogg": "an Nedeleg",
"cigar.ogg": "ur segalenn",
"circus.ogg": "ur sirk",
"city.ogg": "ur gêr",
- "clam.ogg": "ur bilorenn",
+ "clam.ogg": "ur c'hrogen Sant-Jakez",
"clap.ogg": "stlakal",
"class.ogg": "ur c'hlas",
- "claw.ogg": "skilf",
+ "claw.ogg": "ur skilf",
"clay.ogg": "pri",
"clean.ogg": "naetaat",
"cleaning_lady.ogg": "ur plac'h-ti",
- "cliff.ogg": "un tornaod",
+ "cliff.ogg": "un tarroz",
"climb.ogg": "pignat",
"clock.ogg": "un horolaj",
- "cloth.ogg": "dilhad",
- "clothes_hanger.ogg": "ur doug-dilhad",
+ "cloth.ogg": "gwiad",
+ "clothes_hanger.ogg": "un doug-dilhad",
"cloud.ogg": "ur goumoulenn",
"cloudy.ogg": "koumoulek",
"clover.ogg": "ur velchonenn",
- "clown.ogg": "furlukin",
+ "clown.ogg": "ur furlukin",
"coach.ogg": "ur gourdoner",
"coast.ogg": "un aod",
"coat.ogg": "ur vantell",
@@ -234,20 +234,20 @@
"cook.ogg": "keginañ",
"cookie.ogg": "kouign",
"cork.ogg": "ur stouv",
- "corn.ogg": "ed",
+ "corn.ogg": "maiz",
"couch.ogg": "ur gourvezvank",
"cough.ogg": "pasaat",
"couple.ogg": "ur c'houblad",
"cow.ogg": "ur vuoc'h",
"cowboy.ogg": "ur c'howboy",
"crab.ogg": "ur c'hrank",
"cradle.ogg": "ur gwele-babig",
- "craft.ogg": "ur vicher",
+ "craft.ogg": "labour dorn",
"crawl.ogg": "skrampañ",
"crazy.ogg": "foll",
- "creek.ogg": "un ouf",
+ "creek.ogg": "ur stêrig",
"crepe.ogg": "ur grampouezhenn",
- "crib.ogg": "ur c'havell",
+ "crib.ogg": "kevell",
"croak.ogg": "koagal",
"crocodile.ogg": "ur c'hrokodil",
"cross.ogg": "ur groaz",
@@ -258,26 +258,26 @@
"cry.ogg": "leñvañ",
"crystal.ogg": "ur strinkenn",
"cube.ogg": "ur c'hub",
- "cucumber.ogg": "ur gokombrezenn",
- "curtain.ogg": "ur rideoz",
+ "cucumber.ogg": "kokombrez",
+ "curtain.ogg": "rideozioù",
"cut.ogg": "troc'hañ",
"cute.ogg": "moutig",
"dad.ogg": "un tad",
- "daffodil.ogg": "ur foeonenn",
+ "daffodil.ogg": "roz-kamm",
"daisy.ogg": "un tommheolig",
"dam.ogg": "ur stankell",
"dance.ogg": "dañsal",
"dandelion.ogg": "ur c'hwervizon",
"dart_board.ogg": "ur c'hoari biroùigoù",
- "date_fruit.ogg": "un datezenn",
+ "date_fruit.ogg": "datez",
"deer.ogg": "ur c'harv",
"den.ogg": "un douarenn",
"desert.ogg": "un dezerzh",
"desk.ogg": "ur burev",
"dessert.ogg": "un dibenn-pred",
"diamond.ogg": "un diamant",
"dig.ogg": "kleuziañ",
- "dirt.ogg": "loustoni",
+ "dirt.ogg": "douar",
"dirty.ogg": "lous",
"dish.ogg": "ur plad",
"dishcloth.ogg": "un torch",
@@ -299,7 +299,7 @@
"drawer.ogg": "un diretenn",
"dream.ogg": "huñvreal",
"dress.ogg": "ur sae",
- "drink.ogg": "un evaj",
+ "drink.ogg": "evañ",
"drip.ogg": "un dakenn",
"drive.ogg": "bleniañ",
"drool.ogg": "babouzat",
@@ -311,7 +311,7 @@
"dwarf.ogg": "ur c'horr",
"eagle.ogg": "un erer",
"ear.ogg": "ur skouarn",
- "earth.ogg": "douar",
+ "earth.ogg": "an douar",
"eat.ogg": "debriñ",
"egg.ogg": "ur vi",
"eggplant.ogg": "ur verjinezenn",
@@ -337,13 +337,13 @@
"fat.ogg": "tev",
"faucet.ogg": "ur c'hog-dour",
"fawn.ogg": "ur menn-karv",
- "fear.ogg": "un aon",
+ "fear.ogg": "ar spont",
"feast.ogg": "ur fest",
"feather.ogg": "ur bluñvenn",
"feed.ogg": "magañ",
"femur.ogg": "gwerzhid ur vorzhed",
"fetch.ogg": "mont da gerc'hat",
- "fig.ogg": "ur figezenn",
+ "fig.ogg": "figez",
"fin.ogg": "un angell",
"find.ogg": "kavout",
"finger.ogg": "ur biz",
@@ -355,9 +355,9 @@
"fist.ogg": "un dorn",
"flacon.ogg": "ur flask",
"flag.ogg": "ur banniel",
- "flame.ogg": "flammenn",
+ "flame.ogg": "ur flammenn",
"flamingo.ogg": "ur flammeg",
- "flash.ogg": "ur gouloù godell",
+ "flash.ogg": "un etev tredan",
"flat.ogg": "ranntiez",
"flies.ogg": "kelien",
"float.ogg": "flotañ",
@@ -368,31 +368,31 @@
"fly.ogg": "nijal",
"foam.ogg": "spoum",
"foot.ogg": "un troad",
- "forest.ogg": "koadeg",
+ "forest.ogg": "ur c'hoad",
"fork.ogg": "ur fourchetezenn",
"fountain.ogg": "ur feunteun",
"fox.ogg": "ul louarn",
"freeze.ogg": "skornañ",
- "friend.ogg": "ur mignon",
+ "friend.ogg": "mignoned",
"fries.ogg": "fritez",
"frog.ogg": "ur ran",
"front.ogg": "dirak",
- "fruit.ogg": "ur frouezhenn",
- "fudge.ogg": "ur garamellenn",
+ "fruit.ogg": "frouezh",
+ "fudge.ogg": "karamell",
"full.ogg": "leun",
"fur.ogg": "ur feur",
"game.ogg": "ur c'hoari",
"garage.ogg": "ur c'harrdi",
- "garden.ogg": "liorzh",
+ "garden.ogg": "ul liorzh",
"garlic.ogg": "ur penn-kignen",
"gem.ogg": "ur maen-sked",
"giant.ogg": "ur ramz",
"gift.ogg": "ur prof",
"giraffe.ogg": "ur jirafenn",
"girl.ogg": "ur plac'h",
"glass.ogg": "ur werenn",
"glasses.ogg": "ur re lunedoù",
- "glove.ogg": "ur vanegenn",
+ "glove.ogg": "manegoù",
"glue.ogg": "peg",
"gnome.ogg": "ur c'horrigan",
"goat.ogg": "ur c'havr",
@@ -403,7 +403,7 @@
"grain.ogg": "greun",
"grandmother.ogg": "ur vamm-gozh",
"grape.ogg": "rezin",
- "grapefruit.ogg": "ur bampelenn",
+ "grapefruit.ogg": "pampel",
"grass.ogg": "geot",
"grave.ogg": "ur bez",
"gray.ogg": "griz",
@@ -417,7 +417,7 @@
"gum.ogg": "gom-chaokat",
"hair.ogg": "blev",
"hair_dryer.ogg": "ur sec'her-blev",
- "half.ogg": "hanter",
+ "half.ogg": "an hanter",
"ham.ogg": "morzhed-hoc'h",
"hamburger.ogg": "un hamburger",
"hammer.ogg": "ur morzhol",
@@ -430,7 +430,7 @@
"hay.ogg": "foenn",
"head.ogg": "ur penn",
"hear.ogg": "klevout",
- "heat.ogg": "ur wrez",
+ "heat.ogg": "ar wrez",
"hedge.ogg": "ur c'harzh",
"hedgehog.ogg": "un avalaouer",
"heel.ogg": "ur seul",
@@ -448,7 +448,7 @@
"hole.ogg": "un toull",
"home.ogg": "ar gêr",
"hook.ogg": "ur c'hrog",
- "hop.ogg": "lammig",
+ "hop.ogg": "dilammat",
"horse.ogg": "ul loen-kezeg",
"hose.ogg": "ur gorzenn",
"hospital.ogg": "un ospital",
@@ -472,32 +472,32 @@
"ink.ogg": "ankr",
"island.ogg": "un enezenn",
"jacket.ogg": "ur porpant",
- "jaguar.ogg": "jagoar",
+ "jaguar.ogg": "ur jagoar",
"jam.ogg": "koñfitur",
"jay.ogg": "ur gegin",
"jelly.ogg": "kaotigell",
"jellyfish.ogg": "ur vorglaouenn",
"jewel.ogg": "ur bravig",
- "job.ogg": "ur vicher",
+ "job.ogg": "micherioù",
"jockey.ogg": "ur joke",
"jog.ogg": "trotadenn",
- "joy.ogg": "ur joa",
+ "joy.ogg": "plijadur",
"judge.ogg": "ur barner",
"judo.ogg": "judo",
- "juggler.ogg": "ur jangler",
+ "juggler.ogg": "ur janglerez",
"juice.ogg": "jug",
"jump.ogg": "lammat",
"kangaroo.ogg": "ur c'hangourou",
- "keel.ogg": "ur c'hein",
- "kernel.ogg": "un alamandezenn",
+ "keel.ogg": "kilhoù",
+ "kernel.ogg": "un maen",
"keyboard.ogg": "ur c'hlavier",
"kimono.ogg": "ur c'himono",
"king.ogg": "ur roue",
"kiss.ogg": "pokat",
"kitchen.ogg": "ur gegin",
"kite.ogg": "ur sarpant-nij",
"kitten.ogg": "ur c'hazhig",
- "kiwi.ogg": "ur giwienn",
+ "kiwi.ogg": "kiwi",
"knee.ogg": "ur glin",
"kneel.ogg": "daoulinañ",
"knife.ogg": "ur gountell",
@@ -513,40 +513,40 @@
"lamb.ogg": "un oan",
"lamp.ogg": "ul lamp",
"land.ogg": "an douar",
- "lane.ogg": "un alez",
+ "lane.ogg": "un hent",
"lap.ogg": "ur varlenn",
"lasso.ogg": "ul lasso",
"laugh.ogg": "c'hoarzhin",
"lava.ogg": "maen teuz",
"lawn.ogg": "ul letonenn",
"lawyer.ogg": "un avokad",
- "leaf.ogg": "un delienn",
+ "leaf.ogg": "delioù",
"ledge.ogg": "ur rizenn",
"leek.ogg": "ur bourenn",
"left.ogg": "kleiz",
"leg.ogg": "ur c'har",
"lemon.ogg": "ur sitroñs",
- "lemonade.ogg": "dour pik-pik",
+ "lemonade.ogg": "dour-sitroñs",
"lemur.ogg": "ul lemur",
"leopard.ogg": "ul loupard",
"lettuce.ogg": "ur saladenn",
- "librarian.ogg": "ul levraoueger",
+ "librarian.ogg": "ul levraouegerez",
"lick.ogg": "lipat",
"lid.ogg": "ur golo",
"lift.ogg": "sevel",
"light.ogg": "ar gouloù",
"lighthouse.ogg": "un tour-tan",
"lightning.ogg": "ar c'hurun",
"lilac.ogg": "ul lireuenn",
"lime.ogg": "ur sitroñs glas",
- "line.ogg": "ul linenn",
+ "line.ogg": "linennoù",
"link.ogg": "ul liamm",
"lion.ogg": "ul leon",
"lion_cub.ogg": "ul leonig",
- "lip.ogg": "ur vuzell",
+ "lip.ogg": "muzelloù",
"liquid.ogg": "dourennek",
"lizard.ogg": "ur glazard",
- "lobster.ogg": "ur legestr",
+ "lobster.ogg": "ul legestr",
"log.ogg": "ur geuneudenn",
"look.ogg": "sellout",
"lunch.ogg": "merenn",
@@ -556,32 +556,32 @@
"magnifying_glass.ogg": "ur werenn-greskiñ",
"magpie.ogg": "ur big",
"mail.ogg": "ul lizher",
- "man.ogg": "tud",
+ "man.ogg": "ur gwaz",
"mane.ogg": "ur moue",
- "mango.ogg": "ur vangezenn",
+ "mango.ogg": "mangez",
"map.ogg": "ur gartenn",
"maple.ogg": "ur skavenn-wrac'h",
- "marble.ogg": "ur ganetenn",
+ "marble.ogg": "kanetennoù",
"mashed_potatoes.ogg": "yod patatez",
"mask.ogg": "ur maskl",
"mast.ogg": "ur wern",
"mat.ogg": "un tamm tapis",
- "match.ogg": "ur c'hrogad",
+ "match.ogg": "alumetez",
"mate.ogg": "ur c'hamalad",
"mattress.ogg": "ur vatarasenn",
"mauve.ogg": "limestra",
- "meal.ogg": "pred",
+ "meal.ogg": "ur pred",
"meat.ogg": "kig",
"mechanic.ogg": "ur mekaniker",
"medal.ogg": "ur vedalenn",
"meet.ogg": "kejañ",
- "melon.ogg": "ur meloñs",
+ "melon.ogg": "meloñs",
"merry-go-round.ogg": "ur manej",
"mice.ogg": "logod",
"microphone.ogg": "ur mikrofon",
"milk.ogg": "laezh",
"mill.ogg": "ur vilin",
- "mimosa.ogg": "ur wezenn-vimoza",
+ "mimosa.ogg": "mimoza",
"mirror.ogg": "ur melezour",
"mixer.ogg": "ur frikerez",
"mole.ogg": "ur c'hoz",
@@ -601,9 +601,9 @@
"mud.ogg": "fank",
"mug.ogg": "un tas bras",
"mule.ogg": "ur vulez",
- "muscle.ogg": "ur c'higenn",
+ "muscle.ogg": "kigennoù",
"mushroom.ogg": "ur c'habell-touseg",
- "music.ogg": "ur sonerezh",
+ "music.ogg": "sonerezh",
"musician.ogg": "ur soner",
"naked.ogg": "noazh",
"nap.ogg": "morgousket",
@@ -619,15 +619,15 @@
"nose.ogg": "ur fri",
"nostril.ogg": "ur fronell",
"notebook.ogg": "ur c'harned",
- "number.ogg": "un niver",
+ "number.ogg": "niveroù",
"nun.ogg": "ur seurez",
"nurse.ogg": "ur glañvdiourez",
"nurse_male.ogg": "ur c'hlañvdiour",
- "nut.ogg": "ur graoñenn",
- "oar.ogg": "ur roeñv",
+ "nut.ogg": "kakaouetez",
+ "oar.ogg": "roeñvioù",
"ocean.ogg": "ur meurvor",
"office.ogg": "un ofis",
- "olive.ogg": "un olivezenn",
+ "olive.ogg": "olivez",
"on.ogg": "war",
"onion.ogg": "ur penn-ognon",
"open.ogg": "digor",
@@ -642,28 +642,28 @@
"oyster.ogg": "un istrenn",
"pacifier.ogg": "ur chutenn",
"page.ogg": "ur bajenn",
- "pair.ogg": "ur c'houblad",
+ "pair.ogg": "ur re",
"pajamas.ogg": "ur pijama",
"pal.ogg": "ur c'homper",
"palm_tree.ogg": "ur wezenn-balm",
"pan.ogg": "ur baelon",
"panda.ogg": "ur panda",
"panther.ogg": "ur banterenn",
- "panties.ogg": "ur slip",
+ "panties.ogg": "brageier dindan",
"pants.ogg": "ur re vragoù",
- "papaya.ogg": "ur bapaiezenn",
+ "papaya.ogg": "bapaiez",
"paper.ogg": "paper",
"parachute.ogg": "un harz-lamm",
"parakeet.ogg": "ur c'hrakperoked",
"parrot.ogg": "ur peroked",
"patch.ogg": "un dres",
"path.ogg": "ur wenojenn",
"paw.ogg": "ur pav",
- "pea.ogg": "ur bizenn",
- "peach.ogg": "ur bechenn",
+ "pea.ogg": "piz",
+ "peach.ogg": "pechez",
"peacock.ogg": "ur paun",
"peak.ogg": "ur c'hrec'h",
- "pear.ogg": "ur berenn",
+ "pear.ogg": "per",
"pearl.ogg": "ur berlezenn",
"peck.ogg": "beketa",
"pedal.ogg": "ur bedalenn",
@@ -674,15 +674,15 @@
"people.ogg": "tud",
"pepper.ogg": "pepr",
"peppers.ogg": "pebr-Spagn",
- "pet.ogg": "ul loen-ti",
+ "pet.ogg": "loened-ti",
"petal.ogg": "ur betalenn",
"phone.ogg": "ur pellgomzer",
"piano.ogg": "ur piano",
- "picture.ogg": "ur skeudenn",
+ "picture.ogg": "un daolenn",
"pie.ogg": "un dartezenn",
"pig.ogg": "ur pemoc'h",
"pigeon.ogg": "ur pichon",
- "pill.ogg": "ur bilulenn",
+ "pill.ogg": "pilulennoù",
"pillow.ogg": "ur goubenner",
"pilot.ogg": "un nijer",
"pine.ogg": "ur wezenn-bin",
@@ -695,27 +695,27 @@
"pizza.ogg": "ur pizza",
"plane.ogg": "ur c'harr-nij",
"planet.ogg": "ur blanedenn",
- "plant.ogg": "ur blantenn",
+ "plant.ogg": "plant",
"plate.ogg": "un asied",
"play.ogg": "c'hoari",
"pliers.ogg": "piñsetoù",
"plow.ogg": "arat",
- "plum.ogg": "ur brunenn",
+ "plum.ogg": "prun",
"plumber.ogg": "ur plomer",
"pocket.ogg": "ur c'hodell",
- "pod.ogg": "ur glorenn",
+ "pod.ogg": "klorennoù",
"pole.ogg": "ur peul",
"police.ogg": "un archer",
- "pompon.ogg": "ur bichourell",
+ "pompon.ogg": "pichourelloù",
"pond.ogg": "ur poull-dour",
"pony.ogg": "ur pone",
- "pool.ogg": "ur poull",
+ "pool.ogg": "ur poull-dour",
"popcorn.ogg": "popkorn",
"pope.ogg": "ur pab",
"porthole.ogg": "ul lomber",
- "post.ogg": "un ti-post",
+ "post.ogg": "boest al lizhiri",
"pot.ogg": "ur pod",
- "potato.ogg": "ur batatezenn",
+ "potato.ogg": "patatez",
"pounce.ogg": "lammat",
"president.ogg": "ur prezidant",
"pretty.ogg": "koant",
@@ -744,7 +744,7 @@
"radish.ogg": "un irvinenn ruz",
"raft.ogg": "ur radell",
"rag.ogg": "ur bilhenn",
- "rage.ogg": "ur gounnar",
+ "rage.ogg": "ar gounnar",
"rain.ogg": "glav",
"raincoat.ogg": "ur vantell c'hlav",
"rake.ogg": "ur rastell",
@@ -758,7 +758,7 @@
"reptile.ogg": "ur stlejvil",
"rhinoceros.ogg": "ur frikorneg",
"rice.ogg": "riz",
- "ride.ogg": "mont war varc'h",
+ "ride.ogg": "mont war velo",
"rifle.ogg": "ur fuzuilh",
"right.ogg": "dehoù",
"rip.ogg": "regiñ",
@@ -783,7 +783,7 @@
"run.ogg": "redek",
"sad.ogg": "trist",
"saddle.ogg": "un dibr",
- "sail.ogg": "ur ouel",
+ "sail.ogg": "bageal",
"sailor.ogg": "ur martolod",
"salamander.ogg": "ur sourd",
"salmon.ogg": "un eog",
@@ -810,9 +810,9 @@
"sea.ogg": "ar mor",
"seat.ogg": "ur sez",
"see.ogg": "gwelout",
- "seed.ogg": "un hadenn",
+ "seed.ogg": "had",
"shadow.ogg": "ur skeud",
- "shake.ogg": "krenañ",
+ "shake.ogg": "hejañ",
"shark.ogg": "ur rinkin",
"shave.ogg": "aotennañ",
"shed.ogg": "ur c'houdorenn",
@@ -826,36 +826,36 @@
"shop.ogg": "ur stal",
"shore.ogg": "un aod",
"short.ogg": "ur re vragoù berr",
- "shovel.ogg": "ur bal",
+ "shovel.ogg": "ur balig",
"shower.ogg": "ur strinkerez",
"shrimp.ogg": "ur chevrenn",
"shrub.ogg": "ur vrousgwezenn",
"shut.ogg": "serret",
- "shutter.ogg": "ur stalaf",
+ "shutter.ogg": "stalafioù",
"sick.ogg": "klañv",
"sidewalk.ogg": "ur riblenn",
- "sign.ogg": "ur skritell",
+ "sign.ogg": "skritelloù",
"sing.ogg": "kanañ",
"sink.ogg": "un dar",
"sip.ogg": "lapat",
"sister.ogg": "ur c'hoar",
"sit.ogg": "azezañ",
- "skate.ogg": "plankenn-ruilh",
+ "skate.ogg": "ur plankenn-ruilh",
"skeleton.ogg": "un eskeled",
"ski.ogg": "ski",
"skimmer.ogg": "ul loa-sil",
- "skin.ogg": "ur c'hroc'hen",
+ "skin.ogg": "ar c'hroc'hen",
"skirt.ogg": "ur vrozh",
"skunk.ogg": "ur pudask",
"sky.ogg": "an oabl",
- "slam.ogg": "stlakal",
+ "slam.ogg": "kas er baner",
"sled.ogg": "ul luj",
"sleep.ogg": "kousket",
"sleeve.ogg": "ur milgin",
"sleigh.ogg": "ur stlejell",
- "slide.ogg": "un diapozitiv",
+ "slide.ogg": "ur ruz-revr",
"slim.ogg": "moan",
- "slime.ogg": "ul lec'hid",
+ "slime.ogg": "glaour",
"slippers.ogg": "kofignonoù",
"slope.ogg": "un diribin",
"sloppy.ogg": "digempenn ",
@@ -879,68 +879,68 @@
"sock.ogg": "ul loer",
"soldier.ogg": "ur soudard",
"sole.ogg": "ul leizenn",
- "sole_shoe.ogg": "ur sol-votez",
+ "sole_shoe.ogg": "solioù-botez",
"son.ogg": "ur mab",
"soup.ogg": "soubenn",
- "spade.ogg": "ur rañv",
+ "spade.ogg": "ur bal",
"spaghetti.ogg": "spageti",
"spark.ogg": "ur fulenn",
"sparrow.ogg": "ur golvan",
"spatula.ogg": "ur spanell",
"speak.ogg": "komz",
"spear.ogg": "ur goaf",
- "spice.ogg": "spis",
+ "spice.ogg": "spisoù",
"spider.ogg": "ur gevnidenn",
"spider_web.ogg": "ur gwiad-kevnid",
"spike.ogg": "un draen",
"spill.ogg": "fuilhañ",
- "spinach.ogg": "ur binochezenn",
+ "spinach.ogg": "pinochez",
"spine.ogg": "ul livenn-gein",
"spinning_top.ogg": "un toumpi",
"splash.ogg": "strinkañ",
- "splatter.ogg": "strinkañ",
+ "splatter.ogg": "ur strinkadenn",
"sponge.ogg": "ur spoueenn",
"spool.ogg": "ur ganell",
"spoon.ogg": "ul loa",
"sport.ogg": "sport",
- "spot.ogg": "ur saotr",
- "spray.ogg": "glizhenniñ",
- "spread.ogg": "skignañ",
+ "spot.ogg": "pikoù",
+ "spray.ogg": "flistrañ",
+ "spread.ogg": "ledañ",
"spring.ogg": "lammat",
"spring_season.ogg": "an nevez-amzer",
"sprinkle.ogg": "poultrenniñ",
- "square.ogg": "ur c'harrez",
- "squash.ogg": "ur potiron",
+ "square.ogg": "karrez",
+ "squash.ogg": "koulourdrez",
"squat.ogg": "kluchañ",
"squid.ogg": "ur stivelleg",
"squirrel.ogg": "ur razh-koad",
- "squirt.ogg": "ur flistradenn",
+ "squirt.ogg": "ur flistrer",
"stack.ogg": "ur bern",
"stage.ogg": "ul leurenn",
"staircase.ogg": "derezioù",
"stamp.ogg": "un timbr",
- "stand.ogg": "ur stand",
+ "stand.ogg": "chom a-sav",
"star.ogg": "ur steredenn",
"stare.ogg": "parañ e selloù",
"starfish.ogg": "ur steredenn-vor",
- "steam.ogg": "ur c'hlizhenn",
+ "steam.ogg": "an aezhenn",
"steep.ogg": "sonn",
"steeple.ogg": "ur c'hloc'hdi",
- "stem.ogg": "ur c'hef ",
+ "stem.ogg": "ur gorzenn",
"step.ogg": "un derez",
- "stew.ogg": "ragoud",
+ "stew.ogg": "ur ragoud",
"stick.ogg": "ur vriñsenn",
"sting.ogg": "flemmañ",
"stinky.ogg": "flaerius",
"stitch.ogg": "gwriat",
"stomach.ogg": "ur stomok",
- "stone.ogg": "ur maen",
- "stop.ogg": "paouez",
+ "stone.ogg": "mein",
+ "stop.ogg": "herzel",
"store.ogg": "ur stal",
"stove.ogg": "ur geginerez",
"straight.ogg": "eeun",
"strainer.ogg": "ur sil",
- "straw.ogg": "plouz",
+ "straw.ogg": "plouzennoù",
"strawberry.ogg": "ur sivienn",
"stream.ogg": "ur red-dour",
"street.ogg": "ur straed",
@@ -963,14 +963,14 @@
"swim.ogg": "neuial",
"table.ogg": "un daol",
"tablecloth.ogg": "ul lienn-daol",
- "tadpole.ogg": "ur penndolog",
+ "tadpole.ogg": "penndologed",
"tag.ogg": "un diketenn",
"tail.ogg": "ul lost",
"tall.ogg": "bras",
"tape_measure.ogg": "ur metr-seizenn",
"taxi.ogg": "un taksi",
"teach.ogg": "kelenn",
- "teacher.ogg": "ur c'helenner",
+ "teacher.ogg": "ur gelennerez",
"tear.ogg": "drailhañ",
"teddy.ogg": "un nanarzh",
"teeth.ogg": "an dent",
@@ -991,7 +991,7 @@
"ticket.ogg": "un tiked",
"tiger.ogg": "un tigr",
"time.ogg": "an amzer",
- "tin.ogg": "ur vouest-mir",
+ "tin.ogg": "ur bok",
"tire.ogg": "ur pneu",
"tired.ogg": "skuizh",
"tissue.ogg": "paper-torch",
@@ -1003,26 +1003,26 @@
"tomatoe.ogg": "un domatezenn",
"tongs.ogg": "ur wask",
"tongue.ogg": "un teod",
- "tool.ogg": "ur beñveg",
+ "tool.ogg": "benvegoù",
"top.ogg": "al lein",
- "torch.ogg": "un flammerenn",
+ "torch.ogg": "ur flammerenn",
"touch.ogg": "touchañ",
"towel.ogg": "ur serviedenn",
"toy.ogg": "ur c'hoariell",
"trail.ogg": "ur riboul",
"train.ogg": "un tren",
"train_station.ogg": "ur porzh-houarn",
"trap.ogg": "un trap",
"trash.ogg": "al lastez",
- "tray.ogg": "ur pladenn",
- "treat.ogg": "chervad",
+ "tray.ogg": "ur bladenn",
+ "treat.ogg": "madigoù",
"tree.ogg": "ur wezenn",
"triangle.ogg": "un tric'horn",
"tribe.ogg": "ur meuriad",
"trip.ogg": "ur veaj",
"truck.ogg": "ur c'harr-samm",
- "tube.ogg": "un duellenn",
- "tulip.ogg": "un dulipezenn",
+ "tube.ogg": "ruz-muzelloù",
+ "tulip.ogg": "tulipez",
"tune.ogg": "un ton",
"turkey.ogg": "ur yar indez",
"turnip.ogg": "un irvinenn",
@@ -1034,20 +1034,20 @@
"under.ogg": "dindan",
"uniform.ogg": "ul lifre",
"van.ogg": "ur sammorell",
- "vapor.ogg": "un aezhenn",
+ "vapor.ogg": "aezhenn",
"vase.ogg": "ul lestr",
"vegetable.ogg": "legumaj",
- "vein.ogg": "ur wazhienn",
+ "vein.ogg": "gwazhied",
"verdure.ogg": "glasvez",
"vest.ogg": "ur chupenn",
"vet.ogg": "ur mezeg loened",
"viper.ogg": "ur wiber",
"vowel.ogg": "ur vogalenn",
"vulture.ogg": "ur gup",
- "wag.ogg": "meskañ",
+ "wag.ogg": "fistoulat",
"walk.ogg": "bale",
"wall.ogg": "ur voger",
- "walnut.ogg": "ur graonenn",
+ "walnut.ogg": "kraoñ",
"wart.ogg": "ur wenaenn",
"wash.ogg": "gwalc'hiñ",
"wasp.ogg": "ur wespedenn",
@@ -1068,7 +1068,7 @@
"wife.ogg": "ur wreg",
"wig.ogg": "ur berukenn",
"win.ogg": "gounit",
- "wind.ogg": "an avel",
+ "wind.ogg": "avel",
"window.ogg": "ur prenestr",
"window_glass.ogg": "ur werenn-brenestr",
"wing.ogg": "un askell",
@@ -1079,14 +1079,14 @@
"word.ogg": "ur ger",
"worker.ogg": "ul labourer",
"world.ogg": "ar bed",
- "wreath.ogg": "ur garlantezenn",
+ "wreath.ogg": "ur gurunenn",
"wrench.ogg": "ur gwask",
"wrist.ogg": "un arzorn",
"write.ogg": "skrivañ",
"yellow.ogg": "melen",
"yogurt.ogg": "ur yaourt",
- "yum.ogg": "nenam",
+ "yum.ogg": "menam",
"zebra.ogg": "ur roudenneg",
"zipper.ogg": "ur serr-prim",
"zoo.ogg": "ur zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-ca.json b/src/activities/lang/resource/content-ca.json
--- a/src/activities/lang/resource/content-ca.json
+++ b/src/activities/lang/resource/content-ca.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "cremallera",
"zoo.ogg": "zoològic"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-ca@valencia.json b/src/activities/lang/resource/content-ca@valencia.json
--- a/src/activities/lang/resource/content-ca@valencia.json
+++ b/src/activities/lang/resource/content-ca@valencia.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "cremallera",
"zoo.ogg": "zoològic"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-cs.json b/src/activities/lang/resource/content-cs.json
deleted file mode 100644
--- a/src/activities/lang/resource/content-cs.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "alphabet.ogg": "abeceda",
- "angel.ogg": "anděl"
-}
\ No newline at end of file
diff --git a/src/activities/lang/resource/content-de.json b/src/activities/lang/resource/content-de.json
--- a/src/activities/lang/resource/content-de.json
+++ b/src/activities/lang/resource/content-de.json
@@ -1073,4 +1073,4 @@
"zebra.ogg": "das Zebra",
"zipper.ogg": "der Reißverschluss",
"zoo.ogg": "der Zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-el.json b/src/activities/lang/resource/content-el.json
--- a/src/activities/lang/resource/content-el.json
+++ b/src/activities/lang/resource/content-el.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "ζέβρα",
"zipper.ogg": "φερμουάρ",
"zoo.ogg": "ζωολογικός κήπος"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-en_GB.json b/src/activities/lang/resource/content-en_GB.json
--- a/src/activities/lang/resource/content-en_GB.json
+++ b/src/activities/lang/resource/content-en_GB.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "zipper",
"zoo.ogg": "zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-es.json b/src/activities/lang/resource/content-es.json
--- a/src/activities/lang/resource/content-es.json
+++ b/src/activities/lang/resource/content-es.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "cebra",
"zipper.ogg": "cremallera",
"zoo.ogg": "zoológico"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-fr.json b/src/activities/lang/resource/content-fr.json
--- a/src/activities/lang/resource/content-fr.json
+++ b/src/activities/lang/resource/content-fr.json
@@ -1076,4 +1076,4 @@
"zebra.ogg": "un zèbre",
"zipper.ogg": "une fermeture éclair",
"zoo.ogg": "un zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-ga.json b/src/activities/lang/resource/content-ga.json
--- a/src/activities/lang/resource/content-ga.json
+++ b/src/activities/lang/resource/content-ga.json
@@ -1080,4 +1080,4 @@
"zebra.ogg": "séabra",
"zipper.ogg": "zip",
"zoo.ogg": "zú"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-gd.json b/src/activities/lang/resource/content-gd.json
--- a/src/activities/lang/resource/content-gd.json
+++ b/src/activities/lang/resource/content-gd.json
@@ -561,4 +561,4 @@
"write.ogg": "a' sgrìobhadh",
"yum.ogg": "blasta",
"zoo.ogg": "sutha beag"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-gl.json b/src/activities/lang/resource/content-gl.json
--- a/src/activities/lang/resource/content-gl.json
+++ b/src/activities/lang/resource/content-gl.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "cebra",
"zipper.ogg": "cremalleira",
"zoo.ogg": "zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-hu.json b/src/activities/lang/resource/content-hu.json
--- a/src/activities/lang/resource/content-hu.json
+++ b/src/activities/lang/resource/content-hu.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "cipzár",
"zoo.ogg": "állatkert"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-id.json b/src/activities/lang/resource/content-id.json
--- a/src/activities/lang/resource/content-id.json
+++ b/src/activities/lang/resource/content-id.json
@@ -558,7 +558,7 @@
"melon.ogg": "melon",
"merry-go-round.ogg": "komedi putar",
"mice.ogg": "tikus",
- "microphone.ogg": "mikropon",
+ "microphone.ogg": "mikrofon",
"milk.ogg": "susu",
"mirror.ogg": "cermin",
"mixer.ogg": "alat pengaduk listrik",
@@ -1049,4 +1049,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "ritsleting",
"zoo.ogg": "kebun binatang"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-it.json b/src/activities/lang/resource/content-it.json
--- a/src/activities/lang/resource/content-it.json
+++ b/src/activities/lang/resource/content-it.json
@@ -13,447 +13,1080 @@
"U0037.ogg": "sette",
"U0038.ogg": "otto",
"U0039.ogg": "nove",
- "alligator.ogg": "l'alligatore",
- "anchor.ogg": "l'ancora",
- "animal.ogg": "gli animali",
- "athlete.ogg": "l'atleta",
- "back.ogg": "la schiena",
- "badge.ogg": "la medaglia",
- "bag.ogg": "lo zaino",
- "balance.ogg": "la bilancia",
- "ball.ogg": "la palla",
- "ballet.ogg": "il balletto",
- "bank.ogg": "la banca",
+ "accountant.ogg": "contabile",
+ "ache.ogg": "dolore",
+ "acorn.ogg": "ghianda",
+ "actor.ogg": "attore",
+ "air_horn.ogg": "tromba",
+ "alarmclock.ogg": "sveglia",
+ "alligator.ogg": "alligatore",
+ "alphabet.ogg": "alfabeto",
+ "anchor.ogg": "ancora",
+ "angel.ogg": "angelo",
+ "angry.ogg": "furiosa",
+ "animal.ogg": "animale",
+ "ankle.ogg": "caviglia",
+ "ant.ogg": "formica",
+ "anteater.ogg": "formichiere",
+ "antelope.ogg": "antilope",
+ "apple.ogg": "mela",
+ "apple_tree.ogg": "melo",
+ "appliance.ogg": "elettrodomestico",
+ "apricot.ogg": "albicocca",
+ "arm.ogg": "braccio",
+ "armchair.ogg": "poltrona",
+ "artichoke.ogg": "carciofo",
+ "artist.ogg": "artista",
+ "asparagus.ogg": "asparago",
+ "astronaut.ogg": "astronauta",
+ "athlete.ogg": "atleta",
+ "avocado.ogg": "avocado",
+ "ax.ogg": "ascia",
+ "baby_bottle.ogg": "biberon",
+ "back.ogg": "schiena",
+ "badge.ogg": "medaglia",
+ "bag.ogg": "zaino",
+ "bait.ogg": "esca",
+ "balance.ogg": "bilancia",
+ "bald.ogg": "calvo",
+ "ball.ogg": "palla",
+ "ball_of_yarn.ogg": "gomitolo",
+ "ball_soccer.ogg": "pallone da calcio",
+ "ballet.ogg": "balletto",
+ "bank.ogg": "banca",
+ "banker_female.ogg": "bancaria",
"bark.ogg": "abbaiare",
- "barn.ogg": "il fienile",
- "bat.ogg": "il pipistrello",
- "bath.ogg": "la vasca da bagno",
- "bay.ogg": "la baia",
- "beach.ogg": "la spiaggia",
- "bed.ogg": "il letto",
- "bee.ogg": "l'ape",
- "beetle.ogg": "lo scarabeo",
+ "barn.ogg": "fienile",
+ "bat.ogg": "pipistrello",
+ "bath.ogg": "vasca",
+ "bathing_suit.ogg": "costume",
+ "bay.ogg": "baia",
+ "beach.ogg": "spiaggia",
+ "bean.ogg": "fagioli",
+ "bear.ogg": "orso",
+ "beard.ogg": "barba",
+ "beat.ogg": "picchiare",
+ "beaver.ogg": "castoro",
+ "bed.ogg": "letto",
+ "bedroom.ogg": "stanza da letto",
+ "bee.ogg": "ape",
+ "beetle.ogg": "scarabeo",
"beg.ogg": "pregare",
- "bench.ogg": "la panchina",
- "bib.ogg": "il bavaglino",
- "bike.ogg": "la bicicletta",
- "bird.ogg": "l'uccello",
- "bit.ogg": "il bocconcino",
+ "behind.ogg": "dietro",
+ "bell.ogg": "campana",
+ "belly.ogg": "pancia",
+ "bench.ogg": "panchina",
+ "bib.ogg": "bavaglino",
+ "big.ogg": "grande",
+ "big_top.ogg": "tendone",
+ "bike.ogg": "bicicletta",
+ "bird.ogg": "uccello",
+ "bit.ogg": "morso",
"bite.ogg": "mordere",
"black.ogg": "nero",
- "block.ogg": "il cubo",
+ "blackberry.ogg": "mora",
+ "blackbird.ogg": "merlo",
+ "blade.ogg": "lama",
+ "blind.ogg": "cieco",
+ "blink.ogg": "ammiccare",
+ "block.ogg": "cubo",
+ "blond.ogg": "biondo",
"blue.ogg": "blu",
- "board.ogg": "il cartello",
- "boat.ogg": "la barca",
+ "blueberry.ogg": "mirtillo",
+ "blush.ogg": "arrossita",
+ "board.ogg": "cartello",
+ "boat.ogg": "barca",
"boil.ogg": "bollire",
- "bomb.ogg": "la bomba",
- "bone.ogg": "l'osso",
- "book.ogg": "il libro",
- "box.ogg": "la scatola",
- "boy.ogg": "il ragazzo",
- "braid.ogg": "la treccia",
- "brain.ogg": "il cervello",
- "branch.ogg": "il ramo",
- "bread.ogg": "il pane",
- "brick.ogg": "i mattoni",
- "bride.ogg": "la sposa",
- "bridge.ogg": "il ponte",
- "brother.ogg": "il fratello",
+ "bolt.ogg": "bullone",
+ "bomb.ogg": "bomba",
+ "bone.ogg": "osso",
+ "book.ogg": "libro",
+ "bookcase.ogg": "libreria",
+ "bottom.ogg": "sedere",
+ "box.ogg": "scatola",
+ "boxer.ogg": "pugile",
+ "boy.ogg": "ragazzo",
+ "braid.ogg": "treccia",
+ "brain.ogg": "cervello",
+ "branch.ogg": "ramo",
+ "bread.ogg": "pane",
+ "break.ogg": "rompere",
+ "breast.ogg": "seno",
+ "brick.ogg": "mattoni",
+ "bricklayer.ogg": "muratore",
+ "bride.ogg": "sposa",
+ "bridge.ogg": "ponte",
+ "bright.ogg": "luminoso",
+ "broccoli.ogg": "broccoli",
+ "brother.ogg": "fratello",
"brown.ogg": "marrone",
- "brush.ogg": "il pennello",
- "bud.ogg": "la gemma",
- "bug.ogg": "l'insetto",
- "bump.ogg": "il bernoccolo",
- "bun.ogg": "il panino",
- "bush.ogg": "il cespuglio",
- "cage.ogg": "la gabbia",
- "cake.ogg": "il dolce",
+ "brush.ogg": "pennello",
+ "bubble.ogg": "bolla",
+ "bucket.ogg": "secchio",
+ "bud.ogg": "germoglio",
+ "buffalo.ogg": "bufalo",
+ "bug.ogg": "insetto",
+ "bulb.ogg": "lampadina",
+ "bull.ogg": "toro",
+ "bump.ogg": "bernoccolo",
+ "bun.ogg": "panino",
+ "bus.ogg": "autobus",
+ "bush.ogg": "cespuglio",
+ "butcher.ogg": "macellaio",
+ "butter.ogg": "burro",
+ "butterfly.ogg": "farfalla",
+ "button.ogg": "bottone",
+ "cabbage.ogg": "cavolo",
+ "cabin.ogg": "baita",
+ "cacao.ogg": "cacao",
+ "cactus.ogg": "cactus",
+ "cage.ogg": "gabbia",
+ "cake.ogg": "dolce",
"call.ogg": "chiamare",
- "camel.ogg": "il cammello",
- "can.ogg": "i barattoli",
- "candle.ogg": "la candela",
- "candy.ogg": "la caramella",
- "cane.ogg": "il bastone",
- "canoe.ogg": "la canoa",
- "cap.ogg": "il cappellino",
- "cape.ogg": "il mantello",
- "car.ogg": "l'automobile",
- "card.ogg": "la cartolina",
- "carrot.ogg": "la carota",
- "cart.ogg": "il carrello",
- "cash.ogg": "i soldi",
- "castle.ogg": "il castello",
- "cat.ogg": "il gatto",
+ "camel.ogg": "cammello",
+ "camera.ogg": "fotocamera",
+ "camp.ogg": "accampamento",
+ "can.ogg": "barattolo",
+ "canary.ogg": "canarino",
+ "candle.ogg": "candela",
+ "candy.ogg": "caramella",
+ "cane.ogg": "bastone",
+ "canoe.ogg": "canoa",
+ "canon.ogg": "cannone",
+ "canyon.ogg": "canyon",
+ "cap.ogg": "cappellino",
+ "cape.ogg": "cappa",
+ "car.ogg": "automobile",
+ "carafe.ogg": "caraffa",
+ "card.ogg": "cartolina",
+ "carnival.ogg": "carnevale",
+ "carpenter.ogg": "carpentiere",
+ "carpet.ogg": "tappeto",
+ "carrot.ogg": "carota",
+ "cart.ogg": "carrello",
+ "cash.ogg": "soldi",
+ "castle.ogg": "castello",
+ "cat.ogg": "gatto",
+ "cat_female.ogg": "gatta",
"catch.ogg": "pescare",
- "cave.ogg": "la grotta",
- "centipede.ogg": "il centipede",
- "chair.ogg": "la sedia",
- "chalk.ogg": "il gesso",
+ "caterpillar.ogg": "bruco",
+ "cauldron.ogg": "calderone",
+ "cauliflower.ogg": "cavolfiore",
+ "cave.ogg": "grotta",
+ "cavern.ogg": "caverna",
+ "celery.ogg": "sedano",
+ "centipede.ogg": "millepiedi",
+ "cereal.ogg": "cereale",
+ "chain.ogg": "catena",
+ "chair.ogg": "sedia",
+ "chalk.ogg": "gesso",
+ "chameleon.ogg": "camaleonte",
+ "chandelier.ogg": "candeliere",
"chat.ogg": "bisbigliare",
- "cheese.ogg": "il formaggio",
- "cherry.ogg": "le ciliegie",
- "chest.ogg": "il forziere",
- "chick.ogg": "il pulcino",
- "chicken.ogg": "la gallina",
- "child.ogg": "il bambino",
- "chimp.ogg": "la scimmia",
- "chin.ogg": "il mento",
- "chocolate.ogg": "il cioccolato",
+ "cheek.ogg": "guancia",
+ "cheer.ogg": "incitamento",
+ "cheese.ogg": "formaggio",
+ "chef.ogg": "cuoco",
+ "cherry.ogg": "ciliegia",
+ "chest.ogg": "baule",
+ "chick.ogg": "pulcino",
+ "chicken.ogg": "gallina",
+ "child.ogg": "bambino",
+ "chimney.ogg": "comignolo",
+ "chimp.ogg": "scimpanzé",
+ "chin.ogg": "mento",
+ "chocolate.ogg": "cioccolato",
"chop.ogg": "affettare",
- "clam.ogg": "la conchiglia",
- "class.ogg": "i compiti",
- "claw.ogg": "gli artigli",
- "clay.ogg": "l'argilla",
- "cliff.ogg": "il burrone",
- "clock.ogg": "la sveglia",
- "cloth.ogg": "il tessuto",
- "cloud.ogg": "la nuvola",
- "clown.ogg": "il pagliaccio",
- "coach.ogg": "l'allenatrice",
- "coat.ogg": "il cappotto",
- "coin.ogg": "le monete",
- "comb.ogg": "il pettine",
+ "chores.ogg": "faccende domestiche",
+ "christmas.ogg": "natale",
+ "cigar.ogg": "sigaro",
+ "circus.ogg": "circo",
+ "city.ogg": "città",
+ "clam.ogg": "conchiglia",
+ "clap.ogg": "battere le mani",
+ "class.ogg": "lezione",
+ "claw.ogg": "artiglio",
+ "clay.ogg": "argilla",
+ "clean.ogg": "pulire",
+ "cleaning_lady.ogg": "donna delle pulizie",
+ "cliff.ogg": "burrone",
+ "climb.ogg": "scalata",
+ "clock.ogg": "orologio",
+ "cloth.ogg": "tessuto",
+ "clothes_hanger.ogg": "gruccia",
+ "cloud.ogg": "nuvola",
+ "cloudy.ogg": "nuvoloso",
+ "clover.ogg": "quadrifoglio",
+ "clown.ogg": "pagliaccio",
+ "coach.ogg": "allenatrice",
+ "coast.ogg": "costa",
+ "coat.ogg": "cappotto",
+ "cobra.ogg": "cobra",
+ "coconut.ogg": "noce di cocco",
+ "cod.ogg": "merluzzo",
+ "coffee.ogg": "caffè",
+ "coin.ogg": "monete",
+ "cold.ogg": "freddo",
+ "color.ogg": "colore",
+ "colt.ogg": "puledro",
+ "comb.ogg": "pettine",
+ "cone.ogg": "cono",
"cook.ogg": "cucinare",
- "cookie.ogg": "i biscotti",
- "corn.ogg": "la pannocchia",
- "couch.ogg": "il divano",
- "cow.ogg": "la mucca",
- "cowboy.ogg": "il cowboy",
- "crab.ogg": "il granchio",
+ "cookie.ogg": "biscotto",
+ "cork.ogg": "tappo",
+ "corn.ogg": "granturco",
+ "couch.ogg": "divano",
+ "cough.ogg": "tossire",
+ "couple.ogg": "coppia",
+ "cow.ogg": "mucca",
+ "cowboy.ogg": "cowboy",
+ "crab.ogg": "granchio",
+ "cradle.ogg": "culla",
+ "craft.ogg": "artigianato",
"crawl.ogg": "gattonare",
- "crib.ogg": "la culla",
+ "crazy.ogg": "pazzo",
+ "creek.ogg": "torrente",
+ "crepe.ogg": "crespella",
+ "crib.ogg": "lettino",
"croak.ogg": "gracidare",
- "crocodile.ogg": "il coccodrillo",
- "crow.ogg": "il corvo",
- "crown.ogg": "la corona",
- "crumb.ogg": "la briciola",
- "crust.ogg": "la crosta",
+ "crocodile.ogg": "coccodrillo",
+ "cross.ogg": "croce",
+ "crow.ogg": "corvo",
+ "crown.ogg": "corona",
+ "crumb.ogg": "briciola",
+ "crust.ogg": "crosta",
"cry.ogg": "piangere",
- "cube.ogg": "il cubo",
- "cucumber.ogg": "il cetriolo",
+ "crystal.ogg": "cristallo",
+ "cube.ogg": "cubo",
+ "cucumber.ogg": "cetriolo",
+ "curtain.ogg": "tenda",
"cut.ogg": "tagliare",
- "dad.ogg": "il papà",
- "den.ogg": "la tana",
- "desk.ogg": "la scrivania",
+ "cute.ogg": "carina",
+ "dad.ogg": "papà",
+ "daffodil.ogg": "narciso giallo",
+ "daisy.ogg": "margherita",
+ "dam.ogg": "diga",
+ "dance.ogg": "danza",
+ "dandelion.ogg": "dente di leone",
+ "dart_board.ogg": "bersaglio",
+ "date_fruit.ogg": "dattero",
+ "deer.ogg": "cervo",
+ "den.ogg": "tana",
+ "desert.ogg": "deserto",
+ "desk.ogg": "scrivania",
+ "dessert.ogg": "dessert",
+ "diamond.ogg": "diamante",
"dig.ogg": "scavare",
+ "dirt.ogg": "sporco",
"dirty.ogg": "sporco",
- "dish.ogg": "la zuppiera",
- "dog.ogg": "il cane",
- "door.ogg": "la porta",
- "dragon.ogg": "il drago",
+ "dish.ogg": "zuppiera",
+ "dishcloth.ogg": "strofinaccio",
+ "dive.ogg": "immersione",
+ "doctor.ogg": "medico",
+ "doe.ogg": "daino",
+ "dog.ogg": "cane",
+ "doll.ogg": "bambola",
+ "dolphin.ogg": "delfino",
+ "domino.ogg": "domino",
+ "door.ogg": "porta",
+ "doormat.ogg": "tappetino",
+ "dot.ogg": "punto",
+ "doughnut.ogg": "ciambella",
+ "dove.ogg": "colomba",
+ "dragon.ogg": "drago",
+ "dragonfly.ogg": "libellula",
"draw.ogg": "disegnare",
+ "drawer.ogg": "cassetto",
"dream.ogg": "sognare",
- "dress.ogg": "il vestito",
- "drink.ogg": "il caffè",
- "drive.ogg": "guida",
- "drool.ogg": "sbava",
- "drum.ogg": "il tamburo",
- "duck.ogg": "l'anatra",
- "dune.ogg": "la duna",
- "ear.ogg": "l'orecchio",
- "earth.ogg": "la terra",
+ "dress.ogg": "vestito",
+ "drink.ogg": "bevanda",
+ "drip.ogg": "goccia",
+ "drive.ogg": "guidare",
+ "drool.ogg": "sbavare",
+ "drum.ogg": "tamburo",
+ "dry.ogg": "asciugare",
+ "duck.ogg": "anatra",
+ "duck_mother.ogg": "mamma oca",
+ "dune.ogg": "duna",
+ "dwarf.ogg": "nano",
+ "eagle.ogg": "aquila",
+ "ear.ogg": "orecchio",
+ "earth.ogg": "terra",
"eat.ogg": "mangiare",
- "face.ogg": "la faccia",
- "fan.ogg": "il ventilatore",
- "farm.ogg": "la fattoria",
+ "egg.ogg": "uovo",
+ "eggplant.ogg": "melanzana",
+ "elbow.ogg": "gomito",
+ "electrician.ogg": "elettricista",
+ "elk.ogg": "alce",
+ "empty.ogg": "vuoto",
+ "engine.ogg": "motore",
+ "engineer.ogg": "ingegnere",
+ "eraser.ogg": "gomma",
+ "explore.ogg": "esplorazione",
+ "eyelash.ogg": "ciglio",
+ "eyes.ogg": "occhi",
+ "face.ogg": "viso",
+ "fair.ogg": "luna park",
+ "fairy.ogg": "fata",
+ "fall.ogg": "cadere",
+ "fall_season.ogg": "stagione autunnale",
+ "family.ogg": "famiglia",
+ "fan.ogg": "ventilatore",
+ "farm.ogg": "fattoria",
+ "farmer.ogg": "contadino",
+ "fat.ogg": "grasso",
+ "faucet.ogg": "rubinetto",
+ "fawn.ogg": "cerbiatto",
+ "fear.ogg": "paura",
+ "feast.ogg": "banchetto",
+ "feather.ogg": "piuma",
+ "feed.ogg": "nutrire",
+ "femur.ogg": "femore",
"fetch.ogg": "riportare",
- "fin.ogg": "la pinna",
+ "fig.ogg": "fico",
+ "fin.ogg": "pinna",
"find.ogg": "trovare",
- "fire.ogg": "il fuoco",
- "fish.ogg": "il pesce",
- "fist.ogg": "il pugno",
- "flag.ogg": "la bandiera",
- "flame.ogg": "la fiamma",
- "flash.ogg": "la torcia elettrica",
- "flies.ogg": "la mosca",
+ "finger.ogg": "dito",
+ "fire.ogg": "fuoco",
+ "fire_extinguisher.ogg": "estintore",
+ "fireman.ogg": "pompiere",
+ "fish.ogg": "pesce",
+ "fisherman.ogg": "pescatore",
+ "fist.ogg": "pugno",
+ "flacon.ogg": "flacone",
+ "flag.ogg": "bandiera",
+ "flame.ogg": "fiamma",
+ "flamingo.ogg": "fenicottero",
+ "flash.ogg": "torcia elettrica",
+ "flat.ogg": "pianura",
+ "flies.ogg": "mosca",
"float.ogg": "galleggiare",
- "flour.ogg": "la farina",
- "flower.ogg": "il fiore",
- "flute.ogg": "il flauto",
+ "flour.ogg": "farina",
+ "flower.ogg": "fiore",
+ "fluff.ogg": "lanugine",
+ "flute.ogg": "flauto",
"fly.ogg": "volare",
- "foot.ogg": "il piede",
- "fork.ogg": "la forchetta",
- "fountain.ogg": "la fontana",
- "fox.ogg": "la volpe",
+ "foam.ogg": "schiuma",
+ "foot.ogg": "piede",
+ "forest.ogg": "foresta",
+ "fork.ogg": "forchetta",
+ "fountain.ogg": "fontana",
+ "fox.ogg": "volpe",
"freeze.ogg": "congelare",
- "friend.ogg": "gli amici",
- "frog.ogg": "la rana",
- "fruit.ogg": "la frutta",
- "fur.ogg": "la pelliccia",
- "game.ogg": "il giocattolo",
- "garden.ogg": "il giardino",
- "gift.ogg": "il regalo",
- "giraffe.ogg": "la giraffa",
- "girl.ogg": "la ragazza",
- "glass.ogg": "il bicchiere",
- "glove.ogg": "i guanti",
- "glue.ogg": "la colla",
- "gnome.ogg": "lo gnomo",
- "goat.ogg": "la capra",
- "grass.ogg": "l'erba",
- "grave.ogg": "la tomba",
+ "friend.ogg": "amici",
+ "fries.ogg": "patatine fritte",
+ "frog.ogg": "rana",
+ "front.ogg": "davanti",
+ "fruit.ogg": "frutta",
+ "fudge.ogg": "fudge",
+ "full.ogg": "pieno",
+ "fur.ogg": "pelliccia",
+ "game.ogg": "giocattolo",
+ "garage.ogg": "garage",
+ "garden.ogg": "giardino",
+ "garlic.ogg": "aglio",
+ "gem.ogg": "gemma",
+ "giant.ogg": "gigante",
+ "gift.ogg": "regalo",
+ "giraffe.ogg": "giraffa",
+ "girl.ogg": "ragazza",
+ "glass.ogg": "bicchiere",
+ "glasses.ogg": "occhiali",
+ "glove.ogg": "guanto",
+ "glue.ogg": "colla",
+ "gnome.ogg": "gnomo",
+ "goat.ogg": "capra",
+ "golden.ogg": "dorato",
+ "golf.ogg": "golf",
+ "goose.ogg": "oca",
+ "gorilla.ogg": "gorilla",
+ "grain.ogg": "grano",
+ "grandmother.ogg": "nonna",
+ "grape.ogg": "uva",
+ "grapefruit.ogg": "pompelmo",
+ "grass.ogg": "erba",
+ "grave.ogg": "tomba",
"gray.ogg": "grigio",
"green.ogg": "verde",
- "grin.ogg": "il ghigno",
- "ground.ogg": "la terra",
+ "grill.ogg": "griglia",
+ "grin.ogg": "ghigno",
+ "ground.ogg": "suolo",
"growl.ogg": "ringhiare",
- "gum.ogg": "la gomma da masticare",
- "hair.ogg": "i capelli",
- "hand.ogg": "la mano",
- "hat.ogg": "il cappello",
+ "guignol.ogg": "burattino",
+ "guinea_pig.ogg": "cavia",
+ "gum.ogg": "gomma da masticare",
+ "hair.ogg": "capelli",
+ "hair_dryer.ogg": "asciugacapelli",
+ "half.ogg": "metà",
+ "ham.ogg": "gomma da masticare",
+ "hamburger.ogg": "hamburger",
+ "hammer.ogg": "martello",
+ "hand.ogg": "mano",
+ "handlebar.ogg": "manubrio",
+ "happy.ogg": "felice",
+ "harp.ogg": "arpa",
+ "hat.ogg": "cappello",
"hatch.ogg": "schiudere",
- "hay.ogg": "la paglia",
- "head.ogg": "la testa",
+ "hay.ogg": "paglia",
+ "head.ogg": "testa",
"hear.ogg": "ascoltare",
- "heat.ogg": "il caldo",
- "hedge.ogg": "la siepe",
- "hen.ogg": "la gallina",
- "herd.ogg": "il gregge",
- "hip.ogg": "i fianchi",
- "hole.ogg": "il buco",
- "home.ogg": "la casa",
- "hook.ogg": "l'amo",
- "hound.ogg": "il segugio",
+ "heat.ogg": "caldo",
+ "hedge.ogg": "siepe",
+ "hedgehog.ogg": "riccio",
+ "heel.ogg": "tacco",
+ "helmet.ogg": "casco",
+ "hen.ogg": "chioccia",
+ "herd.ogg": "gregge",
+ "high.ogg": "alto",
+ "hike.ogg": "escursione",
+ "hill.ogg": "collina",
+ "hip.ogg": "fianchi",
+ "hippopotamus.ogg": "ippopotamo",
+ "hit.ogg": "colpo",
+ "hive.ogg": "alveare",
+ "hockey.ogg": "hockey",
+ "hole.ogg": "buco",
+ "home.ogg": "casa",
+ "hook.ogg": "amo",
+ "hop.ogg": "saltellare",
+ "horse.ogg": "cavallo",
+ "hose.ogg": "tubo",
+ "hospital.ogg": "ospedale",
+ "hot.ogg": "caldo",
+ "hot_dog.ogg": "hot dog",
+ "hound.ogg": "segugio",
+ "house.ogg": "casa",
"howl.ogg": "ululare",
"hug.ogg": "abbracciare",
- "hunter.ogg": "il cacciatore",
- "hut.ogg": "la capanna",
- "ice.ogg": "il ghiaccio",
- "ink.ogg": "l'inchiostro",
- "jewel.ogg": "il gioiello",
+ "huge.ogg": "enorme",
+ "hummingbird.ogg": "colibrì",
+ "hunchbacked.ogg": "gobbo",
+ "hunter.ogg": "cacciatore",
+ "husband.ogg": "padre",
+ "hut.ogg": "capanna",
+ "hyena.ogg": "iena",
+ "ice.ogg": "ghiaccio",
+ "iceberg.ogg": "iceberg",
+ "iguana.ogg": "iguana",
+ "ill.ogg": "malato",
+ "ink.ogg": "inchiostro",
+ "island.ogg": "isola",
+ "jacket.ogg": "giacca",
+ "jaguar.ogg": "giaguaro",
+ "jam.ogg": "marmellata",
+ "jay.ogg": "ghiandaia",
+ "jelly.ogg": "gelatina",
+ "jellyfish.ogg": "medusa",
+ "jewel.ogg": "gioiello",
+ "job.ogg": "lavoro",
+ "jockey.ogg": "fantino",
"jog.ogg": "correre",
- "judge.ogg": "il giudice",
- "juice.ogg": "il succo d'arancia",
+ "joy.ogg": "gioia",
+ "judge.ogg": "giudice",
+ "judo.ogg": "judo",
+ "juggler.ogg": "giocoliere",
+ "juice.ogg": "succo",
"jump.ogg": "saltare",
- "kite.ogg": "l'aquilone",
- "knee.ogg": "il ginocchio",
- "knife.ogg": "il coltello",
- "knight.ogg": "il cavaliere",
+ "kangaroo.ogg": "canguro",
+ "keel.ogg": "crollo",
+ "kernel.ogg": "nocciolo",
+ "keyboard.ogg": "tastiera",
+ "kimono.ogg": "kimono",
+ "king.ogg": "re",
+ "kiss.ogg": "baciare",
+ "kitchen.ogg": "cucina",
+ "kite.ogg": "aquilone",
+ "kitten.ogg": "gattino",
+ "kiwi.ogg": "kiwi",
+ "knee.ogg": "ginocchio",
+ "kneel.ogg": "inginocchiarsi",
+ "knife.ogg": "coltello",
+ "knight.ogg": "cavaliere",
"knit.ogg": "lavorare ai ferri",
- "knot.ogg": "il nodo",
- "lake.ogg": "il lago",
- "lamb.ogg": "l'agnello",
- "lamp.ogg": "la lampada",
- "land.ogg": "la terra",
- "lane.ogg": "la strada",
- "lap.ogg": "il grembo",
- "lawn.ogg": "il prato",
+ "knot.ogg": "nodo",
+ "koala.ogg": "koala",
+ "lad.ogg": "ragazzo",
+ "lady.ogg": "signora",
+ "ladybug.ogg": "coccinella",
+ "lake.ogg": "lago",
+ "lama.ogg": "lama",
+ "lamb.ogg": "agnello",
+ "lamp.ogg": "lampada",
+ "land.ogg": "terreno",
+ "lane.ogg": "strada",
+ "lap.ogg": "grembo",
+ "lasso.ogg": "lazo",
+ "laugh.ogg": "ridere",
+ "lava.ogg": "lava",
+ "lawn.ogg": "prato",
+ "lawyer.ogg": "avvocato",
+ "leaf.ogg": "foglia",
+ "ledge.ogg": "sporgenza",
+ "leek.ogg": "porro",
+ "left.ogg": "sinistra",
+ "leg.ogg": "gamba",
+ "lemon.ogg": "limone",
+ "lemonade.ogg": "limonata",
+ "lemur.ogg": "lemure",
+ "leopard.ogg": "leopardo",
+ "lettuce.ogg": "lattuga",
+ "librarian.ogg": "bilbiotecaria",
"lick.ogg": "leccare",
- "lid.ogg": "il coperchio",
- "lift.ogg": "sollevare i pesi",
- "light.ogg": "la luce",
- "lime.ogg": "il lime",
- "link.ogg": "l'anello",
- "lip.ogg": "le labbra",
- "log.ogg": "i ceppi",
+ "lid.ogg": "coperchio",
+ "lift.ogg": "sollevamento pesi",
+ "light.ogg": "lampada",
+ "lighthouse.ogg": "faro",
+ "lightning.ogg": "fulmine",
+ "lilac.ogg": "lillà",
+ "lime.ogg": "lime",
+ "line.ogg": "linea",
+ "link.ogg": "anello",
+ "lion.ogg": "leone",
+ "lion_cub.ogg": "cucciolo di leone",
+ "lip.ogg": "labbra",
+ "liquid.ogg": "liquido",
+ "lizard.ogg": "lucertola",
+ "lobster.ogg": "astice",
+ "log.ogg": "tronchi",
"look.ogg": "guardare",
- "lunch.ogg": "la merenda",
- "mad.ogg": "la follia",
- "mane.ogg": "la criniera",
- "map.ogg": "la mappa",
- "mask.ogg": "la maschera da sub",
- "mat.ogg": "il tappetino",
- "match.ogg": "i fiammiferi",
+ "lunch.ogg": "pranzo",
+ "mad.ogg": "follia",
+ "magic.ogg": "magico",
+ "magnet.ogg": "magnete",
+ "magnifying_glass.ogg": "lente d'ingrandimento",
+ "magpie.ogg": "gazza",
+ "mail.ogg": "posta",
+ "man.ogg": "uomo",
+ "mane.ogg": "criniera",
+ "mango.ogg": "mango",
+ "map.ogg": "mappa",
+ "maple.ogg": "acero",
+ "marble.ogg": "biglia",
+ "mashed_potatoes.ogg": "purè di patate",
+ "mask.ogg": "maschera",
+ "mast.ogg": "albero",
+ "mat.ogg": "zerbino",
+ "match.ogg": "fiammifero",
+ "mate.ogg": "compagno",
+ "mattress.ogg": "materasso",
+ "mauve.ogg": "malva",
+ "meal.ogg": "pasto",
+ "meat.ogg": "carne",
+ "mechanic.ogg": "meccanico",
+ "medal.ogg": "medaglia",
"meet.ogg": "incontrare",
- "mice.ogg": "i topi",
- "mole.ogg": "la talpa",
- "mosquito.ogg": "la zanzara",
- "mouth.ogg": "la bocca",
- "mud.ogg": "il fango",
- "mug.ogg": "la tazza",
- "mule.ogg": "il mulo",
- "mushroom.ogg": "il fungo",
- "nap.ogg": "pisolare",
- "neck.ogg": "il collo",
- "nest.ogg": "il nido",
- "net.ogg": "la rete",
- "night.ogg": "la notte",
- "nose.ogg": "il naso",
- "nut.ogg": "l'arachide",
- "oar.ogg": "i remi",
- "ocean.ogg": "l'oceano",
+ "melon.ogg": "melone",
+ "merry-go-round.ogg": "giostra",
+ "mice.ogg": "topi",
+ "microphone.ogg": "microfono",
+ "milk.ogg": "latte",
+ "mill.ogg": "mulino",
+ "mimosa.ogg": "mimosa",
+ "mirror.ogg": "specchio",
+ "mixer.ogg": "robot da cucina",
+ "mole.ogg": "talpa",
+ "mom.ogg": "mamma",
+ "moon.ogg": "luna",
+ "moose.ogg": "alce",
+ "mop.ogg": "mocio",
+ "mosque.ogg": "moschea",
+ "mosquito.ogg": "zanzara",
+ "mother.ogg": "madre",
+ "motorcycle.ogg": "motocicletta",
+ "mountain.ogg": "montagna",
+ "mouse.ogg": "topo",
+ "mouth.ogg": "bocca",
+ "movie.ogg": "film",
+ "mower.ogg": "tosaerba",
+ "mud.ogg": "fango",
+ "mug.ogg": "tazza",
+ "mule.ogg": "mulo",
+ "muscle.ogg": "muscolo",
+ "mushroom.ogg": "fungo",
+ "music.ogg": "musica",
+ "musician.ogg": "musicista",
+ "naked.ogg": "nudo",
+ "nap.ogg": "appisolarsi",
+ "navel.ogg": "ombelico",
+ "neck.ogg": "collo",
+ "necklace.ogg": "collana",
+ "needle.ogg": "ago",
+ "nest.ogg": "nido",
+ "net.ogg": "rete",
+ "newspaper.ogg": "giornale",
+ "night.ogg": "notte",
+ "nightgown.ogg": "camicia da notte",
+ "nose.ogg": "naso",
+ "nostril.ogg": "narice",
+ "notebook.ogg": "taccuino",
+ "number.ogg": "numero",
+ "nun.ogg": "suora",
+ "nurse.ogg": "infermiera",
+ "nurse_male.ogg": "infermiere",
+ "nut.ogg": "arachide",
+ "oar.ogg": "remi",
+ "ocean.ogg": "oceano",
+ "office.ogg": "ufficio",
+ "olive.ogg": "oliva",
+ "on.ogg": "sopra",
+ "onion.ogg": "cipolla",
+ "open.ogg": "aperto",
+ "opossum.ogg": "opossum",
"orange-color.ogg": "arancione",
- "orange.ogg": "l'arancio",
- "owl.ogg": "il gufo",
- "ox.ogg": "il bue",
- "page.ogg": "la pagina",
+ "orange.ogg": "arancia",
+ "orchid.ogg": "orchidea",
+ "ostrich.ogg": "struzzo",
+ "otter.ogg": "lontra",
+ "owl.ogg": "gufo",
+ "ox.ogg": "bue",
+ "oyster.ogg": "ostrica",
+ "pacifier.ogg": "ciuccio",
+ "page.ogg": "pagina",
"pair.ogg": "un paio",
- "pan.ogg": "la padella",
- "patch.ogg": "la toppa",
- "path.ogg": "il sentiero",
- "peach.ogg": "la pesca",
+ "pajamas.ogg": "pigiama",
+ "pal.ogg": "amico",
+ "palm_tree.ogg": "palma",
+ "pan.ogg": "padella",
+ "panda.ogg": "panda",
+ "panther.ogg": "pantera",
+ "panties.ogg": "mutande",
+ "pants.ogg": "pantaloni",
+ "papaya.ogg": "papaya",
+ "paper.ogg": "carta",
+ "parachute.ogg": "paracadute",
+ "parakeet.ogg": "parrocchetto",
+ "parrot.ogg": "pappagallo",
+ "patch.ogg": "toppa",
+ "path.ogg": "sentiero",
+ "paw.ogg": "impronta",
+ "pea.ogg": "piselli",
+ "peach.ogg": "pesca",
+ "peacock.ogg": "pavone",
+ "peak.ogg": "picco",
+ "pear.ogg": "pera",
+ "pearl.ogg": "perla",
"peck.ogg": "beccare",
- "pen.ogg": "la penna",
- "pencil.ogg": "la matita",
- "picture.ogg": "il quadro",
- "pig.ogg": "il maiale",
- "pine.ogg": "il pino",
+ "pedal.ogg": "pedale",
+ "pelican.ogg": "pellicano",
+ "pen.ogg": "penna",
+ "pencil.ogg": "matita",
+ "peony.ogg": "peonia",
+ "people.ogg": "persona",
+ "pepper.ogg": "peperone",
+ "peppers.ogg": "peperoni",
+ "pet.ogg": "animale domestico",
+ "petal.ogg": "petalo",
+ "phone.ogg": "telefono",
+ "piano.ogg": "pianoforte",
+ "picture.ogg": "quadro",
+ "pie.ogg": "torta",
+ "pig.ogg": "maiale",
+ "pigeon.ogg": "piccione",
+ "pill.ogg": "pillola",
+ "pillow.ogg": "cuscino",
+ "pilot.ogg": "pilota",
+ "pine.ogg": "pino",
+ "pine_cone.ogg": "pigna",
"pink.ogg": "rosa",
- "plane.ogg": "l'aeroplano",
- "plant.ogg": "la pianta",
- "plate.ogg": "il piatto",
+ "pip.ogg": "seme",
+ "pipe.ogg": "pipa",
+ "piranha.ogg": "piranha",
+ "pirate.ogg": "pirata",
+ "pizza.ogg": "pizza",
+ "plane.ogg": "aeroplano",
+ "planet.ogg": "pianeta",
+ "plant.ogg": "pianta",
+ "plate.ogg": "piatto",
"play.ogg": "giocare",
- "plow.ogg": "dissodare",
- "plum.ogg": "la prugna",
- "pole.ogg": "il palo",
- "pool.ogg": "la piscina",
- "pope.ogg": "il papa",
- "pot.ogg": "la pentola",
- "price.ogg": "il prezzo",
- "prince.ogg": "il principe",
- "princess.ogg": "la principessa",
- "prize.ogg": "il premio",
- "puppy.ogg": "il cucciolo",
+ "pliers.ogg": "pinza",
+ "plow.ogg": "arare",
+ "plum.ogg": "prugna",
+ "plumber.ogg": "idraulico",
+ "pocket.ogg": "tasca",
+ "pod.ogg": "baccello",
+ "pole.ogg": "palo",
+ "police.ogg": "polizia",
+ "pompon.ogg": "pompon",
+ "pond.ogg": "stagno",
+ "pony.ogg": "pony",
+ "pool.ogg": "piscina",
+ "popcorn.ogg": "popcorn",
+ "pope.ogg": "papa",
+ "porthole.ogg": "oblò",
+ "post.ogg": "buca della posta",
+ "pot.ogg": "pentola",
+ "potato.ogg": "patata",
+ "pounce.ogg": "saltare addosso",
+ "president.ogg": "presidente",
+ "pretty.ogg": "bella",
+ "price.ogg": "prezzo",
+ "priest.ogg": "prete",
+ "prince.ogg": "principe",
+ "princess.ogg": "principessa",
+ "prison.ogg": "prigione",
+ "prisoner.ogg": "prigioniero",
+ "prize.ogg": "premio",
+ "pug.ogg": "carlino",
+ "pull.ogg": "tirare",
+ "pullover.ogg": "maglione",
+ "pumpkin.ogg": "zucca",
+ "puppy.ogg": "cucciolo",
+ "pyramid.ogg": "piramide",
"quarrel.ogg": "litigare",
- "queen.ogg": "la regina",
- "question.ogg": "la domanda",
- "quilt.ogg": "la trapunta",
+ "queen.ogg": "regina",
+ "question.ogg": "domanda",
+ "quilt.ogg": "trapunta",
"quiz.ogg": "quiz",
- "rag.ogg": "lo strofinaccio",
- "rage.ogg": "la rabbia",
- "rake.ogg": "il rastrello",
- "ramp.ogg": "la rampa",
- "rat.ogg": "il ratto",
+ "rabbit.ogg": "coniglio",
+ "rabbit_baby.ogg": "coniglietto",
+ "race.ogg": "corsa",
+ "radio.ogg": "radio",
+ "radish.ogg": "ravanello",
+ "raft.ogg": "zattera",
+ "rag.ogg": "straccio",
+ "rage.ogg": "rabbia",
+ "rain.ogg": "pioggia",
+ "raincoat.ogg": "impermeabile",
+ "rake.ogg": "rastrello",
+ "ramp.ogg": "rampa",
+ "ran.ogg": "correre",
+ "raspberry.ogg": "lampone",
+ "rat.ogg": "ratto",
+ "razor.ogg": "rasoio",
"read.ogg": "leggere",
"red.ogg": "rosso",
- "rice.ogg": "il riso",
+ "reptile.ogg": "rettile",
+ "rhinoceros.ogg": "rinoceronte",
+ "rice.ogg": "riso",
"ride.ogg": "andare in bicicletta",
- "rip.ogg": "strappato",
- "rock.ogg": "la roccia",
- "roof.ogg": "il tetto",
- "rope.ogg": "la corda",
- "rose.ogg": "la rosa",
- "rug.ogg": "il tappeto",
- "run.ogg": "corre",
- "sad.ogg": "la tristezza",
- "sail.ogg": "la vela",
- "sand.ogg": "la sabbia",
- "sandwich.ogg": "il panino",
- "sauce.ogg": "la salsa",
- "scale.ogg": "la bilancia",
- "scar.ogg": "la cicatrice",
- "scarf.ogg": "la sciarpa",
- "school.ogg": "la scuola",
- "science.ogg": "la scienza",
+ "rifle.ogg": "fucile",
+ "right.ogg": "destra",
+ "rip.ogg": "strappare",
+ "rise.ogg": "crescere",
+ "river.ogg": "fiume",
+ "road.ogg": "strada",
+ "roast.ogg": "arrosto",
+ "robe.ogg": "mantello",
+ "robot.ogg": "robot",
+ "rock.ogg": "roccia",
+ "rocket.ogg": "razzo",
+ "rolling_pin.ogg": "mattarello",
+ "roof.ogg": "tetto",
+ "room.ogg": "stanza",
+ "root.ogg": "radice",
+ "rope.ogg": "corda",
+ "rose.ogg": "rosa",
+ "round.ogg": "rotondo",
+ "rowing.ogg": "canottaggio",
+ "royal.ogg": "reale",
+ "rug.ogg": "tappeto",
+ "run.ogg": "correre",
+ "sad.ogg": "tristezza",
+ "saddle.ogg": "sella",
+ "sail.ogg": "vela",
+ "sailor.ogg": "marinaio",
+ "salamander.ogg": "salamandra",
+ "salmon.ogg": "salmone",
+ "sand.ogg": "sabbia",
+ "sandals.ogg": "sandali",
+ "sandwich.ogg": "panino",
+ "sash.ogg": "fascia",
+ "sauce.ogg": "salsa",
+ "sausage.ogg": "salsiccia",
+ "scale.ogg": "bilancia",
+ "scar.ogg": "cicatrice",
+ "scare.ogg": "spaventare",
+ "scarf.ogg": "sciarpa",
+ "school.ogg": "scuola",
+ "school_bag.ogg": "cartella",
+ "science.ogg": "scienza",
+ "scissors.ogg": "forbici",
+ "scorpion.ogg": "scorpione",
+ "scratch.ogg": "graffiare",
"scream.ogg": "urlare",
- "screw.ogg": "la vite",
- "scribble.ogg": "lo scarabocchio",
- "seat.ogg": "la sedia a dondolo",
+ "screw.ogg": "vite",
+ "screwdriver.ogg": "cacciavite",
+ "scribble.ogg": "scarabocchiare",
+ "sea.ogg": "mare",
+ "seat.ogg": "sedia a dondolo",
"see.ogg": "vedere",
- "seed.ogg": "il seme",
- "shark.ogg": "il pescecane",
- "shelf.ogg": "lo scaffale",
- "shell.ogg": "la conchiglia",
- "ship.ogg": "la nave",
- "shirt.ogg": "la camicia",
- "shoe.ogg": "la scarpa",
- "shop.ogg": "il negozio",
- "shore.ogg": "il bagnasciuga",
- "short.ogg": "i pantaloni corti",
- "shower.ogg": "la doccia",
- "shrimp.ogg": "il gambero",
- "sign.ogg": "il cartello",
+ "seed.ogg": "seme",
+ "shadow.ogg": "ombra",
+ "shake.ogg": "scuotere",
+ "shark.ogg": "squalo",
+ "shave.ogg": "tosare",
+ "shed.ogg": "capanna",
+ "sheep.ogg": "pecora",
+ "shelf.ogg": "mensola",
+ "shell.ogg": "conchiglia",
+ "ship.ogg": "nave",
+ "shirt.ogg": "camicia",
+ "shoe.ogg": "scarpa",
+ "shoelace.ogg": "lacci di scarpa",
+ "shop.ogg": "negozio",
+ "shore.ogg": "bagnasciuga",
+ "short.ogg": "pantaloni corti",
+ "shovel.ogg": "pala",
+ "shower.ogg": "doccia",
+ "shrimp.ogg": "gambero",
+ "shrub.ogg": "arbusto",
+ "shut.ogg": "chiusa",
+ "shutter.ogg": "persiana",
+ "sick.ogg": "ammalato",
+ "sidewalk.ogg": "marciapiede",
+ "sign.ogg": "cartello",
"sing.ogg": "cantare",
- "sink.ogg": "il lavandino",
+ "sink.ogg": "lavandino",
"sip.ogg": "succhiare",
+ "sister.ogg": "sorella",
"sit.ogg": "sedere",
"skate.ogg": "pattinare",
- "ski.ogg": "sciare",
- "skin.ogg": "la pelle",
- "skirt.ogg": "la gonna",
- "skunk.ogg": "la puzzola",
- "sky.ogg": "il cielo",
- "sled.ogg": "la slitta",
+ "skeleton.ogg": "scheletro",
+ "ski.ogg": "sci",
+ "skimmer.ogg": "schiumarola",
+ "skin.ogg": "pelle",
+ "skirt.ogg": "gonna",
+ "skunk.ogg": "puzzola",
+ "sky.ogg": "cielo",
+ "slam.ogg": "schiacciare",
+ "sled.ogg": "slitta",
"sleep.ogg": "dormire",
- "sleeve.ogg": "la manica",
- "sleigh.ogg": "la slitta",
- "slide.ogg": "lo scivolo",
- "slime.ogg": "la bava",
- "smile.ogg": "il sorriso",
- "smoke.ogg": "il fumo",
- "snail.ogg": "la lumaca",
- "snake.ogg": "il serpente",
- "sneaker.ogg": "la scarpa da tennis",
+ "sleeve.ogg": "manica",
+ "sleigh.ogg": "slitta",
+ "slide.ogg": "scivolo",
+ "slim.ogg": "magra",
+ "slime.ogg": "bava",
+ "slippers.ogg": "pantofole",
+ "slope.ogg": "pendenza",
+ "sloppy.ogg": "sciatto",
+ "slot.ogg": "fessura",
+ "sloth.ogg": "bradipo",
+ "slug.ogg": "chiocciola",
+ "small.ogg": "piccolo",
+ "smell.ogg": "odorare",
+ "smile.ogg": "sorriso",
+ "smock.ogg": "grembiule",
+ "smoke.ogg": "fumo",
+ "smooch.ogg": "sbaciucchiare",
+ "snack.ogg": "spuntino",
+ "snail.ogg": "lumaca",
+ "snake.ogg": "serpente",
+ "sneaker.ogg": "scarpa da tennis",
"sniff.ogg": "annusare",
- "snow.ogg": "la neve",
- "sock.ogg": "il calzino",
- "spaghetti.ogg": "gli spaghetti",
- "spear.ogg": "la lancia",
- "spider.ogg": "il ragno",
- "spike.ogg": "gli aculei",
- "sponge.ogg": "la spugna",
- "spoon.ogg": "il cucchiaio",
+ "snow.ogg": "neve",
+ "soap.ogg": "sapone",
+ "sob.ogg": "disperazione",
+ "sock.ogg": "calzino",
+ "soldier.ogg": "soldato",
+ "sole.ogg": "sogliola",
+ "sole_shoe.ogg": "suola di scarpa",
+ "son.ogg": "figlio",
+ "soup.ogg": "zuppa",
+ "spade.ogg": "vanga",
+ "spaghetti.ogg": "spaghetti",
+ "spark.ogg": "scintilla",
+ "sparrow.ogg": "passero",
+ "spatula.ogg": "spatola",
+ "speak.ogg": "parlare",
+ "spear.ogg": "lancia",
+ "spice.ogg": "spezia",
+ "spider.ogg": "ragno",
+ "spider_web.ogg": "ragnatela",
+ "spike.ogg": "aculeo",
+ "spill.ogg": "versare",
+ "spinach.ogg": "spinaci",
+ "spine.ogg": "spina dorsale",
+ "spinning_top.ogg": "trottola",
+ "splash.ogg": "schizzare",
+ "splatter.ogg": "schizzo",
+ "sponge.ogg": "spugna",
+ "spool.ogg": "rocchetto",
+ "spoon.ogg": "cucchiaio",
"sport.ogg": "sport",
+ "spot.ogg": "macchia",
"spray.ogg": "spruzzare",
"spread.ogg": "spalmare",
- "squash.ogg": "la zucca",
- "squid.ogg": "il calamaro",
- "squirrel.ogg": "lo scoiattolo",
- "stack.ogg": "una pila",
- "stage.ogg": "il palco",
- "stamp.ogg": "il francobollo",
- "star.ogg": "la stella",
- "stare.ogg": "lo sguardo",
- "starfish.ogg": "la stella di mare",
- "stem.ogg": "lo stelo",
- "stew.ogg": "lo stufato",
+ "spring.ogg": "rimbalzare",
+ "spring_season.ogg": "stagione primaverile",
+ "sprinkle.ogg": "confettini",
+ "square.ogg": "quadrato",
+ "squash.ogg": "zucca",
+ "squat.ogg": "accovacciarsi",
+ "squid.ogg": "calamaro",
+ "squirrel.ogg": "scoiattolo",
+ "squirt.ogg": "spruzzo",
+ "stack.ogg": "pila",
+ "stage.ogg": "palco",
+ "staircase.ogg": "scalinata",
+ "stamp.ogg": "francobollo",
+ "stand.ogg": "stare in piedi",
+ "star.ogg": "stella",
+ "stare.ogg": "fissare",
+ "starfish.ogg": "stella di mare",
+ "steam.ogg": "vapore",
+ "steep.ogg": "ripido",
+ "steeple.ogg": "campanile",
+ "stem.ogg": "stelo",
+ "step.ogg": "gradino",
+ "stew.ogg": "stufato",
+ "stick.ogg": "ramoscello",
"sting.ogg": "pungere",
- "stone.ogg": "la pietra",
- "store.ogg": "il negozio",
- "stove.ogg": "la cucina",
- "straw.ogg": "la cannuccia",
- "strawberry.ogg": "la fragola",
- "stream.ogg": "il vapore",
- "street.ogg": "la via",
- "string.ogg": "lo spago",
+ "stinky.ogg": "maleodorante",
+ "stitch.ogg": "cucire",
+ "stomach.ogg": "stomaco",
+ "stone.ogg": "pietra",
+ "stop.ogg": "fermare",
+ "store.ogg": "negozio",
+ "stove.ogg": "cucina",
+ "straight.ogg": "dritto",
+ "strainer.ogg": "colino",
+ "straw.ogg": "cannuccia",
+ "strawberry.ogg": "fragola",
+ "stream.ogg": "corrente",
+ "street.ogg": "via",
+ "stretch.ogg": "allungare",
+ "string.ogg": "spago",
+ "stripe.ogg": "striscia",
+ "strong.ogg": "forte",
+ "student.ogg": "studente",
"study.ogg": "studiare",
- "stump.ogg": "il ceppo",
- "suit.ogg": "l'abito",
- "summer.ogg": "l'estate",
- "sun.ogg": "il sole",
- "swan.ogg": "il cigno",
- "sweat.ogg": "il sudore",
- "swim.ogg": "nuotare",
- "tag.ogg": "il cartellino",
+ "stump.ogg": "ceppo",
+ "sugar.ogg": "zucchero",
+ "suit.ogg": "abito",
+ "suitcase.ogg": "valigia",
+ "summer.ogg": "estate",
+ "summit.ogg": "vetta",
+ "sun.ogg": "sole",
+ "swan.ogg": "cigno",
+ "sweat.ogg": "sudore",
+ "sweatshirt.ogg": "felpa",
+ "swim.ogg": "nuoto",
+ "table.ogg": "tavolo",
+ "tablecloth.ogg": "tovaglia",
+ "tadpole.ogg": "girino",
+ "tag.ogg": "cartellino",
+ "tail.ogg": "coda",
+ "tall.ogg": "alto",
+ "tape_measure.ogg": "metro",
+ "taxi.ogg": "taxi",
"teach.ogg": "insegnare",
- "teacher.ogg": "la maestra",
+ "teacher.ogg": "maestra",
"tear.ogg": "strappare",
- "teeth.ogg": "i denti",
- "thigh.ogg": "la coscia",
+ "teddy.ogg": "orsetto",
+ "teeth.ogg": "denti",
+ "television.ogg": "televisore",
+ "temple.ogg": "tempio",
+ "tennis.ogg": "tennis",
+ "tent.ogg": "tenda",
+ "text.ogg": "testo",
+ "thick.ogg": "spesso",
+ "thief.ogg": "ladro",
+ "thigh.ogg": "coscia",
"think.ogg": "pensare",
- "thread.ogg": "il filo",
- "throat.ogg": "la gola",
+ "thread.ogg": "filo",
+ "throat.ogg": "gola",
"throw.ogg": "lanciare",
- "tick.ogg": "la zecca",
- "time.ogg": "il tempo",
- "toilet.ogg": "il gabinetto",
- "tool.ogg": "gli attrezzi",
- "top.ogg": "la cima",
- "torch.ogg": "la torcia",
+ "thumb.ogg": "pollice",
+ "tick.ogg": "zecca",
+ "ticket.ogg": "biglietto",
+ "tiger.ogg": "tigre",
+ "time.ogg": "tempo",
+ "tin.ogg": "lattina",
+ "tire.ogg": "pneumatico",
+ "tired.ogg": "stanco",
+ "tissue.ogg": "fazzoletto",
+ "to_drink.ogg": "bere",
+ "toad.ogg": "rospo",
+ "toaster.ogg": "tostapane",
+ "toe.ogg": "alluce",
+ "toilet.ogg": "gabinetto",
+ "tomatoe.ogg": "pomodoro",
+ "tongs.ogg": "pinze",
+ "tongue.ogg": "lingua",
+ "tool.ogg": "attrezzo",
+ "top.ogg": "cima",
+ "torch.ogg": "torcia",
"touch.ogg": "toccare",
- "towel.ogg": "l'asciugamano",
- "toy.ogg": "il giocattolo",
- "train.ogg": "il treno",
- "trap.ogg": "la trappola",
- "trash.ogg": "la spazzatura",
- "tray.ogg": "il vassoio",
- "tree.ogg": "l'albero",
- "truck.ogg": "il camion",
- "tube.ogg": "il rossetto",
- "tune.ogg": "le note",
- "vet.ogg": "il veterinario",
+ "towel.ogg": "asciugamano",
+ "toy.ogg": "giocattolo",
+ "trail.ogg": "sentiero",
+ "train.ogg": "treno",
+ "train_station.ogg": "stazione dei treni",
+ "trap.ogg": "trappola",
+ "trash.ogg": "spazzatura",
+ "tray.ogg": "vassoio",
+ "treat.ogg": "dolcetto",
+ "tree.ogg": "albero",
+ "triangle.ogg": "triangolo",
+ "tribe.ogg": "tribù",
+ "trip.ogg": "viaggio",
+ "truck.ogg": "camion",
+ "tube.ogg": "rossetto",
+ "tulip.ogg": "tulipano",
+ "tune.ogg": "note",
+ "turkey.ogg": "tacchino",
+ "turnip.ogg": "rapa",
+ "turtle.ogg": "tartaruga",
+ "tusk.ogg": "zanna",
+ "twin_boys.ogg": "gemelli",
+ "twin_girls.ogg": "gemelle",
+ "umbrella.ogg": "ombrella",
+ "under.ogg": "sotto",
+ "uniform.ogg": "uniforme",
+ "van.ogg": "furgone",
+ "vapor.ogg": "vapore",
+ "vase.ogg": "vaso",
+ "vegetable.ogg": "vegetale",
+ "vein.ogg": "vena",
+ "verdure.ogg": "verdure",
+ "vest.ogg": "gilè",
+ "vet.ogg": "veterinario",
+ "viper.ogg": "vipera",
+ "vowel.ogg": "vocale",
+ "vulture.ogg": "avvoltoio",
+ "wag.ogg": "agitare",
"walk.ogg": "camminare",
- "watch.ogg": "l'orologio da polso",
- "water.ogg": "l'acqua",
- "wedge.ogg": "il cuneo",
- "wheel.ogg": "la ruota",
+ "wall.ogg": "muro",
+ "walnut.ogg": "noce",
+ "wart.ogg": "verruca",
+ "wash.ogg": "lavare",
+ "wasp.ogg": "vespa",
+ "watch.ogg": "orologio da polso",
+ "water.ogg": "acqua",
+ "wave.ogg": "onda",
+ "wedding.ogg": "matrimonio",
+ "wedge.ogg": "cuneo",
+ "weight.ogg": "peso",
+ "wet.ogg": "umido",
+ "whale.ogg": "balena",
+ "wheat.ogg": "grano",
+ "wheel.ogg": "ruota",
+ "whisk.ogg": "frusta",
"whisper.ogg": "sussurrare",
"white.ogg": "bianco",
- "wig.ogg": "la parrucca",
- "wind.ogg": "il vento",
- "wing.ogg": "l'ala",
- "wood.ogg": "il legno",
- "wrench.ogg": "la chiave inglese",
- "wrist.ogg": "il polso",
- "zoo.ogg": "lo zoo"
-}
\ No newline at end of file
+ "wide.ogg": "largo",
+ "wife.ogg": "moglie",
+ "wig.ogg": "parrucca",
+ "win.ogg": "vincere",
+ "wind.ogg": "vento",
+ "window.ogg": "finestra",
+ "window_glass.ogg": "vetro della finestra",
+ "wing.ogg": "ala",
+ "winter.ogg": "inverno",
+ "wolf.ogg": "lupo",
+ "woman.ogg": "donna",
+ "wood.ogg": "legno",
+ "word.ogg": "parola",
+ "worker.ogg": "operaio",
+ "world.ogg": "mondo",
+ "wreath.ogg": "ghirlanda",
+ "wrench.ogg": "chiave inglese",
+ "wrist.ogg": "polso",
+ "write.ogg": "scrivere",
+ "yellow.ogg": "giallo",
+ "yogurt.ogg": "yogurt",
+ "yum.ogg": "delizioso",
+ "zebra.ogg": "zebra",
+ "zipper.ogg": "cerniera",
+ "zoo.ogg": "zoo"
+}
diff --git a/src/activities/lang/resource/content-ja.json b/src/activities/lang/resource/content-ja.json
deleted file mode 100644
--- a/src/activities/lang/resource/content-ja.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/activities/lang/resource/content-ml.json b/src/activities/lang/resource/content-ml.json
--- a/src/activities/lang/resource/content-ml.json
+++ b/src/activities/lang/resource/content-ml.json
@@ -1073,4 +1073,4 @@
"zebra.ogg": "വരയൻ കുതിര",
"zipper.ogg": "പൽനിരപ്പൂട്ട്",
"zoo.ogg": "മൃഗശാല"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-nl.json b/src/activities/lang/resource/content-nl.json
--- a/src/activities/lang/resource/content-nl.json
+++ b/src/activities/lang/resource/content-nl.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "ritssluiting",
"zoo.ogg": "dierentuin"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-nn.json b/src/activities/lang/resource/content-nn.json
--- a/src/activities/lang/resource/content-nn.json
+++ b/src/activities/lang/resource/content-nn.json
@@ -197,4 +197,4 @@
"word.ogg": "ord",
"write.ogg": "å skriva",
"yellow.ogg": "gul"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-pl.json b/src/activities/lang/resource/content-pl.json
--- a/src/activities/lang/resource/content-pl.json
+++ b/src/activities/lang/resource/content-pl.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "zamek",
"zoo.ogg": "zoo"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-pt.json b/src/activities/lang/resource/content-pt.json
--- a/src/activities/lang/resource/content-pt.json
+++ b/src/activities/lang/resource/content-pt.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "fecho",
"zoo.ogg": "zoológico"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-pt_BR.json b/src/activities/lang/resource/content-pt_BR.json
--- a/src/activities/lang/resource/content-pt_BR.json
+++ b/src/activities/lang/resource/content-pt_BR.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "zíper",
"zoo.ogg": "zoológico"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-ro.json b/src/activities/lang/resource/content-ro.json
--- a/src/activities/lang/resource/content-ro.json
+++ b/src/activities/lang/resource/content-ro.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebră",
"zipper.ogg": "fermoar",
"zoo.ogg": "grădină zoologică"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-sk.json b/src/activities/lang/resource/content-sk.json
--- a/src/activities/lang/resource/content-sk.json
+++ b/src/activities/lang/resource/content-sk.json
@@ -1059,4 +1059,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "zips",
"zoo.ogg": "zoologická záhrada"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-sv.json b/src/activities/lang/resource/content-sv.json
--- a/src/activities/lang/resource/content-sv.json
+++ b/src/activities/lang/resource/content-sv.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "zebra",
"zipper.ogg": "blixtlås",
"zoo.ogg": "djurpark"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-uk.json b/src/activities/lang/resource/content-uk.json
--- a/src/activities/lang/resource/content-uk.json
+++ b/src/activities/lang/resource/content-uk.json
@@ -1089,4 +1089,4 @@
"zebra.ogg": "зебра",
"zipper.ogg": "блискавка",
"zoo.ogg": "зоопарк"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/content-zh_CN.json b/src/activities/lang/resource/content-zh_CN.json
deleted file mode 100644
--- a/src/activities/lang/resource/content-zh_CN.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/activities/lang/resource/content-zh_TW.json b/src/activities/lang/resource/content-zh_TW.json
--- a/src/activities/lang/resource/content-zh_TW.json
+++ b/src/activities/lang/resource/content-zh_TW.json
@@ -47,4 +47,4 @@
"science.ogg": "科學",
"splatter.ogg": "飛濺",
"spot.ogg": "斑點"
-}
\ No newline at end of file
+}
diff --git a/src/activities/lang/resource/poToDataset.py b/src/activities/lang/resource/poToDataset.py
--- a/src/activities/lang/resource/poToDataset.py
+++ b/src/activities/lang/resource/poToDataset.py
@@ -33,10 +33,14 @@
jsonFile = sys.argv[2]
data = {}
+if poFile.percent_translated() < 40:
+ print("Need at least 40% of the words translated to create the json data file")
+ sys.exit(0)
+
for entry in poFile.translated_entries():
word = entry.msgctxt
data[word] = entry.msgstr
with open(jsonFile, "w", encoding='utf-8') as data_file:
json.dump(data, data_file, indent=4, sort_keys=True, ensure_ascii=False)
-
+ data_file.write("\n") # Add missing new line at end of file
diff --git a/src/activities/leftright/ActivityInfo.qml b/src/activities/leftright/ActivityInfo.qml
--- a/src/activities/leftright/ActivityInfo.qml
+++ b/src/activities/leftright/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You can see a hand: is it a left hand or a right hand? Click on the left button, or the right button depending on the displayed hand.")
credit: ""
- section: "discovery"
- createdInVersion: 0
+ section: "puzzle"
+ createdInVersion: 0
}
diff --git a/src/activities/letter-in-word/ActivityInfo.qml b/src/activities/letter-in-word/ActivityInfo.qml
--- a/src/activities/letter-in-word/ActivityInfo.qml
+++ b/src/activities/letter-in-word/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A letter is displayed on the flag attached to the plane, select all the words or the objects in which the letter appears and then press OK.")
credit: ""
- section: "reading"
+ section: "reading words"
createdInVersion: 7000
}
diff --git a/src/activities/lightsoff/ActivityInfo.qml b/src/activities/lightsoff/ActivityInfo.qml
--- a/src/activities/lightsoff/ActivityInfo.qml
+++ b/src/activities/lightsoff/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("The effect of pressing a button is to toggle the state of that button, and of its immediate vertical and horizontal neighbors. The sun and the color of the sky depend on the number of clicks needed to solve the puzzle. If you click on Tux, the solution is shown.")
credit: qsTr("The solver algorithm is described on Wikipedia. To know more about the Lights Off game: <http://en.wikipedia.org/wiki/Lights_Out_(game)>")
- section: "puzzle"
+ section: "discovery logic"
createdInVersion: 0
}
diff --git a/src/activities/louis-braille/ActivityInfo.qml b/src/activities/louis-braille/ActivityInfo.qml
--- a/src/activities/louis-braille/ActivityInfo.qml
+++ b/src/activities/louis-braille/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Read the history of Louis Braille, his biography, and the invention of the Braille system. Click on the previous and next buttons to move between the story pages. At the end, arrange the sequence in chronological order.")
credit: qsTr("Louis Braille Video: <http:\/\/www.youtube.com/watch?v=9bdfC2j_4x4>")
- section: "discovery braille"
+ section: "sciences history"
createdInVersion: 4000
}
diff --git a/src/activities/magic-hat-minus/ActivityInfo.qml b/src/activities/magic-hat-minus/ActivityInfo.qml
--- a/src/activities/magic-hat-minus/ActivityInfo.qml
+++ b/src/activities/magic-hat-minus/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the hat to open it. Stars go in and a few stars escape. You have to count how many are still under the hat. Click on the bottom area to input your answer and on the OK button to validate your answer.")
credit: ""
- section: "math numeration"
+ section: "math arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/magic-hat-plus/ActivityInfo.qml b/src/activities/magic-hat-plus/ActivityInfo.qml
--- a/src/activities/magic-hat-plus/ActivityInfo.qml
+++ b/src/activities/magic-hat-plus/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the hat to open it. Under the hat, how many stars can you see moving around? Count carefully. Click on the bottom area to input your answer and on the OK button to validate your answer.")
credit: ""
- section: "math numeration"
+ section: "math arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/maze/ActivityInfo.qml b/src/activities/maze/ActivityInfo.qml
--- a/src/activities/maze/ActivityInfo.qml
+++ b/src/activities/maze/ActivityInfo.qml
@@ -40,6 +40,6 @@
qsTr("At higher levels, run-fast-mode will be enabled automatically. If you want to use this feature in earlier levels or want to disable it in advanced levels, click on the \"barefoot / sportshoe\"-icon in the upper left corner of the screen to toggle the run-fast-mode.
\t")
credit: ""
- section: "discovery maze"
+ section: "fun maze"
createdInVersion: 0
}
diff --git a/src/activities/mazeinvisible/ActivityInfo.qml b/src/activities/mazeinvisible/ActivityInfo.qml
--- a/src/activities/mazeinvisible/ActivityInfo.qml
+++ b/src/activities/mazeinvisible/ActivityInfo.qml
@@ -40,6 +40,6 @@
qsTr("At higher levels, run-fast-mode will be enabled automatically. If you want to use this feature in earlier levels or want to disable it in advanced levels, click on the \"barefoot / sportshoe\"-icon in the upper left corner of the screen to toggle the run-fast-mode.
\t")
credit: ""
- section: "discovery maze"
+ section: "fun maze"
createdInVersion: 0
}
diff --git a/src/activities/mazerelative/ActivityInfo.qml b/src/activities/mazerelative/ActivityInfo.qml
--- a/src/activities/mazerelative/ActivityInfo.qml
+++ b/src/activities/mazerelative/ActivityInfo.qml
@@ -41,6 +41,6 @@
qsTr("At higher levels, run-fast-mode will be enabled automatically. If you want to use this feature in earlier levels or want to disable it in advanced levels, click on the \"barefoot / sportshoe\"-icon in the upper left corner of the screen to toggle the run-fast-mode.
\t")
credit: ""
- section: "discovery mazeMenu"
+ section: "fun maze"
createdInVersion: 0
}
diff --git a/src/activities/memory-case-association-tux/ActivityInfo.qml b/src/activities/memory-case-association-tux/ActivityInfo.qml
--- a/src/activities/memory-case-association-tux/ActivityInfo.qml
+++ b/src/activities/memory-case-association-tux/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You can see some cards, but you can't see what's on the other side of them. Each card is hiding the lower/uppercase of an alphabet, and you have to associate all the upper case letters with its lower case and vice versa. Tux teacher does the same.")
credit: ""
- section: "reading"
+ section: "reading letters"
createdInVersion: 9000
}
diff --git a/src/activities/memory-case-association/ActivityInfo.qml b/src/activities/memory-case-association/ActivityInfo.qml
--- a/src/activities/memory-case-association/ActivityInfo.qml
+++ b/src/activities/memory-case-association/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You can see some cards, but you can't see what's on the other side of them. Each card is hiding the lower/uppercase of an alphabet, and you have to associate all the upper case letters with its lower case and vice versa.")
credit: ""
- section: "reading"
+ section: "reading letters"
createdInVersion: 9000
}
diff --git a/src/activities/memory-math-add-minus-mult-div-tux/ActivityInfo.qml b/src/activities/memory-math-add-minus-mult-div-tux/ActivityInfo.qml
--- a/src/activities/memory-math-add-minus-mult-div-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-add-minus-mult-div-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more than Tux, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-add-minus-mult-div/ActivityInfo.qml b/src/activities/memory-math-add-minus-mult-div/ActivityInfo.qml
--- a/src/activities/memory-math-add-minus-mult-div/ActivityInfo.qml
+++ b/src/activities/memory-math-add-minus-mult-div/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-add-minus-tux/ActivityInfo.qml b/src/activities/memory-math-add-minus-tux/ActivityInfo.qml
--- a/src/activities/memory-math-add-minus-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-add-minus-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more than Tux, and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-add-minus/ActivityInfo.qml b/src/activities/memory-math-add-minus/ActivityInfo.qml
--- a/src/activities/memory-math-add-minus/ActivityInfo.qml
+++ b/src/activities/memory-math-add-minus/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-add-tux/ActivityInfo.qml b/src/activities/memory-math-add-tux/ActivityInfo.qml
--- a/src/activities/memory-math-add-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-add-tux/ActivityInfo.qml
@@ -39,6 +39,6 @@
In this game, these cards are hiding the two parts of an adding-up sum (also called an addition sum). You need to find the two parts of the sum, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole sum. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper sum. When you do that, both those cards disappear! When you've made them all disappear, found more sums than Tux and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-add/ActivityInfo.qml b/src/activities/memory-math-add/ActivityInfo.qml
--- a/src/activities/memory-math-add/ActivityInfo.qml
+++ b/src/activities/memory-math-add/ActivityInfo.qml
@@ -39,6 +39,6 @@
In this game, these cards are hiding the two parts of an adding-up sum (also called an addition sum). You need to find the two parts of the sum, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole sum. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper sum. When you do that, both those cards disappear! When you've made them all disappear, found all the sums, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-div-tux/ActivityInfo.qml b/src/activities/memory-math-div-tux/ActivityInfo.qml
--- a/src/activities/memory-math-div-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-div-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more than Tux and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-div/ActivityInfo.qml b/src/activities/memory-math-div/ActivityInfo.qml
--- a/src/activities/memory-math-div/ActivityInfo.qml
+++ b/src/activities/memory-math-div/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-minus-tux/ActivityInfo.qml b/src/activities/memory-math-minus-tux/ActivityInfo.qml
--- a/src/activities/memory-math-minus-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-minus-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more operations than Tux and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-minus/ActivityInfo.qml b/src/activities/memory-math-minus/ActivityInfo.qml
--- a/src/activities/memory-math-minus/ActivityInfo.qml
+++ b/src/activities/memory-math-minus/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-mult-div-tux/ActivityInfo.qml b/src/activities/memory-math-mult-div-tux/ActivityInfo.qml
--- a/src/activities/memory-math-mult-div-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-mult-div-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more than Tux and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-mult-div/ActivityInfo.qml b/src/activities/memory-math-mult-div/ActivityInfo.qml
--- a/src/activities/memory-math-mult-div/ActivityInfo.qml
+++ b/src/activities/memory-math-mult-div/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-mult-tux/ActivityInfo.qml b/src/activities/memory-math-mult-tux/ActivityInfo.qml
--- a/src/activities/memory-math-mult-tux/ActivityInfo.qml
+++ b/src/activities/memory-math-mult-tux/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found more than Tux and you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-math-mult/ActivityInfo.qml b/src/activities/memory-math-mult/ActivityInfo.qml
--- a/src/activities/memory-math-mult/ActivityInfo.qml
+++ b/src/activities/memory-math-mult/ActivityInfo.qml
@@ -37,6 +37,6 @@
In this game, these cards are hiding the two parts of an operation. You need to find the two parts of the operation, and bring them together again. Click on a card to see what number it's hiding, then try to find the other card that goes with it, to make a whole operation. You can only turn over two cards in one go, so you need to remember where the numbers are hiding, then you can match them when you find their other half. You're doing the job of the equals sign, and the numbers need you to put them together and make a proper equality. When you do that, both those cards disappear! When you've made them all disappear, found all the operations, you've won the game!")
credit: ""
- section: "math memory"
+ section: "math memory arithmetic"
createdInVersion: 0
}
diff --git a/src/activities/memory-tux/ActivityInfo.qml b/src/activities/memory-tux/ActivityInfo.qml
--- a/src/activities/memory-tux/ActivityInfo.qml
+++ b/src/activities/memory-tux/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A set of blank cards is shown. Each card has a picture on the other side, and each picture card has a twin exactly the same. Click on a card to see its hidden picture, and try to match the twins. You can only turn over two cards at once, so you need to remember where a picture is, while you look for its twin. When you turn over the twins, they both disappear. Tux teacher do the same.")
credit: ""
- section: "discovery memory"
+ section: "fun memory"
createdInVersion: 0
}
diff --git a/src/activities/memory-wordnumber/ActivityInfo.qml b/src/activities/memory-wordnumber/ActivityInfo.qml
--- a/src/activities/memory-wordnumber/ActivityInfo.qml
+++ b/src/activities/memory-wordnumber/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("You can see some cards, but you can't see what's on the other side of them. Each card is hiding the numeral form of a number, or the word to write it.")
credit: ""
- section: "reading"
+ section: "math numeration"
createdInVersion: 0
}
diff --git a/src/activities/memory/ActivityInfo.qml b/src/activities/memory/ActivityInfo.qml
--- a/src/activities/memory/ActivityInfo.qml
+++ b/src/activities/memory/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("A set of blank cards is shown. Each card has a picture on the other side, and each picture card has a twin exactly the same. Click on a card to see its hidden picture, and try to match the twins. You can only turn over two cards at once, so you need to remember where a picture is, while you look for its twin. When you turn over the twins, they both disappear.")
credit: ""
- section: "discovery memory"
+ section: "fun memory"
createdInVersion: 0
}
diff --git a/src/activities/memory/CardItem.qml b/src/activities/memory/CardItem.qml
--- a/src/activities/memory/CardItem.qml
+++ b/src/activities/memory/CardItem.qml
@@ -82,7 +82,7 @@
}
GCText {
anchors.centerIn: parent
- fontSize: largeSize
+ fontSizeMode: Text.Fit
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
color: "black"
diff --git a/src/activities/menu/Menu.qml b/src/activities/menu/Menu.qml
--- a/src/activities/menu/Menu.qml
+++ b/src/activities/menu/Menu.qml
@@ -82,7 +82,7 @@
// automatically the menu at start.
target: ApplicationInfo
onIsBox2DInstalledChanged: {
- ActivityInfoTree.filterByTag(activity.currentTag)
+ ActivityInfoTree.filterByTag(activity.currentTag, currentCategory)
ActivityInfoTree.filterLockedActivities()
ActivityInfoTree.filterEnabledActivities()
}
@@ -101,27 +101,43 @@
},
{
icon: activity.url + "discovery.svg",
- tag: "discovery"
+ tag: "discovery",
+ categories: [{ "logic": qsTr("Logic") },
+ { "arts": qsTr("Fine Arts") },
+ { "music": qsTr("Music") }
+ ]
},
{
- icon: activity.url + "experience.svg",
- tag: "experiment"
+ icon: activity.url + "sciences.svg",
+ tag: "sciences",
+ categories: [{ "experiment": qsTr("Experiment") },
+ { "history": qsTr("History") },
+ { "geography": qsTr("Geography") }
+ ]
},
{
icon: activity.url + "fun.svg",
tag: "fun"
},
{
icon: activity.url + "math.svg",
- tag: "math"
+ tag: "math",
+ categories: [{ "numeration": qsTr("Numeration") },
+ { "arithmetic": qsTr("Arithmetic") },
+ { "measures": qsTr("Measures") }
+ ]
},
{
icon: activity.url + "puzzle.svg",
tag: "puzzle"
},
{
icon: activity.url + "reading.svg",
- tag: "reading"
+ tag: "reading",
+ categories: [{ "letters": qsTr("Letters") },
+ { "words": qsTr("Words") },
+ { "vocabulary": qsTr("Vocabulary") }
+ ]
},
{
icon: activity.url + "strategy.svg",
@@ -133,8 +149,12 @@
}
]
property string currentTag: sections[0].tag
+ property var currentTagCategories: []
+ property string currentCategory: ""
/// @endcond
+ property string clickMode: "play"
+
pageComponent: Image {
id: background
source: activity.url + "background.svg"
@@ -213,8 +233,22 @@
keyboardMode = true
event.accepted = false
}
- Keys.onTabPressed: currentActiveGrid = ((currentActiveGrid == activitiesGrid) ?
- section : activitiesGrid);
+ Keys.onTabPressed: {
+ if(currentActiveGrid == section) {
+ if(currentTagCategories && currentTagCategories.length != 0) {
+ currentActiveGrid = categoriesGrid;
+ }
+ else {
+ currentActiveGrid = activitiesGrid;
+ }
+ }
+ else if(currentActiveGrid == categoriesGrid) {
+ currentActiveGrid = activitiesGrid;
+ }
+ else {
+ currentActiveGrid = section;
+ }
+ }
Keys.onEnterPressed: if(currentActiveGrid.currentItem) currentActiveGrid.currentItem.selectCurrentItem();
Keys.onReturnPressed: if(currentActiveGrid.currentItem) currentActiveGrid.currentItem.selectCurrentItem();
Keys.onRightPressed: if(currentActiveGrid.currentItem) currentActiveGrid.moveCurrentIndexRight();
@@ -273,12 +307,19 @@
function selectCurrentItem() {
section.currentIndex = index
activity.currentTag = modelData.tag
+ activity.currentTagCategories = modelData.categories
+ if(modelData.categories != undefined) {
+ currentCategory = Object.keys(modelData.categories[0])[0];
+ }
+ else {
+ currentCategory = ""
+ }
particles.burst(10)
if(modelData.tag === "search") {
ActivityInfoTree.filterBySearch(searchTextField.text);
}
else {
- ActivityInfoTree.filterByTag(modelData.tag)
+ ActivityInfoTree.filterByTag(modelData.tag, currentCategory)
ActivityInfoTree.filterLockedActivities()
ActivityInfoTree.filterEnabledActivities()
}
@@ -353,15 +394,74 @@
}
}
+ GridView {
+ id: categoriesGrid
+ model: currentTagCategories
+ anchors.top: horizontal ? section.bottom : parent.top
+ interactive: false
+ keyNavigationWraps: true
+ width: horizontal ? main.width : main.width - section.width
+ visible: activity.currentTag !== "search"
+ x: {
+ if(currentTagCategories) {
+ if(horizontal) {
+ return categoriesGrid.width / (4 * (currentTagCategories.length+1))
+ }
+ else {
+ return categoriesGrid.width / (4 * (currentTagCategories.length+1)) + section.width
+ }
+ }
+ else {
+ return 0
+ }
+ }
+
+ cellWidth: currentTagCategories ? categoriesGrid.width / currentTagCategories.length : 0
+ cellHeight: height
+ height: searchTextField.height
+
+ delegate: Button {
+ id: button
+ style: GCButtonStyle {
+ selected: currentCategory === button.category
+ }
+ width: categoriesGrid.width / (currentTagCategories.length + 1)
+ height: categoriesGrid.cellHeight
+ text: Object.values(modelData)[0]
+ property string category: Object.keys(modelData)[0]
+ onClicked: {
+ selectCurrentItem()
+ }
+
+ function selectCurrentItem() {
+ categoriesGrid.currentIndex = index
+ currentCategory = Object.keys(modelData)[0]
+ ActivityInfoTree.filterByTag(currentTag, currentCategory)
+ ActivityInfoTree.filterLockedActivities()
+ ActivityInfoTree.filterEnabledActivities()
+ }
+ }
+ highlight: Rectangle {
+ width: activityCellWidth - activitiesGrid.spacing
+ height: activityCellHeight - activitiesGrid.spacing
+ color: "#AAFFFFFF"
+ border.width: 3
+ border.color: "black"
+ visible: background.keyboardMode
+ Behavior on x { SpringAnimation { spring: 2; damping: 0.2 } }
+ Behavior on y { SpringAnimation { spring: 2; damping: 0.2 } }
+ }
+ }
+
GridView {
id: activitiesGrid
anchors {
top: {
- if(activity.currentTag === "search")
+ if(searchBar.visible)
return searchBar.bottom
else
- return horizontal ? section.bottom : parent.top
+ return categoriesGrid.bottom
}
bottom: bar.top
left: horizontal ? parent.left : section.right
@@ -379,6 +479,7 @@
id: delegateItem
width: activityCellWidth - activitiesGrid.spacing
height: activityCellHeight - activitiesGrid.spacing
+ enabled: clickMode === "play" || dialogChooseLevel.hasConfigOrDataset
Rectangle {
id: activityBackground
width: parent.width
@@ -396,6 +497,7 @@
sourceSize.width: width
fillMode: Image.PreserveAspectFit
anchors.margins: 5
+ opacity: delegateItem.enabled ? 1 : 0.5
Image {
source: "qrc:/gcompris/src/core/resource/difficulty" +
ActivityInfoTree.menuTree[index].difficulty + ".svg";
@@ -462,6 +564,7 @@
anchors.fill: activityBackground
onClicked: selectCurrentItem()
}
+
Image {
source: activity.url + (favorite ? "all.svg" : "all_disabled.svg");
anchors {
@@ -477,17 +580,45 @@
}
}
+ DialogChooseLevel {
+ id: dialogChooseLevel
+ displayDatasetAtStart: hasDataset
+ currentActivity: ActivityInfoTree.menuTree[index]
+ onClose: {
+ home()
+ }
+ onSaveData: {
+ currentLevel = dialogChooseLevel.chosenLevel
+ ApplicationSettings.setCurrentLevel(name, currentLevel)
+ }
+ onStartActivity: {
+ clickMode = "play"
+ // immediately pop the Dialog to load the activity
+ // if we don't do it immediately the page is busy
+ // and it does not load the activity
+ pageView.pop({immediate: true})
+ selectCurrentItem()
+ }
+ }
+
function selectCurrentItem() {
- if(pageView.busy)
+ if(pageView.busy || !delegateItem.enabled)
return
- particles.burst(50)
- ActivityInfoTree.currentActivity = ActivityInfoTree.menuTree[index]
- activityLoader.setSource("qrc:/gcompris/src/activities/" + ActivityInfoTree.menuTree[index].name,
- {
- 'menu': activity,
- 'activityInfo': ActivityInfoTree.currentActivity
- })
- if (activityLoader.status == Loader.Ready) loadActivity()
+
+ if(clickMode == "play") {
+ particles.burst(50)
+ ActivityInfoTree.currentActivity = ActivityInfoTree.menuTree[index]
+ activityLoader.setSource("qrc:/gcompris/src/activities/" + ActivityInfoTree.currentActivity.name,
+ {
+ 'menu': activity,
+ 'activityInfo': ActivityInfoTree.currentActivity,
+ 'levelFolder': currentLevel
+ })
+ if (activityLoader.status == Loader.Ready) loadActivity()
+ }
+ else {
+ displayDialog(dialogChooseLevel);
+ }
}
}
highlight: Rectangle {
@@ -532,12 +663,23 @@
upVisible: activitiesGrid.visibleArea.yPosition <= 0 ? false : true
downVisible: activitiesGrid.visibleArea.yPosition >= 1 ? false : true
}
-
+
+ Rectangle {
+ id: categories
+ width: horizontal ? parent.width : parent.width - (section.width+10)
+ height: searchTextField.height
+ visible: sections[activity.currentTag] === "search"
+ anchors {
+ top: horizontal ? section.bottom : categoriesGrid.top
+ left: horizontal ? undefined : section.right
+ }
+ }
+
Rectangle {
id: searchBar
- width: horizontal ? parent.width/2 : parent.width - (section.width+10)
+ width: horizontal ? parent.width/2 : parent.width - (section.width+10)
height: searchTextField.height
- visible: activity.currentTag === "search"
+ visible: clickMode === "activityConfig" || activity.currentTag === "search"
anchors {
top: horizontal ? section.bottom : parent.top
left: horizontal ? undefined : section.right
@@ -581,9 +723,20 @@
}
}
+ GCText {
+ id: activitySettingsLabel
+ text: qsTr("Activity Settings")
+ visible: clickMode === "activityConfig"
+ width: parent.width
+ height: paintedHeight
+ anchors.verticalCenter: parent.verticalCenter
+ horizontalAlignment: Text.AlignHCenter
+ color: "black"
+ }
TextField {
id: searchTextField
width: parent.width
+ visible: activity.currentTag === "search"
textColor: "black"
font.pointSize: 16
font.bold: true
@@ -674,7 +827,7 @@
id: bar
// No exit button on mobile, UI Guidelines prohibits it
content: BarEnumContent {
- value: help | config | about | (ApplicationInfo.isMobile ? 0 : exit)
+ value: help | config | activityConfig | about | (ApplicationInfo.isMobile ? 0 : exit)
}
anchors.bottom: keyboard.visible ? keyboard.top : parent.bottom
onAboutClicked: {
@@ -687,6 +840,15 @@
displayDialog(dialogHelp)
}
+ onActivityConfigClicked: {
+ if(clickMode == "play") {
+ clickMode = "activityConfig"
+ }
+ else {
+ clickMode = "play"
+ }
+ }
+
onConfigClicked: {
searchTextField.focus = false
dialogActivityConfig.active = true
@@ -721,7 +883,7 @@
}
onClose: {
if(activity.currentTag != "search") {
- ActivityInfoTree.filterByTag(activity.currentTag)
+ ActivityInfoTree.filterByTag(activity.currentTag, currentCategory)
ActivityInfoTree.filterLockedActivities()
ActivityInfoTree.filterEnabledActivities()
} else
diff --git a/src/activities/menu/resource/experience.svg b/src/activities/menu/resource/sciences.svg
rename from src/activities/menu/resource/experience.svg
rename to src/activities/menu/resource/sciences.svg
diff --git a/src/activities/missing-letter/ActivityInfo.qml b/src/activities/missing-letter/ActivityInfo.qml
--- a/src/activities/missing-letter/ActivityInfo.qml
+++ b/src/activities/missing-letter/ActivityInfo.qml
@@ -36,6 +36,6 @@
//: Help manual
manual: qsTr("An object is displayed in the main area, and an incomplete word is printed under the picture. Select the missing letter to complete the word.")
credit: ""
- section: "reading"
+ section: "reading words"
createdInVersion: 0
}
diff --git a/src/activities/money/ActivityInfo.qml b/src/activities/money/ActivityInfo.qml
--- a/src/activities/money/ActivityInfo.qml
+++ b/src/activities/money/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click or tap on the coins or paper money at the bottom of the screen to pay. If you want to remove a coin or note, click or tap on it on the upper screen area.")
credit: ""
- section: "math numeration money"
+ section: "math money measures"
createdInVersion: 0
}
diff --git a/src/activities/money_back/ActivityInfo.qml b/src/activities/money_back/ActivityInfo.qml
--- a/src/activities/money_back/ActivityInfo.qml
+++ b/src/activities/money_back/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the coins or paper money at the bottom of the screen to pay. If you want to remove a coin or note, click on it on the upper screen area.")
credit: ""
- section: "math numeration money"
+ section: "math money measures"
createdInVersion: 0
}
diff --git a/src/activities/money_back_cents/ActivityInfo.qml b/src/activities/money_back_cents/ActivityInfo.qml
--- a/src/activities/money_back_cents/ActivityInfo.qml
+++ b/src/activities/money_back_cents/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the coins or paper money at the bottom of the screen to pay. If you want to remove a coin or note, click on it on the upper screen area.")
credit: ""
- section: "math numeration money"
+ section: "math money measures"
createdInVersion: 0
}
diff --git a/src/activities/money_cents/ActivityInfo.qml b/src/activities/money_cents/ActivityInfo.qml
--- a/src/activities/money_cents/ActivityInfo.qml
+++ b/src/activities/money_cents/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Click on the coins or paper money at the bottom of the screen to pay. If you want to remove a coin or note, click on it on the upper screen area.")
credit: ""
- section: "math numeration money"
+ section: "math money measures"
createdInVersion: 0
}
diff --git a/src/activities/mosaic/ActivityInfo.qml b/src/activities/mosaic/ActivityInfo.qml
--- a/src/activities/mosaic/ActivityInfo.qml
+++ b/src/activities/mosaic/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("First select the item you want to put then click on a spot on the empty area")
credit: ""
- section: "discovery"
+ section: "puzzle"
createdInVersion: 0
}
diff --git a/src/activities/note_names/ActivityInfo.qml b/src/activities/note_names/ActivityInfo.qml
--- a/src/activities/note_names/ActivityInfo.qml
+++ b/src/activities/note_names/ActivityInfo.qml
@@ -38,6 +38,6 @@
//: Help manual
manual: qsTr("Identify the notes correctly and score a 100% to complete a level.")
credit: ""
- section: "discovery sound"
+ section: "discovery music"
createdInVersion: 9500
}
diff --git a/src/activities/numbers-odd-even/NumbersOddEven.qml b/src/activities/numbers-odd-even/NumbersOddEven.qml
--- a/src/activities/numbers-odd-even/NumbersOddEven.qml
+++ b/src/activities/numbers-odd-even/NumbersOddEven.qml
@@ -21,6 +21,8 @@
Planegame {
+ showTutorial: true
+
dataset: [
{
data: "0 2 4 6 8 10 12 14 16 18 20".split(" "),
@@ -39,4 +41,42 @@
showNext: false
}
]
+
+ tutorialInstructions: [
+ {
+ "instruction": qsTr("This activity teaches about even and odd numbers."),
+ "instructionQml": ""
+ },
+ {
+ "instruction": qsTr("Even numbers are numbers which leave remainder 0 when divided by 2."),
+ "instructionQml": ""
+ },
+
+ {
+ "instruction": qsTr("What is meant by remainder of a number?"),
+ "instructionQml" : "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial1.qml"
+ },
+
+ {
+ "instruction": qsTr("Even numbers are numbers which leave remainder 0 when divided by 2."),
+ "instructionQml" : "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial2.qml"
+ },
+ {
+ "instruction": qsTr("Odd numbers are numbers which do not leave remainder 0 when divided by 2."),
+ "instructionQml": "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial3.qml"
+ },
+ {
+ "instruction": qsTr("Exercise to test your understanding."),
+ "instructionQml": "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial4.qml"
+ },
+ {
+ "instruction": qsTr("Exercise to test your understanding."),
+ "instructionQml": "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial5.qml"
+ },
+ {
+ "instruction": qsTr("Exercise to test your understanding."),
+ "instructionQml": "qrc:/gcompris/src/activities/numbers-odd-even/resource/Tutorial6.qml"
+ }
+
+ ]
}
diff --git a/src/activities/numbers-odd-even/resource/Tutorial1.qml b/src/activities/numbers-odd-even/resource/Tutorial1.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/numbers-odd-even/resource/Tutorial1.qml
@@ -0,0 +1,45 @@
+/* GCompris - Tutorial1.qml
+ *
+ * Copyright (C) 2019 Deepak Kumar
+ *
+ * Authors:
+ * Deepak Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+
+ GCText {
+ id: remainder
+ text: qsTr("The remainder is the amount \"left over\" after dividing the given number with the other number.\n If 6 is divided by 2 the result is 3 and the remainder is 0.\n If 7 is divided by 2 the result is 3 and the remainder is 1.")
+ fontSizeMode: Text.Fit
+ fontSize: mediumSize
+ anchors.left: tutorialRectangle.left
+ anchors.leftMargin: parent.height * 0.01
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+}
diff --git a/src/activities/numbers-odd-even/resource/Tutorial2.qml b/src/activities/numbers-odd-even/resource/Tutorial2.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/numbers-odd-even/resource/Tutorial2.qml
@@ -0,0 +1,45 @@
+/* GCompris - Tutorial2.qml
+ *
+ * Copyright (C) 2019 Deepak Kumar
+ *
+ * Authors:
+ * Deepak Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+
+ GCText {
+ id: even
+ text: qsTr("For example: 12, 38, 52, 68, 102, 118, 168, 188, 502, 532, 700, 798, 842, 892, 1000. All of these numbers are even numbers as they leave remainder 0 when divided by 2.")
+ fontSizeMode: Text.Fit
+ fontSize: mediumSize
+ anchors.left: tutorialRectangle.left
+ anchors.leftMargin: parent.height * 0.01
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+}
diff --git a/src/activities/numbers-odd-even/resource/Tutorial3.qml b/src/activities/numbers-odd-even/resource/Tutorial3.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/numbers-odd-even/resource/Tutorial3.qml
@@ -0,0 +1,45 @@
+/* GCompris - Tutorial3.qml
+ *
+ * Copyright (C) 2019 Deepak Kumar
+ *
+ * Authors:
+ * Deepak Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+
+ GCText {
+ id: odd
+ text: qsTr("For example: 15, 19, 51, 65, 103, 119, 169, 185, 505, 533, 701, 799, 845, 897, 1001. All of these numbers are odd numbers as they do not leave remainder 0 when divided by 2.")
+ fontSizeMode: Text.Fit
+ fontSize: mediumSize
+ anchors.left: tutorialRectangle.left
+ anchors.leftMargin: parent.height * 0.01
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+}
diff --git a/src/activities/find_the_day/FindTheDay.qml b/src/activities/numbers-odd-even/resource/Tutorial4.qml
copy from src/activities/find_the_day/FindTheDay.qml
copy to src/activities/numbers-odd-even/resource/Tutorial4.qml
--- a/src/activities/find_the_day/FindTheDay.qml
+++ b/src/activities/numbers-odd-even/resource/Tutorial4.qml
@@ -1,9 +1,10 @@
-/* GCompris - find_the_day.qml
+/* GCompris - Tutorial4.qml
+
*
- * Copyright (C) 2018 Amit Sagtani
+ * Copyright (C) 2019 Deepak Kumar
*
* Authors:
- * Amit Sagtani
+ * Deepak Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,11 +20,12 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../calendar"
-import "find_the_day_dataset.js" as Dataset
+import "../../../core"
-Calendar {
- dataset: Dataset
+TutorialBase {
+ firstNumber: "2"
+ secondNumber: "5"
}
diff --git a/src/activities/algebra_plus/AlgebraPlus.qml b/src/activities/numbers-odd-even/resource/Tutorial5.qml
copy from src/activities/algebra_plus/AlgebraPlus.qml
copy to src/activities/numbers-odd-even/resource/Tutorial5.qml
--- a/src/activities/algebra_plus/AlgebraPlus.qml
+++ b/src/activities/numbers-odd-even/resource/Tutorial5.qml
@@ -1,9 +1,10 @@
-/* GCompris - AlgebraPlus.qml
+/* GCompris - Tutorial5.qml
+
*
- * Copyright (C) 2015 Bruno Coudoin
+ * Copyright (C) 2019 Deepak Kumar
*
* Authors:
- * Bruno Coudoin
+ * Deepak Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,12 +20,13 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
+
+import "../../../core"
-import "../../core"
-import "../algebra_by/"
+TutorialBase {
-Algebra {
- onStart: {
- operand.text = "+"
- }
+ isEvenExpected: false
+ firstNumber: "59"
+ secondNumber: "52"
}
diff --git a/src/activities/find_the_day/FindTheDay.qml b/src/activities/numbers-odd-even/resource/Tutorial6.qml
copy from src/activities/find_the_day/FindTheDay.qml
copy to src/activities/numbers-odd-even/resource/Tutorial6.qml
--- a/src/activities/find_the_day/FindTheDay.qml
+++ b/src/activities/numbers-odd-even/resource/Tutorial6.qml
@@ -1,9 +1,9 @@
-/* GCompris - find_the_day.qml
+/* GCompris - Tutorial6.qml
*
- * Copyright (C) 2018 Amit Sagtani
+ * Copyright (C) 2019 Deepak Kumar
*
* Authors:
- * Amit Sagtani
+ * Deepak Kumar
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -19,11 +19,12 @@
* along with this program; if not, see .
*/
import QtQuick 2.6
+import GCompris 1.0
-import "../calendar"
-import "find_the_day_dataset.js" as Dataset
+import "../../../core"
-Calendar {
- dataset: Dataset
+TutorialBase {
+ firstNumber: "111"
+ secondNumber: "108"
}
diff --git a/src/activities/numbers-odd-even/resource/TutorialBase.qml b/src/activities/numbers-odd-even/resource/TutorialBase.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/numbers-odd-even/resource/TutorialBase.qml
@@ -0,0 +1,147 @@
+/* GCompris - TutorialBase.qml
+ *
+ * Copyright (C) 2019 Deepak Kumar
+ *
+ * Authors:
+ * Deepak Kumar
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import "../../../core"
+
+Rectangle {
+ id: tutorialRectangle
+ anchors.fill: parent
+ color: "#80FFFFFF"
+ property alias firstNumber: firstNumber.textLabel
+ property alias secondNumber: secondNumber.textLabel
+ property alias message: message.text
+ property bool isEvenExpected: true
+
+ GCText {
+ id: question
+ anchors {
+ left: parent.left
+ verticalCenter: parent.verticalCenter
+ leftMargin: parent.height * 0.1
+ centerIn: parent.Center
+ top: parent.top
+ topMargin: parent.height * 0.05
+ }
+ text: isEvenExpected ? qsTr("Choose the even number:") : qsTr("Choose the odd number:")
+ fontSize: mediumSize
+ color: "black"
+ horizontalAlignment: Text.AlignLeft
+ width: 1.8 * parent.width
+ height: 1.8 * parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+
+ AnswerButton {
+ id: firstNumber
+ textLabel: ""
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.2
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: (isEvenExpected && Number(textLabel) % 2 === 0) ||
+ (!isEvenExpected && Number(textLabel) % 2 !== 0)
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ }
+ else {
+ if(isEvenExpected) {
+ message.text = qsTr("There is an error: when divided by 2, %1 leaves remainder as 1. Therefore this is an odd number.").arg(textLabel)
+ }
+ else {
+ message.text = qsTr("There is an error: when divided by 2, %1 leaves remainder as 0. Therefore this is an even number.").arg(textLabel)
+ }
+ }
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+
+ AnswerButton {
+ id: secondNumber
+ textLabel: ""
+ anchors {
+ top: parent.top
+ topMargin: parent.height * 0.3
+ left: parent.left
+ leftMargin: parent.width * 0.65
+ }
+ width: parent.width * 0.2
+ height: parent.height * 0.4
+ isCorrectAnswer: (isEvenExpected && Number(textLabel) % 2 === 0) ||
+ (!isEvenExpected && Number(textLabel) % 2 !== 0)
+ onPressed: {
+ if(isCorrectAnswer) {
+ message.text = qsTr("Great")
+ }
+ else {
+ if(isEvenExpected) {
+ message.text = qsTr("There is an error: when divided by 2, %1 leaves remainder as 1. Therefore this is an odd number.").arg(textLabel)
+ }
+ else {
+ message.text = qsTr("There is an error: when divided by 2, %1 leaves remainder as 0. Therefore this is an even number.").arg(textLabel)
+ }
+ }
+ message.visible = true
+ messageRectangle.visible = true
+ }
+ }
+
+ Rectangle {
+ id: messageRectangle
+ anchors {
+ horizontalCenter: parent.horizontalCenter
+ top: parent.top
+ topMargin: parent.height * 0.75
+ }
+ opacity: 0.8
+ radius: 10
+ border.width: 6
+ color: "white"
+ border.color: "#87A6DD"
+ width: parent.width * 1.15
+ height: parent.height * 0.4
+ visible: false
+
+ GCText {
+ id: message
+ anchors {
+ centerIn: parent
+ margins: parent.border.width+1
+ }
+ text: ""
+ fontSizeMode: Text.Fit
+ fontSize: smallSize
+ color: "black"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ width: parent.width
+ height: parent.height
+ wrapMode: Text.WordWrap
+ z: 2
+ }
+ }
+}
diff --git a/src/activities/paintings/ActivityInfo.qml b/src/activities/paintings/ActivityInfo.qml
--- a/src/activities/paintings/ActivityInfo.qml
+++ b/src/activities/paintings/ActivityInfo.qml
@@ -39,6 +39,6 @@
prerequisite: qsTr("Mouse-manipulation: movement, drag and drop")
//: Help manual
manual: qsTr("Drag the image parts from the box on the left to create a painting on the main board.")
- section: "puzzle"
+ section: "discovery arts puzzle"
createdInVersion: 5000
}
diff --git a/src/activities/photo_hunter/ActivityInfo.qml b/src/activities/photo_hunter/ActivityInfo.qml
--- a/src/activities/photo_hunter/ActivityInfo.qml
+++ b/src/activities/photo_hunter/ActivityInfo.qml
@@ -35,6 +35,6 @@
//: Help manual
manual: qsTr("Observe the two pictures carefully. There are some slight differences. When you find a difference you must click on it.")
credit: ""
- section: "puzzle"
+ section: "fun"
createdInVersion: 6000
}
diff --git a/src/activities/piano_composition/ActivityInfo.qml b/src/activities/piano_composition/ActivityInfo.qml
--- a/src/activities/piano_composition/ActivityInfo.qml
+++ b/src/activities/piano_composition/ActivityInfo.qml
@@ -53,6 +53,6 @@
- F1 to F5: Corresponding black keys in the order on the displayed octave.
")
credit: qsTr("The synthesizer original code is https://github.com/vsr83/miniSynth")
- section: "discovery sound_group"
+ section: "discovery music"
createdInVersion: 9500
}
diff --git a/src/activities/planegame/Planegame.qml b/src/activities/planegame/Planegame.qml
--- a/src/activities/planegame/Planegame.qml
+++ b/src/activities/planegame/Planegame.qml
@@ -36,6 +36,8 @@
Keys.onReleased: Activity.processReleasedKey(event)
property var dataset
+ property var tutorialInstructions
+ property bool showTutorial: false
property int oldWidth: width
onWidthChanged: {
@@ -60,9 +62,10 @@
sourceSize.width: parent.width
Component.onCompleted: {
- activity.start.connect(start)
- activity.stop.connect(stop)
+ activity.start.connect(start)
+ activity.stop.connect(stop)
}
+
QtObject {
id: items
property alias background: background
@@ -74,9 +77,38 @@
property GCSfx audioEffects: activity.audioEffects
property alias movePlaneTimer: movePlaneTimer
property alias cloudCreation: cloudCreation
+ property bool showTutorial: activity.showTutorial
+ }
+
+ onStart: { Activity.start(items, dataset) }
+ onStop: { Activity.stop() }
+
+ //Tutorial section starts
+ Loader {
+ active: showTutorial
+ anchors.fill: parent
+ z: 1
+ sourceComponent: tutorialComponent
+ Component {
+ id: tutorialComponent
+ Image {
+ id: tutorialImage
+ source: "../digital_electricity/resource/texture01.png"
+ anchors.fill: parent
+ fillMode: Image.Tile
+ Tutorial {
+ id: tutorialSection
+ tutorialDetails: tutorialInstructions
+ useImage: false
+ onSkipPressed: {
+ showTutorial = false
+ Activity.initLevel()
+ }
+ }
+ }
+ }
}
- onStart: Activity.start(items, dataset)
- onStop: Activity.stop();
+ // Tutorial section ends
MultiPointTouchArea {
anchors.fill: parent
@@ -95,7 +127,7 @@
Bar {
id: bar
- content: BarEnumContent { value: help | home | level }
+ content: BarEnumContent { value: items.showTutorial ? (help | home) : (help | home | level) }
onHelpClicked: displayDialog(dialogHelp)
onPreviousLevelClicked: Activity.previousLevel()
onNextLevelClicked: Activity.nextLevel()
@@ -109,7 +141,7 @@
Score {
id: score
- visible: false
+ visible: !showTutorial
fontSize: background.width >= background.height ? internalTextComponent.largeSize : internalTextComponent.mediumSize
height: internalTextComponent.height + 10
anchors.bottom: bar.top
@@ -143,6 +175,7 @@
Plane {
id: plane
+ visible: !showTutorial
background: background
}
diff --git a/src/activities/planegame/planegame.js b/src/activities/planegame/planegame.js
--- a/src/activities/planegame/planegame.js
+++ b/src/activities/planegame/planegame.js
@@ -52,7 +52,9 @@
dataset = dataset_
numberOfLevel = dataset.length
currentLevel = 0
- initLevel()
+ if(items.showTutorial === false) {
+ initLevel()
+ }
}
function stop() {
@@ -80,8 +82,8 @@
items.movePlaneTimer.stop();
items.cloudCreation.stop()
- items.score.visible = dataset[currentLevel].showNext
items.score.message = dataset[currentLevel].data[currentSubLevel]
+ items.score.visible = dataset[currentLevel].showNext
upPressed = false
downPressed = false
@@ -96,15 +98,15 @@
items.movePlaneTimer.interval = 1000
items.movePlaneTimer.start();
items.cloudCreation.start()
- // Inject the first cloud now
+
+ //Inject the first cloud now
createCloud()
}
function nextLevel() {
if(numberOfLevel <= ++currentLevel) {
currentLevel = 0
}
-
initLevel();
}
diff --git a/src/activities/play_piano/ActivityInfo.qml b/src/activities/play_piano/ActivityInfo.qml
--- a/src/activities/play_piano/ActivityInfo.qml
+++ b/src/activities/play_piano/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("The notes you see will be played to you. Click on the corresponding keys on the keyboard that match the notes you hear and see. Levels 1-5 will offer treble clef to practice and levels 6-10 will offer bass clef.")
credit: qsTr("The synthesizer original code is https://github.com/vsr83/miniSynth")
- section: "discovery sound_group"
+ section: "discovery music"
createdInVersion: 9500
}
diff --git a/src/activities/play_rhythm/ActivityInfo.qml b/src/activities/play_rhythm/ActivityInfo.qml
--- a/src/activities/play_rhythm/ActivityInfo.qml
+++ b/src/activities/play_rhythm/ActivityInfo.qml
@@ -39,6 +39,6 @@
//: Help manual
manual: qsTr("Listen to the rhythm played, and follow along with the music. When you're ready to perform the identical rhythm, click the drum to the rhythm. If you clicked tempo at correct times, another rhythm is displayed. If not, you must try again. Odd levels display a vertical playing line when you click the drum, which helps you see when to click, to follow the rhythm. Click on the drum when the line is in the middle of the notes. Even levels are harder, because there is no vertical playing line. You must read the rhythm, and click it back in tempo. Click the metronome to hear the quarter note tempos. Click on the reload button to replay the rhythm.")
credit: ""
- section: "discovery sound_group"
+ section: "discovery music"
createdInVersion: 9500
}
diff --git a/src/activities/programmingMaze/ActivityInfo.qml b/src/activities/programmingMaze/ActivityInfo.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/ActivityInfo.qml
@@ -0,0 +1,59 @@
+/* GCompris - ActivityInfo.qml
+ *
+ * Copyright (C) 2015 Siddhesh Suthar
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import GCompris 1.0
+
+ActivityInfo {
+ name: "programmingMaze/ProgrammingMaze.qml"
+ difficulty: 3
+ icon: "programmingMaze/programmingMaze.svg"
+ author: "Aman Kumar Gupta <gupta2140@gmail.com>"
+ demo: false
+ //: Activity title
+ title: qsTr("Programming Maze")
+ //: Help title
+ description: qsTr("This activity teaches the kid to program the Tux to its goal using
+ simple instructions like move forward, turn left etc")
+ // intro: "Arrange the instructions and traverse the correct path to reach the fish."
+ //: Help goal
+ goal: qsTr("Tux is hungry. Help him find fish by programming him to the correct ice spot.")
+ //: Help prerequisite
+ prerequisite: qsTr("Can read instructions. Thinking of the path logically")
+ //: Help manual
+ manual: qsTr("Choose the instructions from given menu. Arrange the instruction in an
+ order so that they can make the Tux reach to his goal.
") +
+ qsTr("Keyboard Controls:
") +
+ qsTr("1. To navigate through instructions in the current code area having keyboard focus:") +
+ qsTr("
Arrow keys
") +
+ qsTr("2. To append an instruction from instruction area to the main/procedure code area:") +
+ qsTr("
Select an instruction from the instruction area by pressing SPACE.
") +
+ qsTr("
Navigate to the code areas by pressing TAB, then press SPACE to append the instruction.
") +
+ qsTr("3. To add an instruction at any particular position in the main/procedure code area:") +
+ qsTr("
Navigate to the instruction at that position and press SPACE to add the selected instruction from the instruction area.
") +
+ qsTr("4. To delete the current navigated instruction in the main/procedure code area:") +
+ qsTr("
DELETE.
") +
+ qsTr("5. To edit an instruction in the main/procedure code area:") +
+ qsTr("
Navigate to the instruction to edit using Arrow keys.
") +
+ qsTr("
Press SPACE to select it.
") +
+ qsTr("
Then navigate to the instruction area using TAB and select the new instruction by pressing SPACE.
") +
+ qsTr("6. To run the code or reset Tux when it fails to reach the fish:") +
+ qsTr("
ENTER or RETURN.
")
+ credit: ""
+ section: "fun"
+ createdInVersion: 9800
+}
diff --git a/src/activities/programmingMaze/CMakeLists.txt b/src/activities/programmingMaze/CMakeLists.txt
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/CMakeLists.txt
@@ -0,0 +1 @@
+GCOMPRIS_ADD_RCC(activities/programmingMaze *.qml *.svg *.js resource/*)
diff --git a/src/activities/programmingMaze/CodeArea.qml b/src/activities/programmingMaze/CodeArea.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/CodeArea.qml
@@ -0,0 +1,343 @@
+/* GCompris - CodeArea.qml
+ *
+ * Copyright (C) 2015 Siddhesh Suthar
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Siddhesh Suthar
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "programmingMaze.js" as Activity
+
+GridView {
+ id: codeArea
+ z: 1
+ width: background.width * 0.4
+ height: background.height * 0.29
+ cellWidth: background.buttonWidth
+ cellHeight: background.buttonHeight
+
+ interactive: false
+ model: currentModel
+ clip: true
+
+ highlight: Rectangle {
+ width: buttonWidth
+ height: buttonHeight
+ color: "lightsteelblue"
+ border.width: 3.5 * ApplicationInfo.ratio
+ border.color: "purple"
+ opacity: 0.5
+ z: 11
+ radius: width / 18
+ }
+ highlightFollowsCurrentItem: true
+ highlightMoveDuration: 500
+ keyNavigationWraps: true
+ focus: true
+
+ property ListModel currentModel
+ property int draggedItemIndex: -1
+ property int possibleDropIndex: -1
+ property int possibleDropRemoveIndex: -1
+ property int xCoordinateInPossibleDrop: -1
+ property int yCoordinateInPossibleDrop: -1
+
+ /**
+ * Stores the index of the item which is clicked to edit.
+ *
+ * If the index of the item on 2nd click is same as initialEditItemIndex , then the indicator will become invisible, as it means that initially wanted to edit that instruction, but now we want to deselect it.
+ *
+ * If the index of the item on 2nd click is different from initialEditItemIndex, the edit indicator moves to the new item as we now want to edit that one.
+ */
+ property int initialEditItemIndex: -1
+
+ // Tells if any instruction is selected for editing.
+ property bool isEditingInstruction: false
+
+ signal spaceKeyPressed
+ signal tabKeyPressed
+ signal deleteKeyPressed
+
+ /**
+ * There can be three possibilities here:
+ *
+ * 1. We want to insert an instruction at the currentIndex position.
+ * 2. We want to select an instruction to edit, or deselect it.
+ * 3. We want to append an instruction.
+ */
+ onSpaceKeyPressed: {
+ if(currentIndex != -1) {
+ if(instructionArea.instructionToInsert && (items.numberOfInstructionsAdded < items.maxNumberOfInstructionsAllowed)) {
+ var isInstructionInserted = appendInstruction()
+ if(isInstructionInserted)
+ currentModel.move(currentModel.count - 1, currentIndex, 1)
+ }
+ else {
+ if((initialEditItemIndex == currentIndex) || (initialEditItemIndex == -1 && currentIndex != -1)) {
+ codeArea.isEditingInstruction = !codeArea.isEditingInstruction
+ }
+
+ if(!codeArea.isEditingInstruction)
+ codeArea.initialEditItemIndex = -1
+ else
+ initialEditItemIndex = currentIndex
+
+ var calculatedX = (initialEditItemIndex % 4) * codeArea.cellWidth
+ var calculatedY = Math.floor(initialEditItemIndex / 4) * codeArea.cellHeight
+ editInstructionIndicator.x = calculatedX + 1.5 * ApplicationInfo.ratio
+ editInstructionIndicator.y = calculatedY + 1.5 * ApplicationInfo.ratio
+ }
+ }
+ else if((items.numberOfInstructionsAdded < items.maxNumberOfInstructionsAllowed) && instructionArea.instructionToInsert)
+ appendInstruction()
+ }
+
+ onDeleteKeyPressed: {
+ if(currentIndex != -1) {
+ currentModel.remove(currentIndex)
+ items.numberOfInstructionsAdded--
+ }
+ resetEditingValues()
+ }
+
+ function appendInstruction() {
+ if(background.insertIntoMain || (instructionArea.instructionToInsert != "call-procedure")) {
+ currentModel.append({ "name": instructionArea.instructionToInsert })
+ items.numberOfInstructionsAdded++
+ instructionArea.instructionToInsert = ""
+ return true
+ }
+ return false
+ }
+
+ function resetEditingValues() {
+ initialEditItemIndex = -1
+ isEditingInstruction = false
+ }
+
+ Item {
+ id: dropPositionIndicator
+ visible: false
+ height: background.buttonHeight
+ width: 3 * ApplicationInfo.ratio
+
+ Rectangle {
+ visible: parent.visible
+ anchors.centerIn: parent
+ width: parent.width
+ height: parent.height - 3 * ApplicationInfo.ratio
+ color: "blue"
+ radius: width
+ }
+
+ states: [
+ State {
+ name: "shown"
+ when: codeArea.possibleDropIndex != -1
+ PropertyChanges {
+ target: dropPositionIndicator
+ visible: true
+ x: Math.floor(codeArea.xCoordinateInPossibleDrop / codeArea.cellWidth) *
+ codeArea.cellWidth - 1.5 * ApplicationInfo.ratio
+ y: Math.floor(codeArea.yCoordinateInPossibleDrop / codeArea.cellHeight) *
+ codeArea.cellHeight + 1.5 * ApplicationInfo.ratio
+ }
+ }
+ ]
+ }
+
+ Rectangle {
+ id: editInstructionIndicator
+ visible: codeArea.isEditingInstruction && codeArea.count != 0
+ width: background.buttonWidth - 3 * ApplicationInfo.ratio
+ height: background.buttonHeight - 3 * ApplicationInfo.ratio
+ color: "red"
+ border.color: "black"
+ border.width: 1.5 * ApplicationInfo.ratio
+ opacity: 0.2
+ radius: width / 18
+ }
+
+ MouseArea {
+ id: codeAreaMouse
+ anchors.fill: parent
+ enabled: items.isTuxMouseAreaEnabled || items.isRunCodeEnabled
+ onPressed: {
+ codeArea.draggedItemIndex = codeArea.indexAt(mouseX,mouseY)
+ if(codeArea.draggedItemIndex === -1) {
+ constraintInstruction.changeConstraintInstructionOpacity()
+ codeArea.isEditingInstruction = false
+ }
+ else if(!codeArea.isEditingInstruction)
+ codeArea.initialEditItemIndex = codeArea.draggedItemIndex
+ }
+
+ onPositionChanged: {
+ var newPos = codeArea.indexAt(mouseX, mouseY)
+ var calculatedX = Math.floor(mouseX / codeArea.cellWidth) * codeArea.cellWidth
+ var previousIndexPosition = codeArea.indexAt(calculatedX - 1, mouseY)
+
+ // If the user want to move an item to the end, then the new position will be after the last instruction.
+ if(newPos == -1 && previousIndexPosition != -1)
+ newPos = previousIndexPosition + 1
+
+ codeArea.isEditingInstruction = false
+ codeArea.xCoordinateInPossibleDrop = mouseX
+ codeArea.yCoordinateInPossibleDrop = mouseY
+ codeArea.possibleDropIndex = newPos
+ }
+
+ onReleased: {
+ if(codeArea.draggedItemIndex != -1) {
+ var draggedIndex = codeArea.draggedItemIndex
+ var dropIndex = codeArea.indexAt(mouseX,mouseY)
+ var calculatedX = Math.floor(mouseX / codeArea.cellWidth) * codeArea.cellWidth
+ var calculatedY = Math.floor(mouseY / codeArea.cellHeight) * codeArea.cellHeight
+ codeArea.draggedItemIndex = -1
+
+ if(dropIndex == -1) {
+ var previousIndexPosition = codeArea.indexAt(calculatedX - 1, mouseY)
+ if(previousIndexPosition == -1) {
+ currentModel.remove(draggedIndex)
+ items.numberOfInstructionsAdded--
+ }
+ else {
+ currentModel.append(currentModel.get(draggedIndex))
+ currentModel.remove(draggedIndex)
+ }
+ codeArea.initialEditItemIndex = -1
+ }
+ else if(draggedIndex != dropIndex) {
+ if(dropIndex <= draggedIndex) {
+ // Moving instruction from right to left
+ currentModel.move(draggedIndex, dropIndex, 1)
+ }
+ else {
+ // Moving instruction from left to right
+ currentModel.move(draggedIndex, dropIndex - 1, 1)
+ }
+ codeArea.initialEditItemIndex = -1
+ }
+ else {
+ /**
+ * If the index of the initially selected instruction (if any) is same as the currently selected instruction,
+ * deselect it for editing, else make the current instruction as the initially editable item and move the edit indicator to that position.
+ */
+ if(codeArea.initialEditItemIndex == dropIndex) {
+ codeArea.isEditingInstruction = !codeArea.isEditingInstruction
+ if(!codeArea.isEditingInstruction)
+ codeArea.initialEditItemIndex = -1
+ }
+ else
+ codeArea.initialEditItemIndex = draggedIndex
+
+ editInstructionIndicator.x = calculatedX + 1.5 * ApplicationInfo.ratio
+ editInstructionIndicator.y = calculatedY + 1.5 * ApplicationInfo.ratio
+ }
+ codeArea.possibleDropIndex = -1
+ }
+ }
+ }
+
+ delegate: Item {
+ id: itemParent
+ width: background.buttonWidth
+ height: background.buttonHeight
+
+ Rectangle {
+ id: circlePlaceholder
+ width: 30 * ApplicationInfo.ratio
+ height: width
+ radius: width
+ anchors.centerIn: parent
+ color: "#cecece"
+ opacity: 0
+ }
+
+ Item {
+ id: item
+ width: background.buttonWidth
+ height: background.buttonHeight
+ state: "inactive"
+ opacity: 1
+
+ Behavior on width { NumberAnimation { duration: 300; easing.type: Easing.InOutQuad } }
+ Behavior on height { NumberAnimation { duration: 300; easing.type: Easing.InOutQuad } }
+ Behavior on opacity {NumberAnimation { duration: 300; easing.type: Easing.InOutQuad } }
+
+ states: [
+ State {
+ name: "inDrag"
+ when: index == codeArea.draggedItemIndex
+
+ PropertyChanges { target: circlePlaceholder; opacity: 1 }
+ PropertyChanges { target: item; parent: codeArea }
+ PropertyChanges { target: item; width: background.buttonWidth * 0.80 }
+ PropertyChanges { target: item; height: background.buttonHeight * 0.80 }
+ PropertyChanges { target: item; anchors.centerIn: undefined }
+ PropertyChanges { target: item; x: codeAreaMouse.mouseX - item.width / 2 }
+ PropertyChanges { target: item; y: codeAreaMouse.mouseY - item.height / 2 }
+ },
+ State {
+ name: "greyedOut"
+ when: (codeArea.draggedItemIndex != -1) && (codeArea.draggedItemIndex != index)
+
+ PropertyChanges { target: item; opacity: 0.7 }
+ },
+ State {
+ name: "inactive"
+ when: (codeArea.draggedItemIndex == -1) || (codeArea.draggedItemIndex == index)
+
+ PropertyChanges { target: item; opacity: 1.0 }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ from: "inDrag"
+ to: "*"
+ PropertyAnimation {
+ target: item
+ properties: "scale, opacity"
+ from: 0.7
+ to: 1.0
+ duration: 200
+ }
+ }
+ ]
+
+ Rectangle {
+ width: parent.width - 3 * ApplicationInfo.ratio
+ height: parent.height - 3 * ApplicationInfo.ratio
+ border.width: 1.2 * ApplicationInfo.ratio
+ border.color: "black"
+ anchors.centerIn: parent
+ radius: width / 18
+
+ Image {
+ id: codeAreaIcon
+ source: Activity.url + name + ".svg"
+ sourceSize { width: parent.width / 1.2; height: parent.height / 1.2 }
+ anchors.centerIn: parent
+ }
+ }
+ }
+ }
+}
diff --git a/src/activities/programmingMaze/Dataset.qml b/src/activities/programmingMaze/Dataset.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/Dataset.qml
@@ -0,0 +1,248 @@
+/* GCompris - Dataset.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+
+QtObject {
+ property var levels: [
+ // Level one
+ {
+ "map": [
+ {'x': 1, 'y': 2},
+ {'x': 2, 'y': 2},
+ {'x': 3, 'y': 2}
+ ],
+ "fish": {'x': 3, 'y': 2},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right"
+ ],
+ "maxNumberOfInstructions": 4
+ },
+ // Level two
+ {
+ "map": [
+ {'x': 1, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 2, 'y': 2},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 1}
+ ],
+ "fish": {'x': 3, 'y': 1},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right"
+ ],
+ "maxNumberOfInstructions": 8
+ },
+ // Level three
+ {
+ "map": [
+ {'x': 0, 'y': 3},
+ {'x': 0, 'y': 2},
+ {'x': 0, 'y': 1},
+ {'x': 1, 'y': 1},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 1},
+ {'x': 3, 'y': 2},
+ {'x': 3, 'y': 3},
+ {'x': 2, 'y': 3}
+ ],
+ "fish": {'x': 2, 'y': 3},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right"
+ ],
+ "maxNumberOfInstructions": 14
+ },
+ // Level four
+ {
+ "map": [
+ {'x': 0, 'y': 1},
+ {'x': 1, 'y': 1},
+ {'x': 1, 'y': 0},
+ {'x': 2, 'y': 0},
+ {'x': 3, 'y': 0},
+ {'x': 4, 'y': 0},
+ {'x': 1, 'y': 2},
+ {'x': 1, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 3, 'y': 3},
+ {'x': 4, 'y': 3},
+ {'x': 4, 'y': 2}
+ ],
+ "fish": {'x': 4, 'y': 2},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right"
+ ],
+ "maxNumberOfInstructions": 14
+ },
+ // Level five
+ {
+ "map": [
+ {'x': 0, 'y': 1},
+ {'x': 0, 'y': 0},
+ {'x': 1, 'y': 0},
+ {'x': 2, 'y': 0},
+ {'x': 3, 'y': 0},
+ {'x': 4, 'y': 0},
+ {'x': 0, 'y': 2},
+ {'x': 0, 'y': 3},
+ {'x': 1, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 3, 'y': 3},
+ {'x': 4, 'y': 3},
+ {'x': 2, 'y': 1},
+ {'x': 2, 'y': 2},
+ {'x': 4, 'y': 2}
+ ],
+ "fish": {'x': 4, 'y': 2},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right"
+ ],
+ "maxNumberOfInstructions": 15
+ },
+ // Level six
+ {
+ "map": [
+ {'x': 1, 'y': 1},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 1},
+ {'x': 3, 'y': 2},
+ {'x': 3, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 1, 'y': 3}
+ ],
+ "fish": {'x': 1, 'y': 3},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right",
+ "call-procedure"
+ ],
+ "maxNumberOfInstructions": 7
+ },
+ // Level seven
+ {
+ "map": [
+ {'x': 0, 'y': 3},
+ {'x': 1, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 2, 'y': 2},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 1},
+ {'x': 4, 'y': 1},
+ {'x': 4, 'y': 2},
+ {'x': 4, 'y': 3}
+ ],
+ "fish": {'x': 4, 'y': 3},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right",
+ "call-procedure"
+ ],
+ "maxNumberOfInstructions": 10
+ },
+ // Level eight
+ {
+ "map": [
+ {'x': 0, 'y': 3},
+ {'x': 1, 'y': 3},
+ {'x': 1, 'y': 2},
+ {'x': 2, 'y': 2},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 1},
+ {'x': 3, 'y': 0},
+ {'x': 4, 'y': 0}
+ ],
+ "fish": {'x': 4, 'y': 0},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right",
+ "call-procedure"
+ ],
+ "maxNumberOfInstructions": 12
+ },
+ // Level nine
+ {
+ "map": [
+ {'x': 1, 'y': 1},
+ {'x': 0, 'y': 0},
+ {'x': 1, 'y': 0},
+ {'x': 2, 'y': 0},
+ {'x': 2, 'y': 1},
+ {'x': 3, 'y': 0},
+ {'x': 4, 'y': 0},
+ {'x': 4, 'y': 1},
+ {'x': 4, 'y': 2},
+ {'x': 4, 'y': 3},
+ {'x': 3, 'y': 3},
+ {'x': 2, 'y': 3},
+ {'x': 1, 'y': 3},
+ {'x': 0, 'y': 3},
+ {'x': 0, 'y': 2}
+ ],
+ "fish": {'x': 0, 'y': 2},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right",
+ "call-procedure"
+ ],
+ "maxNumberOfInstructions": 14
+ },
+ // Level ten
+ {
+ "map": [
+ {'x': 0, 'y': 3},
+ {'x': 0, 'y': 2},
+ {'x': 0, 'y': 1},
+ {'x': 0, 'y': 0},
+ {'x': 1, 'y': 0},
+ {'x': 2, 'y': 0},
+ {'x': 2, 'y': 1},
+ {'x': 2, 'y': 2},
+ {'x': 2, 'y': 3},
+ {'x': 3, 'y': 3},
+ {'x': 4, 'y': 3},
+ {'x': 4, 'y': 2},
+ {'x': 4, 'y': 1},
+ {'x': 4, 'y': 0}
+ ],
+ "fish": {'x': 4, 'y': 0},
+ "instructions": [
+ "move-forward",
+ "turn-left",
+ "turn-right",
+ "call-procedure"
+ ],
+ "maxNumberOfInstructions": 15
+ }
+ ]
+}
diff --git a/src/activities/programmingMaze/HeaderArea.qml b/src/activities/programmingMaze/HeaderArea.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/HeaderArea.qml
@@ -0,0 +1,63 @@
+/* GCompris - HeaderArea.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../core"
+
+Rectangle {
+ id: header
+ width: background.width * 0.4
+ height: background.height / 10
+ border.width: 2 * ApplicationInfo.ratio
+ border.color: "black"
+ color: "transparent"
+
+ property real headerOpacity
+ property string headerText
+
+ signal clicked
+
+ Image {
+ width: parent.width - 2 * parent.border.width
+ height: parent.height - 2 * parent.border.width
+ anchors.centerIn: parent
+ source: "qrc:/gcompris/src/activities/guesscount/resource/backgroundW02.svg"
+ opacity: header.headerOpacity
+
+ GCText {
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ width: parent.width
+ height: parent.height
+ fontSizeMode: Font.DemiBold
+ minimumPointSize: 7
+ fontSize: mediumSize
+ wrapMode: Text.WordWrap
+ color: "white"
+ text: header.headerText
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: header.clicked()
+ }
+}
diff --git a/src/activities/programmingMaze/InstructionArea.qml b/src/activities/programmingMaze/InstructionArea.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/InstructionArea.qml
@@ -0,0 +1,182 @@
+/* GCompris - InstructionArea.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../core"
+
+import "programmingMaze.js" as Activity
+
+GridView {
+ id: instructionArea
+ width: parent.width * 0.5
+ height: parent.height * 0.17
+ cellWidth: background.buttonWidth
+ cellHeight: background.buttonHeight
+
+ anchors.left: parent.left
+ anchors.top: mazeModel.bottom
+ anchors.topMargin: background.height * 0.4
+
+ interactive: false
+ model: instructionModel
+
+ header: HeaderArea {
+ width: instructionArea.width
+ height: background.height / 11
+ headerOpacity: 1
+ headerText: qsTr("Choose the instructions")
+ }
+
+ property string instructionToInsert
+
+ signal spaceKeyPressed
+ signal tabKeyPressed
+
+ onSpaceKeyPressed: {
+ if(instructionArea.currentIndex != -1)
+ instructionArea.currentItem.selectCurrentInstruction()
+ }
+
+ onTabKeyPressed: {
+ instructionArea.currentIndex = -1
+ background.areaWithKeyboardInput = mainFunctionCodeArea
+ }
+
+ highlight: Rectangle {
+ width: buttonWidth - 3 * ApplicationInfo.ratio
+ height: buttonHeight * 1.18 - 3 * ApplicationInfo.ratio
+ color: "lightsteelblue"
+ border.width: 3.5 * ApplicationInfo.ratio
+ border.color: "purple"
+ z: 2
+ radius: width / 18
+ opacity: 0.6
+ visible: activity.keyboardNavigationVisible
+ }
+ highlightFollowsCurrentItem: true
+ keyNavigationWraps: true
+
+ delegate: Item {
+ id: instructionItem
+ width: background.buttonWidth
+ height: background.buttonHeight * 1.18
+
+ Rectangle {
+ id: imageHolder
+ width: parent.width - 3 * ApplicationInfo.ratio
+ height: parent.height - 3 * ApplicationInfo.ratio
+ border.width: 1.2 * ApplicationInfo.ratio
+ border.color: "black"
+ anchors.centerIn: parent
+ radius: width / 18
+
+ Image {
+ id: icon
+ source: Activity.url + name + ".svg"
+ sourceSize {
+ width: parent.width / 1.2
+ height: parent.height / 1.2
+ }
+ anchors.centerIn: parent
+ }
+ }
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ enabled: (items.isTuxMouseAreaEnabled || items.isRunCodeEnabled) && ((items.numberOfInstructionsAdded < items.maxNumberOfInstructionsAllowed) || procedureCodeArea.isEditingInstruction || mainFunctionCodeArea.isEditingInstruction)
+
+ onPressed: instructionItem.checkModelAndInsert()
+ }
+
+ function selectCurrentInstruction() {
+ if(!mainFunctionCodeArea.isEditingInstruction && !procedureCodeArea.isEditingInstruction) {
+ instructionArea.instructionToInsert = name
+ playClickedAnimation()
+ }
+ else {
+ if(mainFunctionCodeArea.isEditingInstruction)
+ insertIntoModel(mainFunctionModel, mainFunctionCodeArea)
+ if(procedureCodeArea.isEditingInstruction && (name != Activity.CALL_PROCEDURE))
+ insertIntoModel(procedureModel, procedureCodeArea)
+ }
+ }
+
+ function checkModelAndInsert() {
+ if(items.constraintInstruction.opacity)
+ items.constraintInstruction.hide()
+
+ if(!background.insertIntoMain && (name != Activity.CALL_PROCEDURE))
+ insertIntoModel(procedureModel, procedureCodeArea)
+ else if(background.insertIntoMain)
+ insertIntoModel(mainFunctionModel, mainFunctionCodeArea)
+ }
+
+ /**
+ * If we are adding an instruction, append it to the model if number of instructions added is less than the maximum number of instructions allowed.
+ * If editing, replace it with the selected instruction in the code area.
+ */
+ function insertIntoModel(model, area) {
+ if(!area.isEditingInstruction) {
+ if(items.numberOfInstructionsAdded >= items.maxNumberOfInstructionsAllowed)
+ constraintInstruction.changeConstraintInstructionOpacity()
+ else {
+ playClickedAnimation()
+ model.append({ "name": name })
+ items.numberOfInstructionsAdded++
+ }
+ }
+ else {
+ playClickedAnimation()
+ model.set(area.initialEditItemIndex, {"name": name}, 1)
+ area.resetEditingValues()
+ }
+ }
+
+ /**
+ * If two successive clicks on the same icon are made very fast, stop the ongoing animation and set the scale back to 1.
+ * Then start the animation for next click.
+ * This gives proper feedback of multiple clicks.
+ */
+ function playClickedAnimation() {
+ clickedAnimation.stop()
+ icon.scale = 1
+ clickedAnimation.start()
+ }
+
+ SequentialAnimation {
+ id: clickedAnimation
+ PropertyAnimation {
+ target: imageHolder
+ property: "scale"
+ to: 0.8
+ duration: 150
+ }
+
+ PropertyAnimation {
+ target: imageHolder
+ property: "scale"
+ to: 1
+ duration: 150
+ }
+ }
+ }
+}
diff --git a/src/activities/programmingMaze/ProgrammingMaze.qml b/src/activities/programmingMaze/ProgrammingMaze.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/ProgrammingMaze.qml
@@ -0,0 +1,410 @@
+/* GCompris - ProgrammingMaze.qml
+ *
+ * Copyright (C) 2015 Siddhesh Suthar
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Siddhesh Suthar
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+import "../../core"
+
+import "programmingMaze.js" as Activity
+
+ActivityBase {
+ id: activity
+
+ onStart: focus = true
+ onStop: {}
+
+ property int oldWidth: width
+ onWidthChanged: {
+ Activity.repositionObjectsOnWidthChanged(width / oldWidth)
+ oldWidth = width
+ }
+
+ property int oldHeight: height
+ onHeightChanged: {
+ Activity.repositionObjectsOnHeightChanged(height / oldHeight)
+ oldHeight = height
+ }
+
+ property bool keyboardNavigationVisible: false
+ property string mode: "basic"
+ property string datasetUrl: "qrc:/gcompris/src/activities/programmingMaze/Dataset.qml"
+
+ pageComponent: Image {
+ id: background
+ source: "qrc:/gcompris/src/activities/programmingMaze/resource/background.svg"
+ fillMode: Image.PreserveAspectCrop
+ sourceSize.width: parent.width
+
+ signal start
+ signal stop
+
+ property bool insertIntoMain: true
+ property alias items: items
+ property int buttonWidth: background.width / 10
+ property int buttonHeight: background.height / 15.3
+
+ Component.onCompleted: {
+ activity.start.connect(start)
+ activity.stop.connect(stop)
+ }
+
+ // Add here the QML items you need to access in javascript
+ QtObject {
+ id: items
+ property Item main: activity.main
+ property alias background: background
+ property alias bar: bar
+ property alias bonus: bonus
+ property GCSfx audioEffects: activity.audioEffects
+ property alias mazeModel: mazeModel
+ property alias instructionModel: instructionModel
+ property alias mainFunctionModel: mainFunctionModel
+ property alias mainFunctionCodeArea: mainFunctionCodeArea
+ property alias procedureModel: procedureModel
+ property alias procedureCodeArea: procedureCodeArea
+ property alias instructionArea: instructionArea
+ property alias player: player
+ property alias constraintInstruction: constraintInstruction
+ property alias tutorialImage: tutorialImage
+ property alias fish: fish
+ property alias dataset: dataset
+ property bool isRunCodeEnabled: true
+ property bool isTuxMouseAreaEnabled: false
+ property bool currentLevelContainsProcedure
+ property int maxNumberOfInstructionsAllowed
+ property int numberOfInstructionsAdded
+ }
+
+ // This function catches the signal emitted after completion of movement of Tux after executing each instruction.
+ function checkSuccessAndExecuteNextInstruction() {
+ Activity.checkSuccessAndExecuteNextInstruction()
+ }
+
+ // This function catches the signal emitted after finding a dead-end in any of the executing instruction.
+ function deadEnd() {
+ Activity.deadEnd()
+ }
+
+ Loader {
+ id: dataset
+ }
+
+ onStart: { Activity.start(items, mode, datasetUrl) }
+ onStop: { Activity.stop() }
+
+ property var areaWithKeyboardInput: instructionArea
+
+ onAreaWithKeyboardInputChanged: activeCodeAreaIndicator.changeActiveCodeAreaIndicator(areaWithKeyboardInput)
+
+ Keys.enabled: items.isTuxMouseAreaEnabled || items.isRunCodeEnabled
+ Keys.onPressed: {
+ activity.keyboardNavigationVisible = true
+ if(event.key === Qt.Key_Left)
+ areaWithKeyboardInput.moveCurrentIndexLeft()
+ if(event.key === Qt.Key_Right)
+ areaWithKeyboardInput.moveCurrentIndexRight()
+ if(event.key === Qt.Key_Up)
+ areaWithKeyboardInput.moveCurrentIndexUp()
+ if(event.key === Qt.Key_Down)
+ areaWithKeyboardInput.moveCurrentIndexDown()
+ if(event.key === Qt.Key_Space)
+ areaWithKeyboardInput.spaceKeyPressed()
+ if(event.key === Qt.Key_Enter || event.key === Qt.Key_Return)
+ runCodeOrResetTux()
+ if(event.key === Qt.Key_Tab)
+ areaWithKeyboardInput.tabKeyPressed()
+ if(event.key === Qt.Key_Delete && activeCodeAreaIndicator.top != instructionArea.top) {
+ areaWithKeyboardInput.deleteKeyPressed()
+ }
+ }
+
+ function runCodeOrResetTux() {
+ if(!Activity.deadEndPoint)
+ runCodeMouseArea.executeCode()
+ else
+ Activity.initLevel()
+ }
+
+ ListModel {
+ id: instructionModel
+ }
+
+ ListModel {
+ id: mainFunctionModel
+ }
+
+ ListModel {
+ id: procedureModel
+ }
+
+ Rectangle {
+ id: constraintInstruction
+ anchors.left: parent.left
+ anchors.bottom: runCode.top
+ width: parent.width / 2.3
+ height: parent.height / 8.9
+ radius: 10
+ z: 3
+ color: "#E8E8E8" //paper white
+ border.width: 3 * ApplicationInfo.ratio
+ border.color: "#87A6DD" //light blue
+
+ Behavior on opacity { PropertyAnimation { duration: 200 } }
+
+ function changeConstraintInstructionOpacity() {
+ if(opacity)
+ constraintInstruction.hide()
+ else
+ constraintInstruction.show()
+ }
+
+ function show() {
+ if(instructionText.text)
+ opacity = 0.8
+ }
+ function hide() {
+ opacity = 0
+ }
+
+ GCText {
+ id: instructionText
+ anchors.fill: parent
+ anchors.margins: parent.border.width
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ fontSizeMode: Text.Fit
+ wrapMode: Text.WordWrap
+
+ readonly property string resetTuxInstructionText: qsTr("Click on Tux or press Enter key to reset it or RELOAD button to reload the level.")
+ readonly property string constraintInstructionText: qsTr("Reach the fish in less than %1 instructions.").arg(items.maxNumberOfInstructionsAllowed + 1)
+
+ text: items.isTuxMouseAreaEnabled ? resetTuxInstructionText : constraintInstructionText
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: constraintInstruction.changeConstraintInstructionOpacity()
+ }
+
+ Repeater {
+ id: mazeModel
+
+ anchors.left: parent.left
+ anchors.top: parent.top
+
+ Image {
+ x: modelData.x * width
+ y: modelData.y * height
+ width: background.width / 10
+ height: (background.height - background.height / 10) / 10
+ source: Activity.reverseCountUrl + "iceblock.svg"
+ }
+ }
+
+ Image {
+ id: fish
+ sourceSize.width: background.width / 12
+ source: Activity.reverseCountUrl + "blue-fish.svg"
+ }
+
+ Image {
+ id: player
+ source: "qrc:/gcompris/src/activities/maze/resource/tux_top_south.svg"
+ sourceSize.width: background.width / 12
+ z: 1
+ property int duration: 1000
+ readonly property real playerCenterX: x + width / 2
+ readonly property real playerCenterY: y + height / 2
+
+ MouseArea {
+ id: tuxMouseArea
+ anchors.fill: parent
+ enabled: items.isTuxMouseAreaEnabled
+ onClicked: {
+ Activity.initLevel()
+ }
+ }
+ }
+
+ Rectangle {
+ id: activeCodeAreaIndicator
+ opacity: 0.5
+ visible: activity.keyboardNavigationVisible
+
+ function changeActiveCodeAreaIndicator(activeArea) {
+ anchors.top = activeArea.top
+ anchors.fill = activeArea
+ }
+ }
+
+ InstructionArea {
+ id: instructionArea
+ }
+
+ HeaderArea {
+ id: mainFunctionHeader
+ headerText: qsTr("Main function")
+ headerOpacity: background.insertIntoMain ? 1 : 0.5
+ onClicked: background.insertIntoMain = true
+ anchors.top: parent.top
+ anchors.right: parent.right
+ }
+
+ CodeArea {
+ id: mainFunctionCodeArea
+ currentModel: mainFunctionModel
+ anchors.right: parent.right
+ anchors.top: mainFunctionHeader.bottom
+
+ onTabKeyPressed: {
+ mainFunctionCodeArea.currentIndex = -1
+ if(!items.currentLevelContainsProcedure) {
+ background.areaWithKeyboardInput = instructionArea
+ instructionArea.currentIndex = 0
+ }
+ else {
+ background.areaWithKeyboardInput = procedureCodeArea
+ background.insertIntoMain = false
+ }
+ }
+ }
+
+ HeaderArea {
+ id: procedureHeader
+ headerText: qsTr("Procedure")
+ headerOpacity: !background.insertIntoMain ? 1 : 0.5
+ visible: procedureCodeArea.visible
+ onClicked: background.insertIntoMain = false
+ anchors.top: mainFunctionCodeArea.bottom
+ anchors.right: parent.right
+ }
+
+ CodeArea {
+ id: procedureCodeArea
+ currentModel: procedureModel
+ anchors.right: parent.right
+ anchors.top: procedureHeader.bottom
+ visible: items.currentLevelContainsProcedure
+
+ property alias procedureIterator: procedureCodeArea.currentIndex
+
+ onTabKeyPressed: {
+ procedureCodeArea.currentIndex = -1
+ background.areaWithKeyboardInput = instructionArea
+ instructionArea.currentIndex = 0
+ background.insertIntoMain = true
+ }
+ }
+
+ Image {
+ id: runCode
+ width: background.width / 10
+ height: background.height / 10
+ anchors.right: instructionArea.right
+ anchors.bottom: bar.top
+ anchors.margins: 10 * ApplicationInfo.ratio
+
+ source:"qrc:/gcompris/src/core/resource/bar_ok.svg"
+ fillMode: Image.PreserveAspectFit
+
+ MouseArea {
+ id: runCodeMouseArea
+ anchors.fill: parent
+ hoverEnabled: ApplicationInfo.isMobile ? false : (!items.isRunCodeEnabled ? false : true)
+ enabled: items.isRunCodeEnabled
+
+ signal executeCode
+
+ onEntered: runCode.scale = 1.1
+ onExecuteCode: {
+ if(mainFunctionModel.count)
+ startCodeExecution()
+ }
+ onClicked: executeCode()
+ onExited: runCode.scale = 1
+
+ function startCodeExecution() {
+ runCodeClickAnimation.start()
+ Activity.resetCodeAreasIndices()
+
+ if(constraintInstruction.opacity)
+ constraintInstruction.hide()
+
+ Activity.runCode()
+ }
+ }
+
+ SequentialAnimation {
+ id: runCodeClickAnimation
+ NumberAnimation { target: runCode; property: "scale"; to: 0.8; duration: 100 }
+ NumberAnimation { target: runCode; property: "scale"; to: 1.0; duration: 100 }
+ }
+ }
+
+ Image {
+ id: tutorialImage
+ source: "qrc:/gcompris/src/activities/guesscount/resource/backgroundW01.svg"
+ anchors.fill: parent
+ z: 5
+ visible: true
+
+ property bool shownProcedureTutorialInstructions: false
+
+ Tutorial {
+ id:tutorialSection
+ tutorialDetails: bar.level <= 2 ? Activity.mainTutorialInstructions : Activity.procedureTutorialInstructions
+ onSkipPressed: {
+ Activity.initLevel()
+ tutorialImage.visible = false
+ tutorialNumber = 0
+ }
+ }
+ onVisibleChanged: {
+ if(tutorialImage.visible && tutorialImage.shownProcedureTutorialInstructions)
+ tutorialSection.visible = true
+ }
+ }
+
+ DialogHelp {
+ id: dialogHelp
+ onClose: home()
+ }
+
+ Bar {
+ id: bar
+ content: BarEnumContent { value: tutorialImage.visible ? help | home : help | home | level | reload }
+ onHelpClicked: {
+ displayDialog(dialogHelp)
+ }
+ onPreviousLevelClicked: Activity.previousLevel()
+ onNextLevelClicked: Activity.nextLevel()
+ onHomeClicked: activity.home()
+ onReloadClicked: Activity.reloadLevel()
+ }
+
+ Bonus {
+ id: bonus
+ Component.onCompleted: win.connect(Activity.nextLevel)
+ }
+ }
+}
diff --git a/src/activities/programmingMaze/programmingMaze.js b/src/activities/programmingMaze/programmingMaze.js
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/programmingMaze.js
@@ -0,0 +1,358 @@
+/* GCompris - programmingMaze.js
+ *
+ * Copyright (C) 2015 Siddhesh Suthar
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Authors:
+ * Siddhesh Suthar
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+.pragma library
+.import QtQuick 2.6 as Quick
+.import GCompris 1.0 as GCompris //for ApplicationInfo
+
+// possible instructions
+var MOVE_FORWARD = "move-forward"
+var TURN_LEFT = "turn-left"
+var TURN_RIGHT = "turn-right"
+var CALL_PROCEDURE = "call-procedure"
+
+var mazeBlocks
+
+// Length of 1 step along x-axis
+var stepX
+
+// Length of 1 step along y-axis
+var stepY
+
+/**
+ * Lookup tables of instruction objects for main and procedure areas which will be stored here on creation and can be
+ * accessed when required to execute.
+ */
+var mainInstructionObjects = []
+var procedureInstructionObjects = []
+
+// New rotation of Tux on turning.
+var changedRotation
+
+// Indicates if there is a dead-end
+var deadEndPoint = false
+
+// Stores the index of mainInstructionObjects[] which is going to be processed
+var codeIterator = 0
+
+/**
+ * Stores if the reset is done only when Tux is clicked.
+ *
+ * If resetTux is true, initLevel() is called and the instruction areas are not cleared.
+ *
+ * Else, it means that initLevel() is called to reset the entire level and the instruction areas are cleared as well.
+ */
+var resetTux = false
+
+// Duration of movement of highlight in the execution area.
+var moveAnimDuration
+
+//Stores the currrent instruction which is going to be processed
+var currentInstruction
+
+var url = "qrc:/gcompris/src/activities/programmingMaze/resource/"
+var reverseCountUrl = "qrc:/gcompris/src/activities/reversecount/resource/"
+var currentLevel = 0
+var numberOfLevel
+var items
+
+var NORTH = 0
+var WEST = 90
+var SOUTH = 180
+var EAST = 270
+
+/**
+ * Stores the qml file components of all the instructions used in the activity.
+ *
+ * To add a new instruction, add its component here and add the instruction name in "instructionList" inside createInstructionObjects() along with the other instructions.
+ */
+var instructionComponents = {
+ "move-forward": Qt.createComponent(url + "instructions/MoveForward.qml"),
+ "turn-left": Qt.createComponent(url + "instructions/TurnLeftOrRight.qml"),
+ "turn-right": Qt.createComponent(url + "instructions/TurnLeftOrRight.qml"),
+ "call-procedure": Qt.createComponent(url + "instructions/Procedure.qml")
+}
+
+var mainTutorialInstructions = [
+ {
+ "instruction": qsTr("Instruction Area:" +
+ "There are 3 instructions which you have to use to code and make Tux reach the fish:" +
+ "
1. Move forward:
Moves Tux one step forward in the direction it is facing." +
+ "
2. Turn left:
Turns Tux in the left direction from where it is facing." +
+ "
3. Turn right:
Turns Tux in the right direction from where it is facing."),
+ "instructionImage": "qrc:/gcompris/src/activities/programmingMaze/resource/tutorial1.png"
+ },
+ {
+ "instruction": qsTr("Main Function:" +
+ "
-The execution of code starts here on running.
" +
+ "
-Click on any instruction in the instruction area to add them to the Main Function
" +
+ "
-The instructions will execute in order until there's none left, dead-end or Tux reaches the fish.
-Procedure is a reusable set of instructions which can be used in a code by calling it where needed.
" +
+ "
-To switch between the Procedure area and Main Function area to add your code, click on the label Procedure or Main Function.
"),
+ "instructionImage": "qrc:/gcompris/src/activities/programmingMaze/resource/tutorial3.png"
+ },
+ ]
+
+// Mode of the activity: basic or loop
+var activityMode
+
+function start(items_, mode_, datasetUrl_) {
+ items = items_
+ items.dataset.source = datasetUrl_
+ activityMode = mode_
+ currentLevel = 0
+ mazeBlocks = items.dataset.item.levels
+ numberOfLevel = mazeBlocks.length
+ resetTux = false
+ initLevel()
+}
+
+function stop() {
+ destroyInstructionObjects()
+}
+
+/**
+ * This function creates and populate instruction objects for main as well as procedure area.
+ *
+ * These are stored in the lookup table, provided in the parameter as "instructionObjects".
+ * The instructions are then connected to the slots of their code area (main or procedure), provided as "instructionCodeArea" in the parameter.
+ *
+ * The instructions can now be obtained from the look-up tables and executed when called.
+ *
+ * This saves the process of re-creating all the instruction objets, connecting them to their parent's slot and destroying
+ * them everytime for each instruction call which will be very redundant and quite memory consuming on devices with
+ * less RAM, weak processing power and slow performance specially for "loops" mode.
+ *
+ * Hence these look-up table objects will be created and destroyed only once in each level (depending on the need) and can be accessed when needed.
+ */
+function createInstructionObjects(instructionObjects, instructionCodeArea) {
+ var instructionList = [MOVE_FORWARD, TURN_LEFT, TURN_RIGHT]
+ for(var i = 0; i < instructionList.length; i++)
+ createInstruction(instructionObjects, instructionList[i], instructionCodeArea)
+}
+
+function createInstruction(instructionObjects, instructionName, instructionCodeArea) {
+ if(instructionName == TURN_LEFT || instructionName == TURN_RIGHT)
+ instructionObjects[instructionName] = instructionComponents[instructionName].createObject(instructionCodeArea, { "turnDirection": instructionName })
+ else
+ instructionObjects[instructionName] = instructionComponents[instructionName].createObject(instructionCodeArea)
+
+ instructionObjects[instructionName].foundDeadEnd.connect(instructionCodeArea.deadEnd)
+ instructionObjects[instructionName].executionComplete.connect(instructionCodeArea.checkSuccessAndExecuteNextInstruction)
+}
+
+// Destroy instruction objects from the look-up tables
+function destroyInstructionObjects() {
+ var instructionList = Object.keys(mainInstructionObjects)
+ for(var i = 0; i < instructionList.length; i++)
+ mainInstructionObjects[instructionList[i]].destroy()
+
+ instructionList = Object.keys(procedureInstructionObjects)
+ for(var i = 0; i < instructionList.length; i++)
+ procedureInstructionObjects[instructionList[i]].destroy()
+
+ mainInstructionObjects = []
+ procedureInstructionObjects = []
+}
+
+function initLevel() {
+ if(!items || !items.bar)
+ return
+
+ items.bar.level = currentLevel + 1
+ destroyInstructionObjects()
+
+ var levelInstructions = mazeBlocks[currentLevel].instructions
+
+ if(levelInstructions.indexOf(CALL_PROCEDURE) != -1)
+ items.currentLevelContainsProcedure = true
+ else
+ items.currentLevelContainsProcedure = false
+
+ // Create, populate and connect signals of instructions for main function code area and store them in mainInstructionObjects.
+ createInstructionObjects(mainInstructionObjects, items.background)
+
+ if(items.currentLevelContainsProcedure) {
+ if(!items.tutorialImage.shownProcedureTutorialInstructions) {
+ items.tutorialImage.shownProcedureTutorialInstructions = true
+ items.tutorialImage.visible = true
+ }
+
+ // Create procedure object in the main look-up table ,if the level has procedure/loop, to execute it for procedure/loop calls from the main code area.
+ createInstruction(mainInstructionObjects, CALL_PROCEDURE, items.background)
+
+ // Create, populate and connect signals of instructions for procedure code area if the level has procedure/loop.
+ createInstructionObjects(procedureInstructionObjects, mainInstructionObjects[CALL_PROCEDURE])
+ }
+
+ // Stores the co-ordinates of the tile blocks in the current level
+ var currentLevelBlocksCoordinates = mazeBlocks[currentLevel].map
+
+ items.mazeModel.model = currentLevelBlocksCoordinates
+
+ if(!resetTux) {
+ items.mainFunctionModel.clear()
+ items.procedureModel.clear()
+ items.numberOfInstructionsAdded = 0
+ }
+
+ stepX = items.mazeModel.itemAt(0).width
+ stepY = items.mazeModel.itemAt(0).height
+
+ items.instructionModel.clear()
+
+ for (var i = 0; i < levelInstructions.length; i++)
+ items.instructionModel.append({"name":levelInstructions[i]})
+
+ // Center Tux in its first case
+ items.player.x = currentLevelBlocksCoordinates[0].x * stepX + (stepX - items.player.width) / 2
+ items.player.y = currentLevelBlocksCoordinates[0].y * stepY + (stepY - items.player.height) / 2
+ items.player.rotation = EAST
+
+ // Center fish at it's co-ordinate
+ items.fish.x = mazeBlocks[currentLevel].fish.x * stepX + (stepX - items.fish.width) / 2
+ items.fish.y = mazeBlocks[currentLevel].fish.y * stepY + (stepY - items.fish.height) / 2
+
+ changedRotation = EAST
+ deadEndPoint = false
+ moveAnimDuration = 1000
+ items.background.insertIntoMain = true
+ items.mainFunctionCodeArea.highlightMoveDuration = moveAnimDuration / 2
+ items.procedureCodeArea.highlightMoveDuration = moveAnimDuration / 2
+ items.isTuxMouseAreaEnabled = false
+ items.isRunCodeEnabled = true
+ items.maxNumberOfInstructionsAllowed = mazeBlocks[currentLevel].maxNumberOfInstructions
+ items.constraintInstruction.show()
+ items.mainFunctionCodeArea.resetEditingValues()
+ items.procedureCodeArea.resetEditingValues()
+ items.background.areaWithKeyboardInput = items.instructionArea
+ resetCodeAreasIndices()
+ resetTux = false
+ codeIterator = 0
+}
+
+function resetCodeAreasIndices() {
+ items.instructionArea.currentIndex = -1
+ items.mainFunctionCodeArea.currentIndex = -1
+ items.procedureCodeArea.currentIndex = -1
+ items.instructionArea.instructionToInsert = ''
+}
+
+function getPlayerRotation() {
+ return ((changedRotation % 360) + 360) % 360
+}
+
+function runCode() {
+ items.mainFunctionCodeArea.resetEditingValues()
+ items.procedureCodeArea.resetEditingValues()
+
+ var instructionName
+
+ // Append all the procedure instructions to the procedure area object.
+ for(var j = 0; j < items.procedureModel.count; j++) {
+ instructionName = items.procedureModel.get(j).name
+ mainInstructionObjects[CALL_PROCEDURE].procedureCode.append({ "name" : instructionName })
+ }
+
+ items.isRunCodeEnabled = false
+ if(items.mainFunctionModel.count > 0)
+ executeNextInstruction()
+ else
+ deadEnd()
+}
+
+function executeNextInstruction() {
+ if((codeIterator < items.mainFunctionModel.count) && !deadEndPoint) {
+ items.mainFunctionCodeArea.currentIndex += 1
+ var instructionToExecute = items.mainFunctionModel.get(codeIterator).name
+ mainInstructionObjects[instructionToExecute].checkAndExecuteMovement()
+ }
+}
+
+function deadEnd() {
+ deadEndPoint = true
+ resetTux = true
+ items.isTuxMouseAreaEnabled = true
+ items.constraintInstruction.show()
+ items.audioEffects.play("qrc:/gcompris/src/core/resource/sounds/brick.wav")
+ items.bonus.bad("tux")
+}
+
+function checkSuccessAndExecuteNextInstruction() {
+ var fishX = mazeBlocks[currentLevel].fish.x
+ var fishY = mazeBlocks[currentLevel].fish.y
+
+ var tuxX = Math.floor(items.player.playerCenterX / stepX)
+ var tuxY = Math.floor(items.player.playerCenterY / stepY)
+
+ if(tuxX === fishX && tuxY === fishY) {
+ codeIterator = 0
+ items.bonus.good("tux")
+ }
+ else if(codeIterator === (items.mainFunctionModel.count - 1)) {
+ deadEnd()
+ }
+ else {
+ codeIterator++
+ executeNextInstruction()
+ }
+}
+
+function nextLevel() {
+ resetTux = false
+ if(numberOfLevel <= ++currentLevel) {
+ currentLevel = 0
+ }
+ initLevel();
+}
+
+function previousLevel() {
+ resetTux = false
+ if(--currentLevel < 0) {
+ currentLevel = numberOfLevel - 1
+ }
+ initLevel();
+}
+
+function repositionObjectsOnWidthChanged(factor) {
+ resetTux = true
+ if(items)
+ initLevel()
+}
+
+function repositionObjectsOnHeightChanged(factor) {
+ resetTux = true
+ if(items)
+ initLevel()
+}
+
+function reloadLevel() {
+ resetTux = false
+ initLevel()
+}
diff --git a/src/activities/programmingMaze/programmingMaze.svg b/src/activities/programmingMaze/programmingMaze.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/programmingMaze.svg
@@ -0,0 +1,146 @@
+
+
+
+
diff --git a/src/activities/programmingMaze/resource/README b/src/activities/programmingMaze/resource/README
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/README
@@ -0,0 +1,5 @@
+1. turn-left.svg: https://upload.wikimedia.org/wikipedia/commons/5/50/Simpleicons_Interface_undo-circular-arrow.svg By SimpleIcon http://www.simpleicon.com/ (http://www.flaticon.com/packs/simpleicon-interface) [CC BY 3.0 (http://creativecommons.org/licenses/by/3.0)]
+
+2. turn-right.svg: https://upload.wikimedia.org/wikipedia/commons/b/b5/Simpleicons_Interface_redo-circular-arrow.svg By SimpleIcon http://www.simpleicon.com/ (http://www.flaticon.com/packs/simpleicon-interface) [CC BY 3.0 (http://creativecommons.org/licenses/by/3.0)]
+
+3. move-forward.svg: https://www.flaticon.com/free-icon/arrow-pointing-to-up_66757 By Freepik
\ No newline at end of file
diff --git a/src/activities/programmingMaze/resource/background.svg b/src/activities/programmingMaze/resource/background.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/background.svg
@@ -0,0 +1,822 @@
+
+
+
+
diff --git a/src/activities/programmingMaze/resource/call-procedure.svg b/src/activities/programmingMaze/resource/call-procedure.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/call-procedure.svg
@@ -0,0 +1,60 @@
+
+
diff --git a/src/activities/programmingMaze/resource/instructions/Instruction.qml b/src/activities/programmingMaze/resource/instructions/Instruction.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/instructions/Instruction.qml
@@ -0,0 +1,51 @@
+/* GCompris - Instruction.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Author:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../programmingMaze.js" as Activity
+
+Item {
+ id: instruction
+
+ //stores the movement animation duration of Tux when an instruction is executed.
+ property real movementAnimationDuration
+
+ /**
+ * This signal is emitted after the execution of current instruction is complete.
+ *
+ * The signal will be caught by ProgrammingMaze.qml/Procedure.qml depending on with whom the connection is made,
+ * and it will check if Tux has reached the fish(level is complete) or will execute the next instruction.
+ */
+ signal executionComplete
+
+ /**
+ * This signal is emitted if Tux cannot move according to the current executed instruction.
+ *
+ * It will be caught by deadEnd() in its parent file.
+ */
+ signal foundDeadEnd
+
+ function setCodeAreaHighlightMoveDuration() {
+ Activity.items.mainFunctionCodeArea.highlightMoveDuration = movementAnimationDuration
+ Activity.items.procedureCodeArea.highlightMoveDuration = movementAnimationDuration
+ }
+}
diff --git a/src/activities/programmingMaze/resource/instructions/MoveForward.qml b/src/activities/programmingMaze/resource/instructions/MoveForward.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/instructions/MoveForward.qml
@@ -0,0 +1,104 @@
+/* GCompris - MoveForward.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Author:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../programmingMaze.js" as Activity
+
+Instruction {
+ id: moveForward
+ movementAnimationDuration: 2000
+
+ property double playerXCoordinate: 0
+ property double playerYCoordinate: 0
+
+ //If there has been an x-axis movement, x co-ordinate will be animated without any effect on y-axis movement and same vice-versa.
+ ParallelAnimation {
+ id: movementAnimation
+ SmoothedAnimation {
+ target: Activity.items.player
+ property: 'x'
+ to: playerXCoordinate
+ duration: moveForward.movementAnimationDuration
+ reversingMode: SmoothedAnimation.Immediate
+ }
+ SmoothedAnimation {
+ target: Activity.items.player
+ property: 'y'
+ to: playerYCoordinate
+ duration: moveForward.movementAnimationDuration
+ reversingMode: SmoothedAnimation.Immediate
+ }
+ onStopped: executionComplete()
+ }
+
+ function nextPositionExists(playerCenterX, playerCenterY) {
+ var playerNextPositionX = Math.floor(playerCenterX / Activity.stepX)
+ var playerNextPositionY = Math.floor(playerCenterY / Activity.stepY)
+ var currentLevelCoordinates = Activity.mazeBlocks[Activity.currentLevel].map
+ for(var i = 0; i < currentLevelCoordinates.length; i++) {
+ if(currentLevelCoordinates[i].x == playerNextPositionX && currentLevelCoordinates[i].y == playerNextPositionY)
+ return true
+ }
+ return false
+ }
+
+ //Function to check if the current movement is possible or not and then process the instruction accordingly
+ function checkAndExecuteMovement() {
+ var currentRotation = Activity.getPlayerRotation()
+ var playerCenterX = Activity.items.player.playerCenterX
+ var playerCenterY = Activity.items.player.playerCenterY
+ var nextTileExists = false
+
+ moveForward.playerXCoordinate = Activity.items.player.x
+ moveForward.playerYCoordinate = Activity.items.player.y
+
+ if(currentRotation === Activity.EAST) {
+ playerCenterX += Activity.stepX
+ moveForward.playerXCoordinate += Activity.stepX
+ }
+
+ else if(currentRotation === Activity.WEST) {
+ playerCenterX -= Activity.stepX
+ moveForward.playerXCoordinate -= Activity.stepX
+ }
+
+ else if(currentRotation === Activity.SOUTH) {
+ playerCenterY -= Activity.stepY
+ moveForward.playerYCoordinate -= Activity.stepY
+ }
+
+ else if(currentRotation === Activity.NORTH) {
+ playerCenterY += Activity.stepY
+ moveForward.playerYCoordinate += Activity.stepY
+ }
+
+ nextTileExists = nextPositionExists(playerCenterX, playerCenterY)
+
+ setCodeAreaHighlightMoveDuration()
+
+ if(nextTileExists) {
+ movementAnimation.start()
+ }
+ else
+ foundDeadEnd()
+ }
+}
diff --git a/src/activities/programmingMaze/resource/instructions/Procedure.qml b/src/activities/programmingMaze/resource/instructions/Procedure.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/instructions/Procedure.qml
@@ -0,0 +1,67 @@
+/* GCompris - Procedure.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Author:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../programmingMaze.js" as Activity
+
+Instruction {
+ id: callProcedure
+
+ property alias procedureCode: procedureCode
+
+ //Stores the list of instructions to be executed in procedure code area
+ ListModel {
+ id: procedureCode
+ }
+
+ function checkAndExecuteMovement() {
+ if(!Activity.deadEndPoint && parent.items.procedureCodeArea.procedureIterator < callProcedure.procedureCode.count - 1) {
+ parent.items.procedureCodeArea.procedureIterator++
+ var currentInstruction = procedureCode.get(parent.items.procedureCodeArea.procedureIterator).name
+ Activity.procedureInstructionObjects[currentInstruction].checkAndExecuteMovement()
+ }
+ else {
+ parent.items.procedureCodeArea.procedureIterator = -1
+ executionComplete()
+ }
+ }
+
+ function deadEnd() {
+ foundDeadEnd()
+ }
+
+ function checkSuccessAndExecuteNextInstruction() {
+ var fishX = Activity.mazeBlocks[Activity.currentLevel].fish.x
+ var fishY = Activity.mazeBlocks[Activity.currentLevel].fish.y
+
+ var tuxX = Math.floor(Activity.items.player.playerCenterX / Activity.stepX)
+ var tuxY = Math.floor(Activity.items.player.playerCenterY / Activity.stepY)
+
+ if(tuxX === fishX && tuxY === fishY) {
+ Activity.codeIterator = 0
+ parent.items.bonus.good("tux")
+ }
+ else {
+ checkAndExecuteMovement()
+ }
+ }
+}
diff --git a/src/activities/programmingMaze/resource/instructions/TurnLeftOrRight.qml b/src/activities/programmingMaze/resource/instructions/TurnLeftOrRight.qml
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/instructions/TurnLeftOrRight.qml
@@ -0,0 +1,55 @@
+/* GCompris - TurnLeftOrRight.qml
+ *
+ * Copyright (C) 2018 Aman Kumar Gupta
+ *
+ * Author:
+ * Aman Kumar Gupta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+import QtQuick 2.6
+import GCompris 1.0
+
+import "../../programmingMaze.js" as Activity
+
+Instruction {
+ id: turnLeftOrRight
+ movementAnimationDuration: 1000
+
+ property real finalRotation: 0
+ property string turnDirection
+
+ RotationAnimation {
+ id: movementAnimation
+ target: Activity.items.player
+ to: finalRotation
+ duration: turnLeftOrRight.movementAnimationDuration
+ direction: RotationAnimation.Shortest
+ onStopped: executionComplete()
+ }
+
+ function checkAndExecuteMovement() {
+ var currentRotation = Activity.getPlayerRotation()
+
+ if(turnLeftOrRight.turnDirection === "turn-left")
+ Activity.changedRotation = (currentRotation - 90) % 360
+ else
+ Activity.changedRotation = (currentRotation + 90) % 360
+
+ setCodeAreaHighlightMoveDuration()
+
+ turnLeftOrRight.finalRotation = Activity.changedRotation
+ movementAnimation.start()
+ }
+}
diff --git a/src/activities/programmingMaze/resource/move-forward.svg b/src/activities/programmingMaze/resource/move-forward.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/move-forward.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/src/activities/programmingMaze/resource/turn-left.svg b/src/activities/programmingMaze/resource/turn-left.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/turn-left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/activities/programmingMaze/resource/turn-right.svg b/src/activities/programmingMaze/resource/turn-right.svg
new file mode 100644
--- /dev/null
+++ b/src/activities/programmingMaze/resource/turn-right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/activities/programmingMaze/resource/tutorial1.png b/src/activities/programmingMaze/resource/tutorial1.png
new file mode 100644
index 0000000000000000000000000000000000000000..76635de1b2ab2ed36b282977655d9d9ade9c9aae
GIT binary patch
literal 163758
zc%1D0V|1Ne_Xmvb*tXRsjcvP))!4ReG)-gMX>8jz8rwE@j5odYJoodS^YM&vKK%FC
z89V!0^O|$bIe!ytU8_y7oQyaEEG{en06_TiSwsN)=V)X}_u1iLG#
zIx6V75Zl_@7@Jud5j(os8W9`0ni&HCu1jAdrVzjwp@rX)bI6d1$-@*yU4B_jUc!yl
z$*)7HVlw4#JEh-z!i7`2^8;{HRYsYFbio-}cb7Sj_qEmK#aP7-qyE^me44a=lT?9E
zvpzdWN{TtOFD%?C&63zHM&bSd_u&3?Zs6VglEp5vK%-n!R__J?z(Sk7PfArD=+CEe7W9#|9zRBl=u%4M+;t3
zRcSe5VH9(zM$E(H;>zgWC~<0Un9bhPE7r+0C2p>tuT
zv#~d!XXNDMq-S8FXJVp#r=WFkvv$;TrL}e-`_1A{9wJ5#2KHvQj%GI2#J|7m>DxFt
z@{*Fij}!mJ{I>)C;co5lml590LH~P%o{^4${=dl`&5ZxQkpCX}5Bcw#x#Y}TjVx6~
z%&d&89p0zFOUlT}#PC1EYX3FN!Or%_=x@j8x1F9Zmo1zW!GGSSTZjG90A^#8d;n`Rn`p`=jChF-7I&k;Gy7F-GDuDw_;HIRT5%
zb7Fu=F3Mk`Hbwno$p0hyn|-xA70s@bR^eIV_}?^wpD0NIaR0Cs`l9BQod$ZL;FReY
z@t=z*Agcf2BO!5G`W
zIFpb_AxI$vK;lS|{8#}9d&s)h52$1C#t4v|8_||NpaQvB0>nAJQS3gWyyYG2k?7E{
z!8(*DAwSRs02Wr{nJ5Cx!Zi^~7(;=@Ly7DRI{?ZeL8mXDfmgxy-G((bSl`-(fsF
z1ih8TARQVU>Bmx$SpuZ$vImVT-3JIzke!bi^ec}zLdV}9R!BzQL?N#m#Qklbz`Dh8^0NK}I$A|gW*m*4KI^4~E3
zWy#T_p(~h9L5=`(146X;nqPuKCM*5)D4mAvq};tV7@@(QH8|rW*kgDDA<$CAWuLil
zqZYqQp9JFyMrgp=hbRpotbuY3hn$fiD~wKV%yjPxc(9^+gOGW~HIYPLJ{AV`Kv~n&
zAh=V6Ieftr!+u@>;X#%oznm}A!-ZiiIdDrXyT`-C?K+){!B;s@E|H04N~%?BsWR3B
z>q?rm_j!b@v@*${#}<>D$45MT=p=NO*S=FV_Fbrl?<-3b+UEbLaDSdVf`yXjXb=2^mo}IX6E3yp+^Nm^tjc=y=tf&
zizRw|;5(rQ_B#jw@mpJLgZ==gB*PC!#
z$p=BvP=Gg#r^&P+V(X)IBW
zo_rmnqEIcIRur8RS9xkvrwD^|2?TnKpTfkbJIPF*TFGA;gcIPvCVR71t~4@U6~v+l
z_48?$rF6)y5^MN}j3KGMR{h#EwbVq@&o0zB?!T01;twyQrTQUIT85oF;^az(8`LeA
zLTKqA%89FE)GS0MQ4~R{vDSnske!oA>Q72}i(kgX2S#A(|mix+gdr-=tdhfz6OUI`v
z$ObwyvC5EYYjstY90$56V@Sr-JM15##dY7vAqqoQ3kgs9OQ*MntCH90%F6(yrL5I0
z8z@7XOh8YNv4beDjOW;bV9U7=A8F)=UfI#Idai0!;xr{=eU6=gQ<5MKKBd@}
zX5d@In}l*w08|v7C=@?t*sgNIvLdEbZB3Tb8M>C4Fs~4EKd3giu3LxNx@7tavd=>I
z9}L3BWH|N-$1|czCNlI^{fF`7e4UyG`MghRQjdKa*hE+>^V)6rk^hBb8DJnXGt@9p
z_FfdlH;^T2#QLa09X=7%zt
zr_HZRMXNdWig}o~ICcaB3mdK?Gr~fK=*yYqb^3l|D>~CHmv35%`x>rxJ<)lziN)l$
z>kwvFV}`$iq&|xp&PO$dPj6{r{~{F7=Y~=kcy(z1mC=$#xGxQ%^R;x4K;Rfz6E+AW
zL;}3DBwQ*Z-3tuRHb;|xQ$a=~RUBjj4O#>XSYNU-DV@e6*m5}bow+}y_*WemQse!~
z2jbdP4>bx-x>$?CB{(;uXtZEn>!kg&RB`;e>Z1hJht!wl_CStZ$WP*RagEl{-=?aiBG~p_eEwMd6F`g~e7R`V*;pz_M!buHz;%O4=^^kT
zdbOe_JK`&;f5KyIPtaJLa2_80%-g4vfRB!?n8^>!BT{E4O{_u0Y{$tGWZ%Unf@bW`
z!f2yBc%D((g3vHl{m=-T^SDt2DUn3HB`-BwdZc+ZO@57cjPxy-ROM_f5Q>mNh$WFJ
z#ZK_X)wEYmBK#{@cSzDrwS5N^G;y%;aFbrc9EKJ
zjf^2Ed#LH?s%Rr?nc-R_qnxDae2_>+(LQ@2TYYi|N#gvHqD8Eo@yX!VA(4_>xqJ?`
zxz_xMItc>yDdYCKZ+Xu3mCB!qEA(r6933DZeKo$HjD8flsPwO~#GGX5wA}f2rDc1M
zf(OGe`m(2txJQRGh40^kOiVPB^9;85M)|8$*do1U&CW-NWBfIb&4HYAlew5N-Rkvh
zEUV*gA9N3N1#eLJ1buVKVC*`r1dsOG&R7J1`Ck=TkymY8s=Dup?;Wn=jkrF!x}}6g
zePV@Z-X5V26mzy_sohH)%TJE}l_h~mMh48|ICFAR@(Cw^Gty!NsbOm4>$@!&XN?Ng
zWsZXArmI{OlRIqVRFY#R*zki@Cr5jL0mOMj5yFxuZx2nL<=IdGB$?wSt*9Rqe)LDp
zky=7uhEqi8Z(iqsPsV#2U4S}dLBY@4)U}wiyXr46BJFkF*8J-z
zl&-m1tjl#|BVLWdFmdhIaQ3Ic`n8F{OS7cb8uVOtk+}k2D5tr4lW>Qx;D6ci#{R3@
zL7T%4@4K?HrTIdjOF~-;vZ`uxIO_M}&3MVHfEvDfaYh+xGC4G!3;4+wIN}H`@$>*II$7n5ThSf@sZm)DrD9>@#L+VsQZ5y-4Sa6DyG8{k%Y-FwOI=dC
z_}V_y9StZ&<;cnk;?RFP7A4DF{U?(~xx-56dkpiU&OXxajh(FTcG!S+DZ)^jg7REh
zT4|)4GcOw=EmsIydNYM3ntP~+kRV-xj~2@c`4x-t<{Ukhy8qYZ#W>}>j{{jZLU*G
zkz}S+i9edfjTEC%P{qv=h+!~Dj&fJ0?>3`RqFu?3I
zi7`^baptAutk*9_A&F9>53DBUQN@6Z?MG|g1(;@p$w9t)Pg>o+>RY_M;kgb6r+}7@
zpSTLA9md!_*T)}8UF+#+HSmmi8T=whsn2^Ml21(U=SUTomm+pC$Thum4D`m5w>Y)-
zn(MqLk_3Qmn{LOgKYD5(!3_IdHWhD9N#WTzlDo37lqxnxb0!?f|YJ@E%9cN
zwrm(e+Pqfn991jkfD2lfKzdyK9BJz&G#u7IOZu@94K>S>iQq7P>SLwtauTutU7Nqg
zPb_7D)cm$X0r)u}@8n1+2#}~t1rD20vvp|Mk
zQt-Pr0S1a*#E`SE4!V6hddRT|0g`r|dAk@)cy|HqG9huu2ZiDztFAODb%P