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 Game Juego educativo GCompris Hariv mäng GCompris + GCompris hezkuntza-jokoa GCompris, opettavainen peli Jeu éducatif GCompris Xogo educativo GCompris @@ -44,6 +45,7 @@ Multi-Activity Educational game for children 2 to 10 Juego educativo multiactividad para niños de 2 a 10 años Rohkete tegevustega hariv mäng lastele vanuses 2-10 + Jarduera anitzeko Hezkuntza-jokoa 2 eta 10 urte arteko haurrentzat Useampitoimintoinen opettavainen peli 2–10-vuotiaille lapsille Jeu éducatif multi-activités pour les enfants de 2 à 10 ans Xogo 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, ...
  • 컴퓨터와 친해지기: 키보드, 마우스, 마우스 제스처, ...
  • കമ്പ്യൂട്ടർ പഠിക്കാം: കീബോർഡ്, മൗസ്, മൗസ് കൊണ്ടുള്ള വ്യത്യസ്ത ചലനങ്ങൾ, ...
  • @@ -207,6 +213,7 @@
  • arithmetic: table memory, enumeration, mirror image, balance the scale, change giving, ...
  • aritmética: memorización de tablas, enumeración, imagen especular, equilibrar la balanza, devolver cambios...
  • aritmeetika: nähtu mäletamine, loendamine, peegelpildid, kaalu tasakaalustamine, raha tagasiandmine...
  • +
  • aritmetika: eragiketa matematikoen taulak oroitzea, zenbaketa, irudi ispilatua, balantza orekatu, diru xehea itzultzea, ...
  • aritmetiikka: kertotaulujen opettelu, laskutehtävät, peilikuvan piirtäminen, vaa’an tasapainottaminen, vaihtorahan antaminen, …
  • arithmétique : apprentissage des tables d'opérations mathématiques, l'énumération, de symétrie d'image, équilibrage de la balance, rendre la monnaie…
  • Aritmética: táboas de memoria, enumeración, imaxes espello, equilibrio de balanzas, cálculo do cambio, etc.
  • @@ -239,6 +246,7 @@
  • science: the canal lock, colour mixing, gravity concept, ...
  • ciencia: la esclusa de un canal, mezcla de colores, concepto de gravedad...
  • loodusteadused: kanali lüüs, värvide segamine, gravitatsiooni mõistmine...
  • +
  • zientzia: ubidearen uhatea, koloreak nahastea, grabitate kontzeptua, ...
  • tiede: kanavasulku, värien sekoitus, painovoiman käsite…
  • science : fonctionnement d'une écluse, mélange des couleurs, concept de la gravité…
  • Ciencia: o bloqueo da canle, mestura de cores, o concepto de gravidade, etc.
  • @@ -271,6 +279,7 @@
  • games: memory, connect 4, tic tac toe, sudoku, hanoi tower, ...
  • juegos: memoria, conectar 4, tres en raya, sudoku, torres de hanoi...
  • mängud: mälu, nelja ühendamine, trips-traps-trull, sudoku, Hanoi tornid...
  • +
  • jokoak: oroimena, konektatu 4, hirutan hiru, sudoku, hani dorrea, ...
  • pelit: muisti, neljän suora, ristinolla, sudoku, Hanoin tornit…
  • jeux : trouve les paires, puissance 4, morpion, sudoku, la tour d'hanoï…
  • Xogos: memoria, conectar 4, pai nai fillo, sudoku, torre de Hanoi, etc.
  • @@ -303,6 +312,7 @@
  • reading: reading practice, ...
  • lectura: prácticas de lectura...
  • lugemine
  • +
  • irakurketa: irakurtzen trebatzea, ...
  • lukeminen: lukemisen harjoittelu…
  • lecture : entraînement à la lecture…
  • Lectura: práctica de lectura, etc.
  • @@ -336,6 +346,7 @@
  • other: learn to tell time, the braille system, maze, music instruments, ...
  • otras: aprender a decir la hora, el sistema braille, laberintos, instrumentos musicales...
  • muu: kellaaja väljendamine, Braille'i kiri, labürint, muusikariistad...
  • +
  • bestelakoak: ikasi ordua esaten, braille sistema, labirintoa, musika tresnak, ...
  • muuta: kellonajan kertominen, Braille-järjestelmä, sokkelo, soittimet…
  • 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,7 +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_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/baby_tangram/ActivityInfo.qml b/src/activities/baby_tangram/ActivityInfo.qml new file mode 100644 --- /dev/null +++ b/src/activities/baby_tangram/ActivityInfo.qml @@ -0,0 +1,40 @@ +/* GCompris - ActivityInfo.qml + * + * 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 + * 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: "baby_tangram/BabyTangram.qml" + difficulty: 1 + icon: "baby_tangram/baby_tangram.svg" + author: "Johnny Jazeix <jazeix@gmail.com>" + demo: true + //: Activity title + title: qsTr("Reassemble the shapes") + //: Help title + 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: "" + //: Help prerequisite + prerequisite: qsTr("Mouse-manipulation") + //: Help manual + 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: 9800 +} diff --git a/src/activities/baby_tangram/BabyTangram.qml b/src/activities/baby_tangram/BabyTangram.qml new file mode 100644 --- /dev/null +++ b/src/activities/baby_tangram/BabyTangram.qml @@ -0,0 +1,33 @@ +/* GCompris - BabyTangram.qml + * + * Copyright (C) 2019 Johnny Jazeix + * + * Authors: + * 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 + * 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 "dataset.js" as Dataset +import "../tangram" +import "." + +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 @@ + + + + + + + + + + image/svg+xml + + + 2017 + + + Timothée Giet and Ilya Bizyaev + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/baby_tangram/resource/README b/src/activities/baby_tangram/resource/README new file mode 100644 --- /dev/null +++ b/src/activities/baby_tangram/resource/README @@ -0,0 +1,21 @@ +Copyright: 2000, 2008 Bruno Coudoin and others +License: Public domain +Files: +car1/bumper.svg +car1/car.svg +car1/grille.svg +car1/headlights.svg +car1/tire_right.svg +car1/windshield.svg +tangram/background.svg +tangram/flip.svg +train/coal.svg +train/loco.svg +train/passenger.svg +train/wood.svg +truck/back_road.svg +truck/cabin.svg +truck/container.svg +truck/engine.svg +truck/front_road.svg +truck/traffic_bg.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 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + 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 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + 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,6 @@ //: Help manual manual: qsTr("Read the instructions and select the correct date on the calendar.") credit: "" - section: "discovery" + section: "math measures" createdInVersion: 9000 } 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,7 +31,7 @@ "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, @@ -40,7 +40,7 @@ "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, @@ -49,7 +49,7 @@ "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,7 +59,7 @@ }, { "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, @@ -68,7 +68,7 @@ "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, @@ -77,7 +77,7 @@ "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,7 +87,7 @@ "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, @@ -96,7 +96,7 @@ "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, @@ -105,7 +105,7 @@ "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,7 +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/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,6 @@ //: 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 } 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-inequality/ActivityInfo.qml b/src/activities/gnumch-inequality/ActivityInfo.qml --- a/src/activities/gnumch-inequality/ActivityInfo.qml +++ b/src/activities/gnumch-inequality/ActivityInfo.qml @@ -38,6 +38,6 @@ "

    " + qsTr("Take care to avoid the Troggles.") credit: "" - section: "math" + section: "math arithmetic" createdInVersion: 0 } diff --git a/src/activities/gnumch-multiples/ActivityInfo.qml b/src/activities/gnumch-multiples/ActivityInfo.qml --- a/src/activities/gnumch-multiples/ActivityInfo.qml +++ b/src/activities/gnumch-multiples/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-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,13 +18,13 @@ "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", @@ -32,19 +32,19 @@ "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,16 +137,16 @@ "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", @@ -154,8 +154,8 @@ "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", @@ -164,7 +164,7 @@ "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", @@ -172,11 +172,11 @@ "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", @@ -184,9 +184,9 @@ "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", @@ -194,7 +194,7 @@ "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", @@ -202,22 +202,22 @@ "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,7 +234,7 @@ "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", @@ -242,12 +242,12 @@ "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,18 +258,18 @@ "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", @@ -277,7 +277,7 @@ "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,22 +368,22 @@ "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", @@ -392,7 +392,7 @@ "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,24 +472,24 @@ "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", @@ -497,7 +497,7 @@ "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,24 +513,24 @@ "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", @@ -539,14 +539,14 @@ "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,16 +642,16 @@ "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", @@ -659,11 +659,11 @@ "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,9 +1003,9 @@ "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", @@ -1014,15 +1014,15 @@ "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,11 +101,19 @@ }, { 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", @@ -113,7 +121,11 @@ }, { icon: activity.url + "math.svg", - tag: "math" + tag: "math", + categories: [{ "numeration": qsTr("Numeration") }, + { "arithmetic": qsTr("Arithmetic") }, + { "measures": qsTr("Measures") } + ] }, { icon: activity.url + "puzzle.svg", @@ -121,7 +133,11 @@ }, { 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,6 +149,8 @@ } ] property string currentTag: sections[0].tag + property var currentTagCategories: [] + property string currentCategory: "" /// @endcond property string clickMode: "play" @@ -215,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(); @@ -275,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() } @@ -355,6 +394,65 @@ } } + 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 @@ -363,7 +461,7 @@ 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 @@ -514,7 +612,6 @@ } else { dialogChooseLevel.currentActivity = ActivityInfoTree.menuTree[index] - dialogChooseLevel.chosenLevel = currentLevel; displayDialog(dialogChooseLevel); } } @@ -561,7 +658,18 @@ 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) @@ -770,7 +878,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,7 @@ //: 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 + levels: "1,2,3" } diff --git a/src/activities/money/CMakeLists.txt b/src/activities/money/CMakeLists.txt --- a/src/activities/money/CMakeLists.txt +++ b/src/activities/money/CMakeLists.txt @@ -1 +1 @@ -GCOMPRIS_ADD_RCC(activities/money *.qml *.svg *.js resource/*) +GCOMPRIS_ADD_RCC(activities/money *.qml *.svg *.js resource/* resource/*/*/*.qml) diff --git a/src/activities/money/MoneyArea.qml b/src/activities/money/MoneyArea.qml --- a/src/activities/money/MoneyArea.qml +++ b/src/activities/money/MoneyArea.qml @@ -63,7 +63,7 @@ id: pocket model: ListModel { id: pocketModel } Image { - source: Activity.url + img + source: img sourceSize.height: columnLayout.itemHeight height: columnLayout.itemHeight diff --git a/src/activities/money/MoneyCore.qml b/src/activities/money/MoneyCore.qml --- a/src/activities/money/MoneyCore.qml +++ b/src/activities/money/MoneyCore.qml @@ -56,10 +56,12 @@ property alias store: store property alias instructions: instructions property alias tux: tux + property var levels: activity.datasetLoader.item.data property alias tuxMoney: tuxMoney property alias bar: bar property alias bonus: bonus property int itemIndex + property int pocketRows property var selectedArea property alias pocket: pocketArea.answer property alias answer: answerArea.answer @@ -76,7 +78,7 @@ width: parent.width * 0.9 property int nbColumns: 5 - property int nbLines: 2 + property int nbLines: items.pocketRows property int itemWidth: Math.min(width / nbColumns - 10 - 10 / nbColumns, parent.height * 0.4 / nbLines - 10 - 10 / nbLines) @@ -101,13 +103,12 @@ Rectangle { id: storeArea - height: (columnLayout.itemStoreHeight + 10) + height: columnLayout.itemStoreHeight + 10 width: columnLayout.width color: "#55333333" border.color: "black" border.width: 2 radius: 5 - Flow { id: storeAreaFlow anchors.topMargin: 4 @@ -135,7 +136,7 @@ Repeater { id: tuxMoney Image { - source: Activity.url + modelData.img + source: modelData.img sourceSize.height: columnLayout.itemStoreHeight * 0.4 x: tux.x + index * 20 y: tux.y + tux.height / 2 + index * 20 @@ -146,7 +147,7 @@ Repeater { id: store Image { - source: Activity.url + modelData.img + source: modelData.img sourceSize.height: columnLayout.itemStoreHeight sourceSize.width: columnLayout.itemStoreHeight GCText { diff --git a/src/activities/money/money.js b/src/activities/money/money.js --- a/src/activities/money/money.js +++ b/src/activities/money/money.js @@ -23,546 +23,12 @@ .import "qrc:/gcompris/src/core/core.js" as Core .import GCompris 1.0 as GCompris +.import "moneyConstants.js" as Constants + var url = "qrc:/gcompris/src/activities/money/resource/" // We create 3 prices categories to make the game more realistic. // List of images to use in the game (cheap objects) -var cheapObjects = [ - "apple.svg", - "orange.svg", - "banane.svg", - "pamplemousse.svg", - "carot.svg", - "cerise.svg", - "cake.svg" - ] - -var normalObjects = [ - "umbrella.svg", - "pencil.svg", - "bottle.svg", - "light.svg", - "eggpot.svg" - ] - -var expensiveObjects = [ - "lamp.svg", - "football.svg", - "bicycle.svg" - ] - -var moneyItems = { - MONEY_EURO_COIN_1C: { img: "c1c.svg", val: 0.01 }, - MONEY_EURO_COIN_2C: { img: "c2c.svg", val: 0.02 }, - MONEY_EURO_COIN_5C: { img: "c5c.svg", val: 0.05 }, - MONEY_EURO_COIN_10C: { img: "c10c.svg", val: 0.1 }, - MONEY_EURO_COIN_20C: { img: "c20c.svg", val: 0.20 }, - MONEY_EURO_COIN_50C: { img: "c50c.svg", val: 0.5 }, - MONEY_EURO_COIN_1E: { img: "c1e.svg", val: 1.0 }, - MONEY_EURO_COIN_2E: { img: "c2e.svg", val: 2.0 }, - MONEY_EURO_PAPER_5E: { img: "n5e.svg", val: 5.0 }, - MONEY_EURO_PAPER_10E: { img: "n10e.svg", val: 10.0 }, - MONEY_EURO_PAPER_20E: { img: "n20e.svg", val: 20.0 }, - MONEY_EURO_PAPER_50E: { img: "n50e.svg", val: 50.0 }, -} - -var fullDataset = { - WITHOUT_CENTS: [ - { - numberOfItem: 1, - minPrice: 3, - maxPrice: 10, - pocket: [ - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 1, - minPrice: 10, - maxPrice: 20, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 2, - minPrice: 20, - maxPrice: 30, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 2, - minPrice: 30, - maxPrice: 40, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 3, - minPrice: 40, - maxPrice: 50, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 3, - minPrice: 50, - maxPrice: 60, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 60, - maxPrice: 70, - pocket: [ - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 70, - maxPrice: 80, - pocket: [ - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 50, - maxPrice: 100, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E - ] - } - ], - - WITH_CENTS: [ - { - numberOfItem: 1, - minPrice: 1, - maxPrice: 3, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C, - ] - }, - { - numberOfItem: 1, - minPrice: 1, - maxPrice: 3, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 2, - minPrice: 1, - maxPrice: 3, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C, - ] - }, - { - numberOfItem: 3, - minPrice: 1, - maxPrice: 3, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 4, - minPrice: 0, - maxPrice: 4, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C, - ] - } - ], - - BACK_WITHOUT_CENTS: [ - { - numberOfItem: 1, - minPrice: 3, - maxPrice: 9, - paid: 10, - pocket: [ - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - ] - }, - { - numberOfItem: 1, - minPrice: 1, - maxPrice: 19, - paid: 20, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 2, - minPrice: 2, - maxPrice: 29, - paid: 30, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 2, - minPrice: 2, - maxPrice: 39, - paid: 40, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 3, - minPrice: 3, - maxPrice: 49, - paid: 50, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 3, - minPrice: 3, - maxPrice: 60, - paid: 100, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 4, - maxPrice: 70, - paid: 100, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 4, - maxPrice: 80, - paid: 100, - pocket: [ - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E - ] - }, - { - numberOfItem: 4, - minPrice: 4, - maxPrice: 99, - paid: 100, - pocket: [ - moneyItems.MONEY_EURO_PAPER_10E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_PAPER_50E, - moneyItems.MONEY_EURO_PAPER_20E, - moneyItems.MONEY_EURO_PAPER_5E, - moneyItems.MONEY_EURO_PAPER_5E - ] - } - ], - - BACK_WITH_CENTS: [ - { - numberOfItem: 1, - minPrice: 1, - maxPrice: 3, - paid: 5, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 1, - minPrice: 1, - maxPrice: 3, - paid: 5, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 2, - minPrice: 1, - maxPrice: 3, - paid: 5, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 3, - minPrice: 1, - maxPrice: 3, - paid: 5, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - }, - { - numberOfItem: 4, - minPrice: 0, - maxPrice: 4, - paid: 5, - pocket: [ - moneyItems.MONEY_EURO_COIN_2E, - moneyItems.MONEY_EURO_COIN_1E, - moneyItems.MONEY_EURO_COIN_5C, - moneyItems.MONEY_EURO_COIN_2C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_50C, - moneyItems.MONEY_EURO_COIN_20C, - moneyItems.MONEY_EURO_COIN_10C, - moneyItems.MONEY_EURO_COIN_1C, - moneyItems.MONEY_EURO_COIN_1C - ] - } - ] -} var currentLevel var numberOfLevel @@ -574,30 +40,25 @@ function start(items_, datasetName) { items = items_ - + dataset = items.levels switch(datasetName) { - case "WITHOUT_CENTS": - dataset = fullDataset.WITHOUT_CENTS - centsMode = false - backMode = false + case "WITHOUT_CENTS": + centsMode = false + backMode = false break - case "WITH_CENTS": - dataset = fullDataset.WITH_CENTS - centsMode = true - backMode = false + case "WITH_CENTS": + centsMode = true + backMode = false break - case "BACK_WITHOUT_CENTS": - dataset = fullDataset.BACK_WITHOUT_CENTS - centsMode = false - backMode = true + case "BACK_WITHOUT_CENTS": + centsMode = false + backMode = true break - case "BACK_WITH_CENTS": - dataset = fullDataset.BACK_WITH_CENTS - centsMode = true - backMode = true + case "BACK_WITH_CENTS": + centsMode = true + backMode = true break } - currentLevel = 0 numberOfLevel = dataset.length initLevel() @@ -608,12 +69,14 @@ function initLevel() { items.bar.level = currentLevel + 1 - items.answerModel.clear() items.pocketModel.clear() var data = dataset[currentLevel] + + items.pocketRows = (data.pocket.length > 10) ? 3 : 2 var pocket = Core.shuffle(data.pocket) + for (var i in pocket) items.pocketModel.append(pocket[i]) @@ -628,7 +91,7 @@ // Calc a random price for each item based on the previous prices price = Math.floor((centsMode ? 0 : 1) + Math.random() * - ((priceTotal - priceCounter) / data.numberOfItem)) + (2 * (priceTotal - priceCounter) / data.numberOfItem)) else // Put the remaining missing price on the last item price = priceTotal - priceCounter @@ -668,25 +131,25 @@ var tuxMoney switch(data.paid) { case 5: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_5E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_5E] break case 10: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_10E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_10E] break case 20: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_20E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_20E] break case 30: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_20E, moneyItems.MONEY_EURO_PAPER_10E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_20E, Constants.moneyItems.MONEY_PAPER_10E] break case 40: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_20E, moneyItems.MONEY_EURO_PAPER_20E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_20E, Constants.moneyItems.MONEY_PAPER_20E] break case 50: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_50E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_50E] break case 100: - tuxMoney = [moneyItems.MONEY_EURO_PAPER_50E, moneyItems.MONEY_EURO_PAPER_50E] + tuxMoney = [Constants.moneyItems.MONEY_PAPER_50E, Constants.moneyItems.MONEY_PAPER_50E] break } items.tuxMoney.model = tuxMoney @@ -722,11 +185,11 @@ function getRandomObject(price) { var list if(price < 5) - list = cheapObjects + list = Constants.cheapObjects else if(price < 10) - list = normalObjects + list = Constants.normalObjects else - list = expensiveObjects + list = Constants.expensiveObjects return list[Math.floor(Math.random() * list.length)] } diff --git a/src/activities/money/moneyConstants.js b/src/activities/money/moneyConstants.js new file mode 100644 --- /dev/null +++ b/src/activities/money/moneyConstants.js @@ -0,0 +1,59 @@ +/* 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 . + */ + +var cheapObjects = [ + "qrc:/gcompris/src/activities/money/resource/apple.svg", + "qrc:/gcompris/src/activities/money/resource/orange.svg", + "qrc:/gcompris/src/activities/money/resource/banane.svg", + "qrc:/gcompris/src/activities/money/resource/pamplemousse.svg", + "qrc:/gcompris/src/activities/money/resource/carot.svg", + "qrc:/gcompris/src/activities/money/resource/cerise.svg", + "qrc:/gcompris/src/activities/money/resource/cake.svg" +] + +var normalObjects = [ + "qrc:/gcompris/src/activities/money/resource/umbrella.svg", + "qrc:/gcompris/src/activities/money/resource/pencil.svg", + "qrc:/gcompris/src/activities/money/resource/bottle.svg", + "qrc:/gcompris/src/activities/money/resource/light.svg", + "qrc:/gcompris/src/activities/money/resource/eggpot.svg" +] + +var expensiveObjects = [ + "qrc:/gcompris/src/activities/money/resource/lamp.svg", + "qrc:/gcompris/src/activities/money/resource/football.svg", + "qrc:/gcompris/src/activities/money/resource/bicycle.svg" +] + +var moneyItems = { + MONEY_COIN_1C: { img: "qrc:/gcompris/src/activities/money/resource/c1c.svg", val: 0.01 }, + MONEY_COIN_2C: { img: "qrc:/gcompris/src/activities/money/resource/c2c.svg", val: 0.02 }, + MONEY_COIN_5C: { img: "qrc:/gcompris/src/activities/money/resource/c5c.svg", val: 0.05 }, + MONEY_COIN_10C: { img: "qrc:/gcompris/src/activities/money/resource/c10c.svg", val: 0.1 }, + MONEY_COIN_20C: { img: "qrc:/gcompris/src/activities/money/resource/c20c.svg", val: 0.20 }, + MONEY_COIN_50C: { img: "qrc:/gcompris/src/activities/money/resource/c50c.svg", val: 0.5 }, + MONEY_COIN_1E: { img: "qrc:/gcompris/src/activities/money/resource/c1e.svg", val: 1.0 }, + MONEY_COIN_2E: { img: "qrc:/gcompris/src/activities/money/resource/c2e.svg", val: 2.0 }, + MONEY_PAPER_5E: { img: "qrc:/gcompris/src/activities/money/resource/n5e.svg", val: 5.0 }, + MONEY_PAPER_10E: { img: "qrc:/gcompris/src/activities/money/resource/n10e.svg", val: 10.0 }, + MONEY_PAPER_20E: { img: "qrc:/gcompris/src/activities/money/resource/n20e.svg", val: 20.0 }, + MONEY_PAPER_50E: { img: "qrc:/gcompris/src/activities/money/resource/n50e.svg", val: 50.0 }, +} diff --git a/src/activities/money/resource/1/Data.qml b/src/activities/money/resource/1/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money/resource/1/Data.qml @@ -0,0 +1,106 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + +Dataset { + objective: qsTr("Learn how to pay up to 10 units") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 4, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 6, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 7, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 8, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 9, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 10, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + } + ] +} diff --git a/src/activities/money/resource/2/Data.qml b/src/activities/money/resource/2/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money/resource/2/Data.qml @@ -0,0 +1,179 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + +Dataset { + objective: qsTr("Learn how to pay up to 100 units") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 3, + "maxPrice": 10, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 10, + "maxPrice": 20, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 20, + "maxPrice": 30, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 30, + "maxPrice": 60, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 60, + "maxPrice": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E + ] + }, + { + "numberOfItem": 3, + "minPrice": 10, + "maxPrice": 20, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 4, + "minPrice": 20, + "maxPrice": 30, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 5, + "minPrice": 30, + "maxPrice": 60, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 6, + "minPrice": 60, + "maxPrice": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E + ] + } + ] +} diff --git a/src/activities/money/resource/3/Data.qml b/src/activities/money/resource/3/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money/resource/3/Data.qml @@ -0,0 +1,283 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + +Dataset { + objective: qsTr("Learn how to pay up to 1000 units") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 10, + "maxPrice": 100, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 200, + "maxPrice": 400, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 400, + "maxPrice": 600, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 600, + "maxPrice": 800, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 1, + "minPrice": 800, + "maxPrice": 1000, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 3, + "minPrice": 10, + "maxPrice": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 4, + "minPrice": 100, + "maxPrice": 200, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 5, + "minPrice": 200, + "maxPrice": 400, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 6, + "minPrice": 400, + "maxPrice": 600, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E + ] + }, + { + "numberOfItem": 7, + "minPrice": 600, + "maxPrice": 1000, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E + ] + } + ] +} 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,7 @@ //: 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 + levels: "1" } diff --git a/src/activities/money_back/CMakeLists.txt b/src/activities/money_back/CMakeLists.txt --- a/src/activities/money_back/CMakeLists.txt +++ b/src/activities/money_back/CMakeLists.txt @@ -1 +1 @@ -GCOMPRIS_ADD_RCC(activities/money_back *.qml *.svg *.js resource/*) +GCOMPRIS_ADD_RCC(activities/money_back *.qml *.svg *.js resource/* resource/*/*/*.qml) diff --git a/src/activities/money_back/resource/1/Data.qml b/src/activities/money_back/resource/1/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money_back/resource/1/Data.qml @@ -0,0 +1,190 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + +Dataset { + objective: qsTr("Learn how to pay up to 100 euros including cents") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 3, + "maxPrice": 9, + "paid": 10, + "pocket": [ + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 19, + "paid": 20, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 2, + "minPrice": 2, + "maxPrice": 29, + "paid": 30, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 2, + "minPrice": 2, + "maxPrice": 39, + "paid": 40, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 3, + "minPrice": 3, + "maxPrice": 49, + "paid": 50, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 3, + "minPrice": 3, + "maxPrice": 60, + "paid": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 4, + "minPrice": 4, + "maxPrice": 70, + "paid": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 4, + "minPrice": 4, + "maxPrice": 80, + "paid": 100, + "pocket": [ + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E + ] + }, + { + "numberOfItem": 4, + "minPrice": 4, + "maxPrice": 99, + "paid": 100, + "pocket": [ + moneyItems.MONEY_PAPER_10E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_PAPER_50E, + moneyItems.MONEY_PAPER_20E, + moneyItems.MONEY_PAPER_5E, + moneyItems.MONEY_PAPER_5E + ] + } + ] +} 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,7 @@ //: 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 + levels: "1" } diff --git a/src/activities/money_back_cents/CMakeLists.txt b/src/activities/money_back_cents/CMakeLists.txt --- a/src/activities/money_back_cents/CMakeLists.txt +++ b/src/activities/money_back_cents/CMakeLists.txt @@ -1 +1 @@ -GCOMPRIS_ADD_RCC(activities/money_back_cents *.qml *.svg *.js resource/*) +GCOMPRIS_ADD_RCC(activities/money_back_cents *.qml *.svg *.js resource/* resource/*/*/*.qml) diff --git a/src/activities/money_back_cents/resource/1/Data.qml b/src/activities/money_back_cents/resource/1/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money_back_cents/resource/1/Data.qml @@ -0,0 +1,121 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + +Dataset { + objective: qsTr("Learn how to pay up to 10 euros giving back the change") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 3, + "paid": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 3, + "paid": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 2, + "minPrice": 1, + "maxPrice": 3, + "paid": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 3, + "minPrice": 1, + "maxPrice": 3, + "paid": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 4, + "minPrice": 0, + "maxPrice": 4, + "paid": 5, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + } + ] +} 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,7 @@ //: 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 + levels: "1" } diff --git a/src/activities/money_cents/CMakeLists.txt b/src/activities/money_cents/CMakeLists.txt --- a/src/activities/money_cents/CMakeLists.txt +++ b/src/activities/money_cents/CMakeLists.txt @@ -1 +1 @@ -GCOMPRIS_ADD_RCC(activities/money_cents *.qml *.svg *.js resource/*) +GCOMPRIS_ADD_RCC(activities/money_cents *.qml *.svg *.js resource/* resource/*/*/*.qml) diff --git a/src/activities/money_cents/resource/1/Data.qml b/src/activities/money_cents/resource/1/Data.qml new file mode 100644 --- /dev/null +++ b/src/activities/money_cents/resource/1/Data.qml @@ -0,0 +1,117 @@ +/* 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" +import "../../../money/moneyConstants.js" as Constants + + +Dataset { + objective: qsTr("Learn how to pay up to 10 euros giving back the change, including cents") + property var moneyItems: Constants.moneyItems + data: [ + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 3, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C, + ] + }, + { + "numberOfItem": 1, + "minPrice": 1, + "maxPrice": 3, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 2, + "minPrice": 1, + "maxPrice": 3, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C, + ] + }, + { + "numberOfItem": 3, + "minPrice": 1, + "maxPrice": 3, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C + ] + }, + { + "numberOfItem": 4, + "minPrice": 0, + "maxPrice": 4, + "pocket": [ + moneyItems.MONEY_COIN_2E, + moneyItems.MONEY_COIN_1E, + moneyItems.MONEY_COIN_5C, + moneyItems.MONEY_COIN_2C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_50C, + moneyItems.MONEY_COIN_20C, + moneyItems.MONEY_COIN_10C, + moneyItems.MONEY_COIN_1C, + moneyItems.MONEY_COIN_1C, + ] + } + ] +} 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/numbers-odd-even/resource/Tutorial4.qml b/src/activities/numbers-odd-even/resource/Tutorial4.qml new file mode 100644 --- /dev/null +++ b/src/activities/numbers-odd-even/resource/Tutorial4.qml @@ -0,0 +1,31 @@ +/* GCompris - Tutorial4.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" + +TutorialBase { + + firstNumber: "2" + secondNumber: "5" +} diff --git a/src/activities/numbers-odd-even/resource/Tutorial5.qml b/src/activities/numbers-odd-even/resource/Tutorial5.qml new file mode 100644 --- /dev/null +++ b/src/activities/numbers-odd-even/resource/Tutorial5.qml @@ -0,0 +1,32 @@ +/* GCompris - Tutorial5.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" + +TutorialBase { + + isEvenExpected: false + firstNumber: "59" + secondNumber: "52" +} diff --git a/src/activities/numbers-odd-even/resource/Tutorial6.qml b/src/activities/numbers-odd-even/resource/Tutorial6.qml new file mode 100644 --- /dev/null +++ b/src/activities/numbers-odd-even/resource/Tutorial6.qml @@ -0,0 +1,30 @@ +/* GCompris - Tutorial6.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" + +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,7 +98,8 @@ items.movePlaneTimer.interval = 1000 items.movePlaneTimer.start(); items.cloudCreation.start() - // Inject the first cloud now + + //Inject the first cloud now createCloud() } @@ -104,7 +107,6 @@ 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.
  • "), + "instructionImage": "qrc:/gcompris/src/activities/programmingMaze/resource/tutorial2.png" + }, + ] + +var procedureTutorialInstructions = [ + { + "instruction": qsTr("Procedure:" + + "
  • -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 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + 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 @@ + + + + + + image/svg+xml + + + + + + + + + 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..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@") + qsTr("5. Use Delete key to remove a wagon or locomotive from answer zone.
    ") credit: "" - section: "discovery memory" + section: "discovery logic" createdInVersion: 9500 } diff --git a/src/activities/readingh/ActivityInfo.qml b/src/activities/readingh/ActivityInfo.qml --- a/src/activities/readingh/ActivityInfo.qml +++ b/src/activities/readingh/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("A word is shown on the board. A list of words, displayed horizontally, will appear and disappear. Does the given word belong to the list?") credit: "" - section: "reading" + section: "reading words" createdInVersion: 5000 } diff --git a/src/activities/readingv/ActivityInfo.qml b/src/activities/readingv/ActivityInfo.qml --- a/src/activities/readingv/ActivityInfo.qml +++ b/src/activities/readingv/ActivityInfo.qml @@ -35,7 +35,7 @@ //: Help manual manual: qsTr("A word is shown on the board. A list of words, displayed vertically, will appear and disappear. Does the given word belong to the list?") credit: "" - section: "reading" + section: "reading words" createdInVersion: 5000 } diff --git a/src/activities/redraw/ActivityInfo.qml b/src/activities/redraw/ActivityInfo.qml --- a/src/activities/redraw/ActivityInfo.qml +++ b/src/activities/redraw/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("First, select the proper color from the toolbar. Then click on the grid and drag to paint, then release the click to stop painting.") credit: "" - section: "math geometry puzzle" + section: "puzzle" createdInVersion: 0 } diff --git a/src/activities/redraw_symmetrical/ActivityInfo.qml b/src/activities/redraw_symmetrical/ActivityInfo.qml --- a/src/activities/redraw_symmetrical/ActivityInfo.qml +++ b/src/activities/redraw_symmetrical/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("First, select the proper color from the toolbar. Then click on the grid and drag to paint, then release the click to stop painting.") credit: "" - section: "math geometry symmetry puzzle" + section: "puzzle" createdInVersion: 0 } diff --git a/src/activities/renewable_energy/ActivityInfo.qml b/src/activities/renewable_energy/ActivityInfo.qml --- a/src/activities/renewable_energy/ActivityInfo.qml +++ b/src/activities/renewable_energy/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help prerequisite prerequisite: "" credit: qsTr("Drawing by Stephane Cabaraux") - section: "experiment" + section: "sciences experiment" createdInVersion: 5000 } diff --git a/src/activities/reversecount/ActivityConfig.qml b/src/activities/reversecount/ActivityConfig.qml new file mode 100644 --- /dev/null +++ b/src/activities/reversecount/ActivityConfig.qml @@ -0,0 +1,60 @@ +/* GCompris - ActivityConfig.qml + * + * Copyright (C) 2019 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 "../../core" + +Item { + id: activityConfiguration + property Item background + property alias modeBox: modeBox + property var availableModes: [ + { "text": qsTr("Dots"), "value": "dot" }, + { "text": qsTr("Arabic numbers"), "value": "number" }, + { "text": qsTr("Roman numbers"), "value": "roman" }, + { "text": qsTr("Images"), "value": "image" } + ] + Flow { + id: flow + spacing: 5 + width: parent.width + GCComboBox { + id: modeBox + model: availableModes + background: activityConfiguration.background + label: qsTr("Select Domino Representation") + } + } + + property var dataToSave + function setDefaultValues() { + for(var i = 0 ; i < availableModes.length ; i++) { + if(availableModes[i].value === dataToSave["mode"]) { + modeBox.currentIndex = i; + break; + } + } + } + function saveValues() { + var newMode = availableModes[modeBox.currentIndex].value; + dataToSave = {"mode": newMode}; + } +} diff --git a/src/activities/reversecount/Reversecount.qml b/src/activities/reversecount/Reversecount.qml --- a/src/activities/reversecount/Reversecount.qml +++ b/src/activities/reversecount/Reversecount.qml @@ -42,7 +42,7 @@ signal stop Component.onCompleted: { - dialogActivityConfig.getInitialConfiguration() + dialogActivityConfig.initialize() activity.start.connect(start) activity.stop.connect(stop) } @@ -166,16 +166,14 @@ Bar { id: bar - content: BarEnumContent { value: help | home | level | config } + content: BarEnumContent { value: help | home | level | activityConfig } onHelpClicked: { displayDialog(dialogHelp) } onPreviousLevelClicked: Activity.previousLevel() onNextLevelClicked: Activity.nextLevel() onHomeClicked: activity.home() - onConfigClicked: { - dialogActivityConfig.active = true - dialogActivityConfig.setDefaultValues() + onActivityConfigClicked: { displayDialog(dialogActivityConfig) } } @@ -221,51 +219,22 @@ } } - DialogActivityConfig { + DialogChooseLevel { id: dialogActivityConfig - currentActivity: activity - content: Component { - Item { - property alias modeBox: modeBox - property var availableModes: [ - { "text": qsTr("Dots"), "value": "dot" }, - { "text": qsTr("Arabic numbers"), "value": "number" }, - { "text": qsTr("Roman numbers"), "value": "roman" }, - { "text": qsTr("Images"), "value": "image" } - ] - Flow { - id: flow - spacing: 5 - width: dialogActivityConfig.width - GCComboBox { - id: modeBox - model: availableModes - background: dialogActivityConfig - label: qsTr("Select Domino Representation") - } - } - } - } - onClose: home() - onLoadData: { - if(dataToSave && dataToSave["mode"]) { - items.mode = dataToSave["mode"]; - } + currentActivity: activity.activityInfo + + onClose: { + home() } onSaveData: { - var newMode = dialogActivityConfig.configItem.availableModes[dialogActivityConfig.configItem.modeBox.currentIndex].value; - if (newMode !== items.mode) { - items.mode = newMode; - dataToSave = {"mode": items.mode}; - } - Activity.initLevel(); + levelFolder = dialogActivityConfig.chosenLevel + currentActivity.currentLevel = dialogActivityConfig.chosenLevel + ApplicationSettings.setCurrentLevel(currentActivity.name, dialogActivityConfig.chosenLevel) + home() } - function setDefaultValues() { - for(var i = 0 ; i < dialogActivityConfig.configItem.availableModes.length ; i++) { - if(dialogActivityConfig.configItem.availableModes[i].value === items.mode) { - dialogActivityConfig.configItem.modeBox.currentIndex = i; - break; - } + onLoadData: { + if(activityData && activityData["mode"]) { + items.mode = activityData["mode"]; } } } diff --git a/src/activities/roman_numerals/ActivityInfo.qml b/src/activities/roman_numerals/ActivityInfo.qml --- a/src/activities/roman_numerals/ActivityInfo.qml +++ b/src/activities/roman_numerals/ActivityInfo.qml @@ -39,6 +39,6 @@ 2394: we got a sum of 2000 (MM), 300 (CCC), 90 (XC) and 4 units (IV), so we write this combined: MMCCCXCIV\n MMMCMXLIX: we got first thousands (MMM=3000), then we got hundreds (CM=1000–100=900), then we got tens (XL=50–10=40), and at last we got units (IX=10–1=9), so we write this in the decimal system: 3949.") credit: "" - section: "math" + section: "sciences history" createdInVersion: 7000 } diff --git a/src/activities/scalesboard/ActivityInfo.qml b/src/activities/scalesboard/ActivityInfo.qml --- a/src/activities/scalesboard/ActivityInfo.qml +++ b/src/activities/scalesboard/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("To balance the scales, move the weights to the left or the right side (on higher levels). The weights can be arranged in any order.") credit:"" - section: "math" + section: "math measures" createdInVersion: 0 } diff --git a/src/activities/scalesboard_weight/ActivityInfo.qml b/src/activities/scalesboard_weight/ActivityInfo.qml --- a/src/activities/scalesboard_weight/ActivityInfo.qml +++ b/src/activities/scalesboard_weight/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("To balance the scales, move the masses to the left or the right side (on higher levels). They can be arranged in any order. Take care of the weight and the unit of the masses, remember that a kilogram (kg) is 1000 grams (g).") credit: "" - section: "math" + section: "math measures" createdInVersion: 0 } diff --git a/src/activities/scalesboard_weight_avoirdupois/ActivityInfo.qml b/src/activities/scalesboard_weight_avoirdupois/ActivityInfo.qml --- a/src/activities/scalesboard_weight_avoirdupois/ActivityInfo.qml +++ b/src/activities/scalesboard_weight_avoirdupois/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("To balance the scales, move the masses to the left or the right side (on higher levels). They can be arranged in any order. Take care of the weight and the unit of the masses, remember that a pound (lb) is 16 ounce (oz).") credit: "" - section: "math" + section: "math measures" createdInVersion: 0 } diff --git a/src/activities/share/ActivityInfo.qml b/src/activities/share/ActivityInfo.qml --- a/src/activities/share/ActivityInfo.qml +++ b/src/activities/share/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Follow the instructions shown on the screen: first, drag the given number of boys/girls to the middle, then drag pieces of candy to each child's rectangle.") credit: "" - section: "math" + section: "math arithmetic" createdInVersion: 7000 } diff --git a/src/activities/share/Share.qml b/src/activities/share/Share.qml --- a/src/activities/share/Share.qml +++ b/src/activities/share/Share.qml @@ -64,7 +64,7 @@ property int totalCandies property int totalChildren: totalBoys + totalGirls property int barHeightAddon: ApplicationSettings.isBarHidden ? 1 : 3 - property int cellSize: Math.round(Math.min(background.width / 11, background.height / (9 + barHeightAddon))) + property int cellSize: Math.round(Math.min(background.width / 12, background.height / (11 + barHeightAddon))) property alias repeaterDropAreas: repeaterDropAreas property int maxNumberOfCandiesPerWidget: 8 } @@ -255,7 +255,7 @@ border.width: 4 z: 4 - //grid with ok button and images of a boy, a girl, a candy and a basket + //grid with ok button and images of a boy, a girl, a candy, a basket and the button to display the instructions Grid { id: view x: 10 @@ -264,13 +264,13 @@ width: background.vert ? leftWidget.width : 3 * bar.height height: background.vert ? background.height - 2 * bar.height : bar.height spacing: 10 - columns: background.vert ? 1 : 5 + columns: background.vert ? 1 : 6 //ok button Image { id: okButton source:"qrc:/gcompris/src/core/resource/bar_ok.svg" - sourceSize.width: items.cellSize * 1.5 + sourceSize.width: items.cellSize * 1.5 - view.x / 2 fillMode: Image.PreserveAspectFit MouseArea { @@ -309,6 +309,21 @@ current: background.currentCandies element.opacity: background.easyMode ? 1 : 0 } + + Image { + id: showInstruction + source:"qrc:/gcompris/src/core/resource/bar_hint.svg" + sourceSize.width: items.cellSize * 1.5 - view.x / 2 + fillMode: Image.PreserveAspectFit + + MouseArea { + anchors.fill: parent + enabled: background.finished ? false : true + onPressed: showInstruction.opacity = 0.6 + onReleased: showInstruction.opacity = 1 + onClicked: items.instruction.opacity == 0 ? items.instruction.show() : items.instruction.hide() + } + } } } diff --git a/src/activities/solar_system/ActivityInfo.qml b/src/activities/solar_system/ActivityInfo.qml --- a/src/activities/solar_system/ActivityInfo.qml +++ b/src/activities/solar_system/ActivityInfo.qml @@ -38,6 +38,6 @@ //: Help manual manual: qsTr("Click on a planet or the Sun to reveal questions. Each question contains 4 options. One of those is 100% correct. Try to answer the questions until you get a 100% closeness in the closeness meter.") credit: "" - section: "experiment" + section: "sciences experiment" createdInVersion: 9500 } diff --git a/src/activities/submarine/ActivityInfo.qml b/src/activities/submarine/ActivityInfo.qml --- a/src/activities/submarine/ActivityInfo.qml +++ b/src/activities/submarine/ActivityInfo.qml @@ -54,7 +54,7 @@ + : Increase diving plane angle - : Decrease diving plane angle") credit: "" - section: "experimental" + section: "sciences experiment" enabled: ApplicationInfo.isBox2DInstalled createdInVersion: 9000 } diff --git a/src/activities/sudoku/ActivityInfo.qml b/src/activities/sudoku/ActivityInfo.qml --- a/src/activities/sudoku/ActivityInfo.qml +++ b/src/activities/sudoku/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Select a number or a symbol on the left and click on its target position. GCompris will not let you enter invalid data.") credit: "" - section: "puzzle" + section: "discovery logic" createdInVersion: 0 } diff --git a/src/activities/superbrain/ActivityInfo.qml b/src/activities/superbrain/ActivityInfo.qml --- a/src/activities/superbrain/ActivityInfo.qml +++ b/src/activities/superbrain/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Click on the items until you find what you think is the correct answer. Then, click on the OK button. In the lower levels, Tux gives you an indication if you found a hiding place by marking the item with a black box. In the levels 4 and 8 an item may be hidden several times.
    You can use the right mouse button to flip the items in the opposite order or the item chooser to directly pick an item. Press and hold a mouse button or on the touch screen to automatically choose the last item selected on a column. Double click or tap on a previously selected item in your guess history to mark it as 'correct'. Such marked items are automatically selected in your current and future guesses until you un-mark them, again by double clicking or tapping.") credit: "" - section: "puzzle" + section: "discovery logic" createdInVersion: 4000 } diff --git a/src/activities/tangram/ActivityInfo.qml b/src/activities/tangram/ActivityInfo.qml --- a/src/activities/tangram/ActivityInfo.qml +++ b/src/activities/tangram/ActivityInfo.qml @@ -40,7 +40,7 @@ //: Help prerequisite prerequisite: qsTr("Mouse-manipulation") //: Help manual - manual: qsTr("Select the tangram 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. At first levels, simpler objects are used to introduce the tangram concept.") + manual: qsTr("Select the tangram 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. Check baby tangram activity for an introduction to tangram.") credit: "" section: "puzzle" createdInVersion: 6000 diff --git a/src/activities/tangram/Tangram.qml b/src/activities/tangram/Tangram.qml --- a/src/activities/tangram/Tangram.qml +++ b/src/activities/tangram/Tangram.qml @@ -33,6 +33,9 @@ onStart: focus = true onStop: {} + property var dataset: Dataset + property string resourceUrl: "qrc:/gcompris/src/activities/tangram/resource/" + Keys.onPressed: Activity.processPressedKey(event) pageComponent: Item { @@ -55,7 +58,7 @@ Image { id: bg - source: Activity.url + "tangram/background.svg" + source: activity.resourceUrl + "tangram/background.svg" sourceSize.width: 2000 * ApplicationInfo.ratio sourceSize.height: 2000 * ApplicationInfo.ratio width: 2000 * background.playRatio @@ -89,8 +92,8 @@ property alias userList: userList property alias userListModel: userList.model property Item selectedItem - property var currentTans: Dataset.dataset[bar.level - 1] - property int numberOfLevel: Dataset.dataset.length + property var currentTans: dataset.dataset[bar.level - 1] + property int numberOfLevel: dataset.dataset.length property bool editionMode: false } @@ -101,7 +104,7 @@ Image { id: bgData - source: items.currentTans.bg ? Activity.url + items.currentTans.bg : '' + source: items.currentTans.bg ? activity.resourceUrl + items.currentTans.bg : '' sourceSize.width: 1000 * background.playRatio sourceSize.height: 1000 * background.playRatio width: 1000 * background.playRatio @@ -128,7 +131,7 @@ id: tansModel x: background.playX + background.playWidth * modelData.x - width / 2 y: background.playY + background.playHeight * modelData.y - height / 2 - source: Activity.url + "m-" + modelData.img + source: activity.resourceUrl + "m-" + modelData.img sourceSize.width: modelData.width * background.playWidth sourceSize.height: modelData.height * background.playWidth z: index @@ -186,7 +189,7 @@ Image { id: tans mirror: !items.editionMode ? modelData.initFlipping : modelData.flipping - source: Activity.url + modelData.img + source: activity.resourceUrl + modelData.img sourceSize.width: modelData.width * background.playWidth sourceSize.height: modelData.height * background.playWidth } diff --git a/src/activities/tangram/dataset.js b/src/activities/tangram/dataset.js --- a/src/activities/tangram/dataset.js +++ b/src/activities/tangram/dataset.js @@ -25,699 +25,6 @@ */ 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 - } - ] - }, { 'bg': '', 'name': 'Level 5 Real Tangram', diff --git a/src/activities/tangram/resource/README b/src/activities/tangram/resource/README --- a/src/activities/tangram/resource/README +++ b/src/activities/tangram/resource/README @@ -1,12 +1,6 @@ Copyright: 2000, 2008 Bruno Coudoin and others License: Public domain Files: -car1/bumper.svg -car1/car.svg -car1/grille.svg -car1/headlights.svg -car1/tire_right.svg -car1/windshield.svg tangram/background.svg tangram/flip.svg tangram/p0.svg @@ -14,13 +8,3 @@ tangram/p2.svg tangram/p3.svg tangram/p4.svg -train/coal.svg -train/loco.svg -train/passenger.svg -train/wood.svg -truck/back_road.svg -truck/cabin.svg -truck/container.svg -truck/engine.svg -truck/front_road.svg -truck/traffic_bg.svg diff --git a/src/activities/tangram/tangram.js b/src/activities/tangram/tangram.js --- a/src/activities/tangram/tangram.js +++ b/src/activities/tangram/tangram.js @@ -22,9 +22,6 @@ .pragma library .import QtQuick 2.6 as Quick -var url = "qrc:/gcompris/src/activities/tangram/resource/" - - var currentLevel = 0 var items diff --git a/src/activities/target/ActivityInfo.qml b/src/activities/target/ActivityInfo.qml --- a/src/activities/target/ActivityInfo.qml +++ b/src/activities/target/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Check the speed and direction of the target, and then click on it to launch a dart. When all your darts are thrown, you are asked to count your score. Enter the score with the keyboard.") credit: "" - section: "math addition" + section: "math addition arithmetic" createdInVersion: 0 } diff --git a/src/activities/traffic/ActivityConfig.qml b/src/activities/traffic/ActivityConfig.qml new file mode 100644 --- /dev/null +++ b/src/activities/traffic/ActivityConfig.qml @@ -0,0 +1,60 @@ +/* GCompris - ActivityConfig.qml + * + * Copyright (C) 2019 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 "../../core" + +Item { + id: activityConfiguration + property Item background + property alias modeBox: modeBox + property var availableModes: [ + { "text": qsTr("Colors"), "value": "COLOR" }, + { "text": qsTr("Images"), "value": "IMAGE" } + ] + Flow { + id: flow + spacing: 5 + width: parent.width + GCComboBox { + id: modeBox + model: availableModes + background: activityConfiguration.background + label: qsTr("Select your mode") + } + } + + property var dataToSave + + function setDefaultValues() { + for(var i = 0 ; i < availableModes.length ; i ++) { + if(availableModes[i].value === dataToSave["mode"]) { + modeBox.currentIndex = i; + break; + } + } + } + + function saveValues() { + var newMode = availableModes[modeBox.currentIndex].value; + dataToSave = {"mode": newMode}; + } +} diff --git a/src/activities/traffic/ActivityInfo.qml b/src/activities/traffic/ActivityInfo.qml --- a/src/activities/traffic/ActivityInfo.qml +++ b/src/activities/traffic/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Each car can only move either horizontally or vertically. You must make some room in order to let the red car move through the gate on the right.") credit: "" - section: "puzzle" + section: "discovery logic" createdInVersion: 0 } diff --git a/src/activities/traffic/Traffic.qml b/src/activities/traffic/Traffic.qml --- a/src/activities/traffic/Traffic.qml +++ b/src/activities/traffic/Traffic.qml @@ -45,7 +45,7 @@ // mode, candidate for a config dialog Component.onCompleted: { - dialogActivityConfig.getInitialConfiguration() + dialogActivityConfig.initialize() activity.start.connect(start) activity.stop.connect(stop) } @@ -105,59 +105,30 @@ id: dialogHelp onClose: home() } - - DialogActivityConfig { - id: dialogActivityConfig - currentActivity: activity - content: Component { - Item { - property alias modeBox: modeBox - property var availableModes: [ - { "text": qsTr("Colors"), "value": "COLOR" }, - { "text": qsTr("Images"), "value": "IMAGE" } - ] + DialogChooseLevel { + id: dialogActivityConfig + currentActivity: activity.activityInfo - Flow { - id: flow - spacing: 5 - width: dialogActivityConfig.width - GCComboBox { - id: modeBox - model: availableModes - background: dialogActivityConfig - label: qsTr("Select your mode") - } - } - } + onClose: { + home() } - onClose: home() - onLoadData: { - if(dataToSave && dataToSave["mode"]) { - mode = dataToSave["mode"]; - Activity.mode = dataToSave["mode"]; - } - } - onSaveData: { - mode = dialogActivityConfig.configItem.availableModes[dialogActivityConfig.configItem.modeBox.currentIndex].value; - dataToSave = {"mode": mode} - Activity.mode = mode; + levelFolder = dialogActivityConfig.chosenLevel + currentActivity.currentLevel = dialogActivityConfig.chosenLevel + ApplicationSettings.setCurrentLevel(currentActivity.name, dialogActivityConfig.chosenLevel) + home() } - - function setDefaultValues() { - for(var i = 0 ; i < dialogActivityConfig.configItem.availableModes.length ; i ++) { - if(dialogActivityConfig.configItem.availableModes[i].value === mode) { - dialogActivityConfig.configItem.modeBox.currentIndex = i; - break; - } + onLoadData: { + if(activityData && activityData["mode"]) { + background.mode = activityData["mode"]; } } } Bar { id: bar - content: BarEnumContent { value: help | home | level | reload | config } + content: BarEnumContent { value: help | home | level | reload | activityConfig } onHelpClicked: { displayDialog(dialogHelp) } @@ -165,10 +136,7 @@ onNextLevelClicked: Activity.nextLevel() onHomeClicked: activity.home() onReloadClicked: Activity.initLevel() - onConfigClicked: { - dialogActivityConfig.active = true - // Set default values - dialogActivityConfig.setDefaultValues(); + onActivityConfigClicked: { displayDialog(dialogActivityConfig) } } diff --git a/src/activities/watercycle/ActivityInfo.qml b/src/activities/watercycle/ActivityInfo.qml --- a/src/activities/watercycle/ActivityInfo.qml +++ b/src/activities/watercycle/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Click on different active elements: sun, cloud, pumping station, and the sewage treatment plant, in order to reactivate the entire water system. When the system is back up and Tux is in the shower, push the shower button for him.") credit: qsTr("Drawing by Stephane Cabaraux.") - section: "experiment" + section: "sciences experiment" createdInVersion: 5000 } diff --git a/src/activities/wordsgame/ActivityInfo.qml b/src/activities/wordsgame/ActivityInfo.qml --- a/src/activities/wordsgame/ActivityInfo.qml +++ b/src/activities/wordsgame/ActivityInfo.qml @@ -35,6 +35,6 @@ //: Help manual manual: qsTr("Type the complete word as it falls, before it reaches the ground") credit: "" - section: "computer keyboard reading" + section: "computer keyboard reading words" createdInVersion: 0 } diff --git a/src/activities/wordsgame/resource/default-br.json b/src/activities/wordsgame/resource/default-br.json new file mode 100644 --- /dev/null +++ b/src/activities/wordsgame/resource/default-br.json @@ -0,0 +1,732 @@ +{ + "levels" : [ + { + "level" : "1", + "sublevels" : "15", + "words" : [ + "ar", + "al", + "an", + "ul", + "ur", + "un", + "du", + "ti", + "ha", + "re", + "ra", + "en", + "em", + "da", + "eo", + "zo", + "ne", + "ma", + "ta", + "he", + "me", + "te", + "hi", + "ni", + "ho", + "on", + "ki", + "se", + "pe", + "na", + "su", + "vi", + "ya", + "tu", + "ed", + "miz", + "tro", + "tre", + "mat", + "noz", + "mae", + "lun", + "sul", + "tri", + "div", + "nav", + "dek", + "war", + "fri", + "jod", + "kof", + "per", + "kan", + "all", + "bro", + "dor", + "sal", + "beg", + "pav", + "hir", + "aes", + "fin", + "sot", + "noz", + "liv", + "oto", + "eil", + "fav", + "tra", + "sae", + "loa" + ] + }, + { + "level" : "2", + "sublevels" : "15", + "words" : [ + "tad", + "pep", + "roz", + "ket", + "geo", + "eus", + "aze", + "mod", + "int", + "hon", + "hor", + "hol", + "hag", + "out", + "omp", + "anv", + "bet", + "oad", + "niz", + "hen", + "yen", + "mor", + "aod", + "bag", + "tud", + "tan", + "den", + "aon", + "yar", + "biz", + "eur", + "mil", + "pok", + "dre", + "met", + "kig", + "giz", + "tok", + "piv", + "bed", + "rak", + "evit", + "gant", + "skol", + "klas", + "deiz", + "eost", + "yaou", + "here", + "unan", + "daou", + "teir", + "pemp", + "eizh", + "mann", + "bras", + "glas", + "gwer", + "rous", + "gell", + "mouk", + "lenn", + "mont", + "uhel", + "izel", + "pell", + "chom", + "kaer", + "brav", + "lous", + "prop", + "ivez", + "holl", + "kant", + "kozh", + "even", + "ober", + "kazh", + "penn", + "blev", + "kein", + "aval", + "sivi", + "tort", + "golo", + "pizh", + "ouzh", + "levr", + "diri", + "koad", + "korn", + "dall", + "laez", + "taol", + "gwir", + "gaou", + "faos", + "dont", + "buan", + "tost", + "gwez" + ] + }, + { + "level" : "3", + "sublevels" : "15", + "words" : [ + "kêr", + "heol", + "glav", + "dant", + "sili", + "emañ", + "fall", + "tomm", + "loen", + "istr", + "amañ", + "avel", + "hini", + "pesk", + "pebr", + "soñj", + "maen", + "ebet", + "naon", + "oc'h", + "hent", + "hañv", + "teil", + "lemm", + "edaj", + "foto", + "echu", + "dour", + "dañs", + "pont", + "yezh", + "reiñ", + "urzh", + "live", + "tamm", + "sukr", + "diñs", + "litr", + "lomm", + "ouzh", + "koef", + "berr", + "lost", + "maez", + "meur", + "foñs", + "bara", + "karr", + "arzh", + "leun", + "setu", + "ront", + "bout", + "pezh", + "evañ", + "stad", + "bale", + "park", + "prad", + "moan", + "dorn", + "mare", + "sell", + "dous", + "ludu", + "kalz", + "barv", + "korf", + "erru", + "evel", + "mamm", + "stêr", + "lann", + "foar", + "avat", + "kuit", + "geot", + "beaj", + "bran", + "naer", + "loar", + "gour", + "paotr", + "istor", + "kerzu", + "livañ", + "pevar", + "peder", + "seizh", + "klask", + "traoñ", + "bihan", + "gwenn", + "melen", + "niver", + "c'hwi", + "unnek", + "goañv", + "ugent", + "bloaz", + "breur", + "kanañ", + "amzer", + "ebrel", + "roc'h", + "nevez", + "ganet", + "banne", + "hemañ", + "trist", + "lagad", + "demat", + "mouar", + "gwezh", + "homañ", + "petra", + "perak", + "diwar", + "armel", + "kambr", + "boest", + "nec'h", + "logod", + "skrid", + "kador", + "pegen", + "lec'h", + "krank", + "eontr", + "nizez", + "arnev", + "ormel", + "meskl", + "erc'h", + "norzh", + "reter", + "bugel", + "kaout", + "babig", + "magañ", + "amann", + "holen", + "moc'h", + "kaier", + "spont", + "saout", + "begel", + "kreñv", + "timbr", + "douar", + "porzh", + "ingal", + "trenk", + "botoù", + "sevel", + "kraoñ", + "maskl", + "stumm", + "paper", + "sioul", + "gouel", + "kegin", + "bezañ", + "bleud", + "laezh", + "hiziv", + "kemer", + "diaes", + "redek", + "dec'h", + "tapet", + "paket", + "trede", + "bleiz", + "dilun", + "disul", + "dafar", + "doare", + "treiñ", + "nemet", + "dibab", + "seurt", + "brulu", + "sac'h", + "koulz", + "trouz", + "brozh", + "ledan", + "menez", + "asied", + "bevañ", + "foenn", + "traoù", + "bagad", + "burev", + "poull", + "toull", + "paour", + "lifre", + "padus", + "benel" + ] + }, + { + "level" : "4", + "sublevels" : "15", + "words" : [ + "lizher", + "sizhun", + "genver", + "meurzh", + "marc'h", + "gouere", + "gwener", + "sadorn", + "familh", + "sklaer", + "galleg", + "plac'h", + "mouezh", + "kregiñ", + "duhont", + "labour", + "trizek", + "merc'h", + "pemzek", + "seitek", + "hanter", + "gevell", + "teñval", + "diskar", + "deskiñ", + "laouen", + "dindan", + "emaint", + "krec'h", + "kenavo", + "diskan", + "kuzhat", + "dastum", + "penaos", + "dañsal", + "lodenn", + "trepas", + "kentañ", + "rideoz", + "lerc'h", + "diwall", + "breizh", + "plijus", + "heñvel", + "tapout", + "moereb", + "siwazh", + "tremen", + "stered", + "broc'h", + "kregin", + "bremañ", + "kokouz", + "kornog", + "bouloù", + "bugale", + "kavout", + "karout", + "mignon", + "buoc'h", + "kreion", + "torret", + "spered", + "fardañ", + "pignat", + "billig", + "fonnus", + "pomper", + "gouloù", + "sorser", + "digant", + "sekred", + "lipous", + "lakaat", + "rozenn", + "meskañ", + "louarn", + "anezhe", + "tachoù", + "gwetur", + "pevare", + "karrez", + "terriñ", + "paouez", + "kazhig", + "azezañ", + "linenn", + "kistin", + "nebeut", + "kabell", + "dilhad", + "debriñ", + "roched", + "kombod", + "cheñch", + "benveg", + "kinnig", + "farsus", + "ijinañ", + "neuial", + "loeroù", + "kustum", + "bezhin", + "mintin", + "bragoù", + "ezhomm", + "goullo", + "houarn", + "bemdez", + "kelorn", + "kloc'h", + "adarre", + "binioù", + "eostig", + "lapous", + "gourel", + "lammat", + "bannañ", + "konifl", + "bodenn", + "c'hoazh", + "saozneg", + "testenn", + "frazenn", + "daouzek", + "naontek", + "orañjez", + "tregont", + "deiziad", + "skrivañ", + "pegoulz", + "c'hoari", + "goulenn", + "respont", + "sellout", + "reizhañ", + "hennezh", + "honnezh", + "kastell", + "kaouenn", + "c'hoant", + "taolenn", + "yec'hed", + "pesketa", + "yaouank", + "klevout", + "koumoul", + "gwrac'h", + "goustad", + "kousket", + "studiañ", + "levenez", + "prantad", + "reolenn", + "olifant", + "kompren", + "poazhañ", + "skolaer", + "gallout", + "skudell", + "gouzout", + "cholori", + "gwelout", + "chaseal", + "pemoc'h", + "peseurt", + "plijout", + "frouezh", + "diriaou", + "mourroù", + "follenn", + "horolaj", + "gwezenn", + "dervenn", + "lunedoù", + "karotez", + "marmouz", + "daouarn", + "paotrig", + "bremaik", + "didrouz", + "pelec'h", + "furchal", + "chupenn", + "paradoz", + "spontus", + "sec'hed", + "gwinizh", + "gwerenn", + "rastell", + "sac'had", + "bombard", + "melchon", + "menajer", + "fourmaj", + "enezenn", + "meurvor", + "legumaj", + "nedeleg", + "mankout", + "skornet" + ] + }, + { + "level" : "5", + "sublevels" : "15", + "words" : [ + "boutailh", + "bloavezh", + "merc'her", + "dimeurzh", + "gwengolo", + "c'hwec'h", + "logodenn", + "rimadell", + "pevarzek", + "asambles", + "korrigan", + "c'hwezek", + "silabenn", + "triwec'h", + "rigadell", + "bigorned", + "mignonez", + "skoazell", + "diwezhañ", + "kurunenn", + "vakañsoù", + "sorserez", + "furlukin", + "pellgomz", + "kouezhañ", + "chokolad", + "flamboez", + "skuilhañ", + "chaseour", + "keniterv", + "douarenn", + "nemetken", + "digwener", + "troc'hañ", + "disadorn", + "plankenn", + "prenestr", + "kolonenn", + "pinvidik", + "kentoc'h", + "trugarez", + "plantenn", + "halegenn", + "strollad", + "plac'hig", + "sonerezh", + "taboulin", + "trompilh", + "skeudenn", + "kazetenn", + "melezour", + "arc'hant", + "abardaez", + "lavarout", + "souezhet", + "youc'hal", + "diwezhat", + "marc'had", + "krokodil", + "greunenn", + "gwechall", + "gwerzhañ", + "memestra", + "labourat", + "gwirionez", + "tresadenn", + "tric'horn", + "lizherenn", + "brezhoneg", + "anavezout", + "c'hwevrer", + "kontadenn", + "kanaouenn", + "levraoueg", + "displijus", + "displegañ", + "chifretez", + "steredenn", + "sizailhoù", + "barzhoneg", + "spontailh", + "beilhadeg", + "geriaoueg", + "skolaerez", + "daoulagad", + "bleunienn", + "avalaouer", + "dibunadeg", + "porc'hell", + "briochenn", + "roudenneg", + "kennebeut", + "karrigell", + "kêriadenn", + "sekretour", + "menajerez", + "baleadenn", + "pemzektez", + "dourvarc'h", + "startijenn", + "kenitervez", + "skoazellañ", + "krampouezh", + "pellgomzer", + "dimerc'her", + "warc'hoazh", + "meurlarjez", + "divskouarn", + "serviedenn", + "didroc'hañ", + "urzhiataer", + "araokadenn", + "sekretourez", + "kastelodenn", + "displegadenn", + "diskouezadeg", + "fourchetezenn", + "krampouezhenn", + "dreistordinal", + "reizhskrivadur", + "gourc'hemennoù" + ] + } + ], + "name" : "default-br", + "locale" : "br", + "description" : "Default Breton" +} diff --git a/src/core/ActivityInfoTree.h b/src/core/ActivityInfoTree.h --- a/src/core/ActivityInfoTree.h +++ b/src/core/ActivityInfoTree.h @@ -49,7 +49,7 @@ QVariantList allCharacters(); protected Q_SLOTS: - Q_INVOKABLE void filterByTag(const QString &tag, bool emitChanged = true); + Q_INVOKABLE void filterByTag(const QString &tag, const QString &category = "", bool emitChanged = true); Q_INVOKABLE void filterLockedActivities(bool emitChanged = true); Q_INVOKABLE void filterEnabledActivities(bool emitChanged = true); // create a tree from the whole list of activities with the activities created between the two versions diff --git a/src/core/ActivityInfoTree.cpp b/src/core/ActivityInfoTree.cpp --- a/src/core/ActivityInfoTree.cpp +++ b/src/core/ActivityInfoTree.cpp @@ -121,13 +121,15 @@ // the tag 'all' means no filter // the tag 'favorite' means only marked as favorite // The level is also filtered based on the global property -void ActivityInfoTree::filterByTag(const QString &tag, bool emitChanged) +void ActivityInfoTree::filterByTag(const QString &tag, const QString &category, bool emitChanged) { m_menuTree.clear(); // https://www.kdab.com/goodbye-q_foreach/, for loops on QList may cause detach const auto constMenuTreeFull = m_menuTreeFull; for(const auto &activity: constMenuTreeFull) { - if((activity->section().indexOf(tag) != -1 || + // filter on category if given else on tag + if(((!category.isEmpty() && activity->section().indexOf(category) != -1) || + (category.isEmpty() && activity->section().indexOf(tag) != -1) || tag == "all" || (tag == "favorite" && activity->favorite())) && (activity->difficulty() >= ApplicationSettings::getInstance()->filterLevelMin() && diff --git a/src/core/DialogActivityConfig.qml b/src/core/DialogActivityConfig.qml --- a/src/core/DialogActivityConfig.qml +++ b/src/core/DialogActivityConfig.qml @@ -239,9 +239,10 @@ console.log("Configuration data is invalid, not saving!"); return; } - saveData() - ApplicationSettings.saveActivityConfiguration(activityName, dataToSave) + if(activityName != "") { + ApplicationSettings.saveActivityConfiguration(activityName, dataToSave) + } parent.close() } } diff --git a/src/core/DialogChooseLevel.qml b/src/core/DialogChooseLevel.qml --- a/src/core/DialogChooseLevel.qml +++ b/src/core/DialogChooseLevel.qml @@ -60,6 +60,8 @@ property string chosenLevel + property var activityData + onActivityDataChanged: loadData() /// @endcond /** @@ -72,26 +74,45 @@ */ signal start + onStart: initialize() + signal stop + /** + * Emitted when the settings are to be saved. + * + * The actual persisting of the settings in the settings file is done by + * DialogActivityConfig. The activity has to take care to update its + * internal state. + */ signal saveData signal startActivity + /** + * Emitted when the config settings have been loaded. + */ + signal loadData + color: "#696da3" border.color: "black" border.width: 1 - onCurrentActivityChanged: initialize() - function initialize() { activityName = currentActivity.name.split('/')[0] + + // dataset information chosenLevel = currentActivity.currentLevel difficultiesModel = [] - for(var level in currentActivity.levels) { - objectiveLoader.dataFiles.push({"level": currentActivity.levels[level], "file": "qrc:/gcompris/src/activities/"+activityName+"/resource/"+currentActivity.levels[level]+"/Data.qml"}) + if(currentActivity.levels.length == 0) { + print("no levels to load for", activityName) + } + else { + for(var level in currentActivity.levels) { + objectiveLoader.dataFiles.push({"level": currentActivity.levels[level], "file": "qrc:/gcompris/src/activities/"+activityName+"/resource/"+currentActivity.levels[level]+"/Data.qml"}) + } + objectiveLoader.start() } - objectiveLoader.start() } Loader { @@ -164,6 +185,7 @@ } } + // Header buttons Row { id: datasetOptionsRow height: datasetVisibleButton.height @@ -173,6 +195,7 @@ Button { id: datasetVisibleButton text: qsTr("Dataset") + enabled: difficultiesRepeater.count != 0 width: parent.width / 3 property bool selected: true style: GCButtonStyle { @@ -183,6 +206,7 @@ Button { id: optionsVisibleButton text: qsTr("Options") + enabled: activityConfigFile.exists("qrc:/gcompris/src/activities/"+activityName+"/ActivityConfig.qml") width: parent.width / 3 style: GCButtonStyle { selected: !datasetVisibleButton.selected @@ -191,6 +215,7 @@ } } + // "Dataset"/"Options" content Rectangle { color: "#e6e6e6" radius: 6.0 @@ -209,11 +234,40 @@ flickableDirection: Flickable.VerticalFlick clip: true contentHeight: contentItem.childrenRect.height + 40 * ApplicationInfo.ratio - ExclusiveGroup { - id: levelsGroup + + Loader { + id: configLoader + visible: !datasetVisibleButton.selected + active: optionsVisibleButton.enabled + source: active ? "qrc:/gcompris/src/activities/"+activityName+"/ActivityConfig.qml" : "" + + onItemChanged: { + if(item) { + item.background = dialogChooseLevel + dialogChooseLevel.saveData.connect(save) + getInitialConfiguration() + } + } + function getInitialConfiguration() { + activityData = Qt.binding(function() { return item.dataToSave }) + if(item) { + item.dataToSave = ApplicationSettings.loadActivityConfiguration(activityName) + item.setDefaultValues() + } + } + function save() { + item.saveValues() + ApplicationSettings.saveActivityConfiguration(activityName, item.dataToSave) + } } + Column { + visible: datasetVisibleButton.selected spacing: 10 + + ExclusiveGroup { + id: levelsGroup + } Repeater { id: difficultiesRepeater delegate: Row { @@ -230,7 +284,7 @@ width: dialogChooseLevel.width - 30 - difficultyIcon.width - 2 * flick.anchors.margins text: modelData.objective exclusiveGroup: levelsGroup - checked: chosenLevel == modelData.level + checked: chosenLevel === modelData.level onClicked: chosenLevel = modelData.level } } @@ -250,6 +304,7 @@ downVisible: flick.visibleArea.yPosition + flick.visibleArea.heightRatio >= 1 ? false : true } } + // Footer buttons Row { id: saveAndPlayRow height: cancelButton.height @@ -296,4 +351,8 @@ parent.close() } } + + File { + id: activityConfigFile + } } diff --git a/src/core/GCButtonStyle.qml b/src/core/GCButtonStyle.qml --- a/src/core/GCButtonStyle.qml +++ b/src/core/GCButtonStyle.qml @@ -30,6 +30,7 @@ * @inherit QtQuick.Controls.Styles.ButtonStyle */ ButtonStyle { + id: buttonStyle /** * type:real * Fixed font size of the label in pt. @@ -85,6 +86,8 @@ } } + property bool selected: false + property string textSize: "regular" property var textSizes: { @@ -102,15 +105,13 @@ } } - property bool selected: false - background: Rectangle { border.width: control.activeFocus ? 4 : 2 border.color: themes[theme].borderColor radius: 10 gradient: Gradient { - GradientStop { position: 0 ; color: (control.pressed || selected) ? themes[theme].selectedColorGradient0 : themes[theme].backgroundColorGradient0 } - GradientStop { position: 1 ; color: (control.pressed || selected) ? themes[theme].selectedColorGradient1 : themes[theme].backgroundColorGradient1 } + GradientStop { position: 0 ; color: (control.pressed || buttonStyle.selected) ? themes[theme].selectedColorGradient0 : themes[theme].backgroundColorGradient0 } + GradientStop { position: 1 ; color: (control.pressed || buttonStyle.selected) ? themes[theme].selectedColorGradient1 : themes[theme].backgroundColorGradient1 } } } label: Item { diff --git a/src/core/GCComboBox.qml b/src/core/GCComboBox.qml --- a/src/core/GCComboBox.qml +++ b/src/core/GCComboBox.qml @@ -232,7 +232,7 @@ function hidePopUpAndRestoreFocus() { popup.visible = false; // Restore focus on previous activity for keyboard input - background.currentActivity.forceActiveFocus(); + background.forceActiveFocus(); } Rectangle { diff --git a/src/core/LanguageList.qml b/src/core/LanguageList.qml --- a/src/core/LanguageList.qml +++ b/src/core/LanguageList.qml @@ -65,7 +65,7 @@ { "text": "Italiano", "locale": "it_IT.UTF-8" }, //{ "text": "Lietuvių", "locale": "lt_LT.UTF-8" }, //{ "text": "Latviešu", "locale": "lv_LV.UTF-8" }, - { "text": "മലയാളം", "locale": "ml_IN.UTF-8" }, + { "text": "മലയാളം", "locale": "ml_IN.UTF-8" }, { "text": "Nederlands", "locale": "nl_NL.UTF-8" }, { "text": "Norsk (nynorsk)", "locale": "nn_NO.UTF-8" }, { "text": "Polski", "locale": "pl_PL.UTF-8" }, diff --git a/src/core/ParticleSystemStar.qml b/src/core/ParticleSystemStar.qml --- a/src/core/ParticleSystemStar.qml +++ b/src/core/ParticleSystemStar.qml @@ -37,12 +37,12 @@ ParticleSystem { id: particles anchors.fill: parent + running: false /// @cond INTERNAL_DOCS property alias emitter: clickedEmitter property alias clip: imageParticle.clip - /// @endcond Emitter { diff --git a/src/core/ParticleSystemStarLoader.qml b/src/core/ParticleSystemStarLoader.qml --- a/src/core/ParticleSystemStarLoader.qml +++ b/src/core/ParticleSystemStarLoader.qml @@ -42,8 +42,18 @@ * Cf. Emitter.burst */ function burst(val) { - if(active) + if(active) { + item.start() item.emitter.burst(val) + stopParticleSystem.restart() + } + } + + Timer { + id: stopParticleSystem + interval: item.emitter.lifeSpan + item.emitter.lifeSpanVariation + repeat: false + onTriggered: item.stop() } onLoaded: item.clip = clip source: "ParticleSystemStar.qml" diff --git a/src/core/main.qml b/src/core/main.qml --- a/src/core/main.qml +++ b/src/core/main.qml @@ -347,27 +347,5 @@ property Component replaceTransition: pushHTransition } } - - onSceneGraphError: { - print("scene graph error ", error, message) - ApplicationSettings.renderer = "software" - Core.showMessageDialog( - main, - qsTr("There is an issue while running GCompris. " + - "We have fallbacken to software renderer mode that should solve the issue. ") + - "You need to restart GCompris so it can take effect.", - "", null, "", null, null); - } - - onSceneGraphInvalidated: { - print("scene graph invalidated") - ApplicationSettings.renderer = "software" - Core.showMessageDialog( - main, - qsTr("There is an issue while running GCompris. " + - "We have fallbacken to software renderer mode that should solve the issue. ") + - "You need to restart GCompris so it can take effect.", - "", null, "", null, null); - } /// @endcond }