diff --git a/src/activities/calendar/Calendar.qml b/src/activities/calendar/Calendar.qml index 14e24d2f4..d4d591aea 100644 --- a/src/activities/calendar/Calendar.qml +++ b/src/activities/calendar/Calendar.qml @@ -1,493 +1,493 @@ /* GCompris - Calendar.qml * * Copyright (C) 2017 Amit Sagtani * * Authors: * Amit Sagtani * * 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 QtQuick.Controls 1.5 import QtQuick.Controls.Private 1.0 import QtQuick.Controls.Styles 1.4 import "../../core" import "calendar.js" as Activity import "calendar_dataset.js" as Dataset import "tutorial_instructions.js" as Instructions ActivityBase { id: activity property var dataset: Dataset onStart: focus = true onStop: {} property var tutorialInstructions: Instructions.get() property bool showTutorial: true pageComponent: Image { id: background signal start signal stop fillMode: Image.PreserveAspectCrop source: "qrc:/gcompris/src/activities/fifteen/resource/background.svg" sourceSize.width: Math.max(parent.width, parent.height) Component.onCompleted: { dialogActivityConfig.initialize() 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 alias calendar: calendar property alias okButton: okButton property alias questionItem: questionItem property var levels: activity.datasetLoader.item.data property alias score: score property alias answerChoices: answerChoices property alias questionDelay: questionDelay property alias okButtonParticles: okButtonParticles property bool horizontalLayout: background.width >= background.height * 1.5 property alias daysOfTheWeekModel: daysOfTheWeekModel property bool showTutorial: activity.showTutorial } onStart: { Activity.start(items) } onStop: { Activity.stop() } Keys.onPressed: (answerChoices.visible) ? answerChoices.handleKeys(event) : handleKeys(event); // Question time delay Timer { id: questionDelay repeat: false interval: 1600 onTriggered: { Activity.initQuestion() } onRunningChanged: okButtonMouseArea.enabled = !okButtonMouseArea.enabled } Rectangle { id: calendarBox width: items.horizontalLayout ? (answerChoices.visible ? parent.width * 0.75 : parent.width * 0.80) : (answerChoices.visible ? parent.width * 0.65 : parent.width * 0.85) height: items.horizontalLayout ? parent.height * 0.68 : parent.height - bar.height - questionItemBackground.height - okButton.height * 1.5 anchors.top: questionItem.bottom anchors.topMargin: 5 anchors.rightMargin: answerChoices.visible ? 100 : undefined anchors.horizontalCenterOffset: answerChoices.visible ? 80 : 0 anchors.horizontalCenter: parent.horizontalCenter color: "black" opacity: 0.3 } Calendar { id: calendar weekNumbersVisible: false width: calendarBox.width * 0.96 height: calendarBox.height * 0.96 anchors.centerIn: calendarBox frameVisible: true focus: !answerChoices.visible __locale: Qt.locale(ApplicationInfo.localeShort) style: CalendarStyle { navigationBar: Rectangle { height: calendar.height * 0.12 color: "#f2f2f2" BarButton { id: previousMonth height: parent.height * 0.8 width: previousMonth.height sourceSize.height: previousMonth.height sourceSize.width: previousMonth.width anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left anchors.leftMargin: parent.height * 0.1 source: "qrc:/gcompris/src/core/resource/scroll_down.svg" rotation: 90 visible: ((calendar.visibleYear + calendar.visibleMonth) > Activity.minRange) ? true : false onClicked: calendar.showPreviousMonth() } GCText { id: dateText text: styleData.title color: "#373737" horizontalAlignment: Text.AlignHCenter fontSizeMode: Text.Fit anchors.verticalCenter: parent.verticalCenter anchors.left: previousMonth.right anchors.leftMargin: 2 anchors.right: nextMonth.left anchors.rightMargin: 2 } BarButton { id: nextMonth height: previousMonth.height width: nextMonth.height sourceSize.height: nextMonth.height sourceSize.width: nextMonth.width anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right anchors.rightMargin: previousMonth.anchors.leftMargin source: "qrc:/gcompris/src/core/resource/scroll_down.svg" rotation: 270 visible: ((calendar.visibleYear + calendar.visibleMonth) < Activity.maxRange) ? true : false onClicked: calendar.showNextMonth() } } dayDelegate: Rectangle { anchors.fill: parent anchors.leftMargin: (!addExtraMargin || control.weekNumbersVisible) && styleData.index % CalendarUtils.daysInAWeek === 0 ? 0 : -1 anchors.rightMargin: !addExtraMargin && styleData.index % CalendarUtils.daysInAWeek === CalendarUtils.daysInAWeek - 1 ? 0 : -1 anchors.bottomMargin: !addExtraMargin && styleData.index >= CalendarUtils.daysInAWeek * (CalendarUtils.weeksOnACalendarMonth - 1) ? 0 : -1 anchors.topMargin: styleData.selected ? -1 : 0 color: styleData.date !== undefined && styleData.selected ? selectedDateColor : "#F2F2F2" border.color: "#cec4c4" radius: 5 property bool addExtraMargin: control.frameVisible && styleData.selected readonly property color sameMonthDateTextColor: "#373737" readonly property color selectedDateColor: "#3778d0" readonly property color selectedDateTextColor: "white" readonly property color differentMonthDateTextColor: "#bbb" readonly property color invalidDateColor: "#dddddd" Label { id: dayDelegateText text: styleData.date.getDate() anchors.centerIn: parent horizontalAlignment: Text.AlignRight font.family: GCSingletonFontLoader.fontLoader.name font.pixelSize: Math.min(parent.height/3, parent.width/3) color: { var theColor = invalidDateColor; if (styleData.valid) { // Date is within the valid range. theColor = styleData.visibleMonth ? sameMonthDateTextColor : differentMonthDateTextColor; if (styleData.selected) theColor = selectedDateTextColor; } theColor; } } } dayOfWeekDelegate: Rectangle { color: "lightgray" implicitHeight: Math.round(TextSingleton.implicitHeight * 2.25) Label { text: control.__locale.dayName(styleData.dayOfWeek, control.dayOfWeekFormat) font.family: GCSingletonFontLoader.fontLoader.name fontSizeMode: Text.Fit minimumPixelSize: 1 font.pixelSize: items.horizontalLayout ? parent.height * 0.7 : parent.width * 0.2 color: "#373737" anchors.centerIn: parent } } } onVisibleMonthChanged: { Activity.monthSelected = visibleMonth Activity.daySelected = selectedDate.getDate() } onVisibleYearChanged: { Activity.yearSelected = visibleYear Activity.daySelected = selectedDate.getDate() } onClicked: { Activity.daySelected = selectedDate.getDate() } onSelectedDateChanged: { Activity.daySelected = selectedDate.getDate() } } function handleKeys(event) { if(event.key === Qt.Key_Space && okButtonMouseArea.enabled) { Activity.checkAnswer() event.accepted = true } if(event.key === Qt.Key_Enter && okButtonMouseArea.enabled) { Activity.checkAnswer() event.accepted = true } if(event.key === Qt.Key_Return && okButtonMouseArea.enabled) { Activity.checkAnswer() event.accepted = true } if(event.key === Qt.Key_Home) { calendar.__selectFirstDayOfMonth(); event.accepted = true; } if(event.key === Qt.Key_End) { calendar.__selectLastDayOfMonth(); event.accepted = true; } if(event.key === Qt.Key_PageUp) { calendar.__selectPreviousMonth(); event.accepted = true; } if(event.key === Qt.Key_PageDown) { calendar.__selectNextMonth(); event.accepted = true; } if(event.key === Qt.Key_Left) { calendar.__selectPreviousDay(); event.accepted = true; } if(event.key === Qt.Key_Up) { calendar.__selectPreviousWeek(); event.accepted = true; } if(event.key === Qt.Key_Down) { calendar.__selectNextWeek(); event.accepted = true; } if(event.key === Qt.Key_Right) { calendar.__selectNextDay(); event.accepted = true; } } ListModel { id: daysOfTheWeekModel ListElement { text: qsTr("Sunday"); dayIndex: 0 } ListElement { text: qsTr("Monday"); dayIndex: 1 } ListElement { text: qsTr("Tuesday"); dayIndex: 2 } ListElement { text: qsTr("Wednesday"); dayIndex: 3 } ListElement { text: qsTr("Thursday"); dayIndex: 4 } ListElement { text: qsTr("Friday"); dayIndex: 5 } ListElement { text: qsTr("Saturday"); dayIndex: 6 } } // Creates a table consisting of days of weeks. GridView { id: answerChoices model: daysOfTheWeekModel anchors.top: calendarBox.top anchors.left: questionItem.left anchors.topMargin: 5 interactive: false property bool keyNavigation: false width: calendarBox.x - anchors.rightMargin height: (calendar.height / 6.5) * 7 cellWidth: calendar.width * 0.5 cellHeight: calendar.height / 6.5 keyNavigationWraps: true anchors.rightMargin: 10 * ApplicationInfo.ratio delegate: ChoiceTable { width: answerChoices.width height: answerChoices.height / 7 choices.text: text anchors.rightMargin: 2 } Keys.enabled: answerChoices.visible function handleKeys(event) { if(event.key === Qt.Key_Down) { keyNavigation = true answerChoices.moveCurrentIndexDown() } if(event.key === Qt.Key_Up) { keyNavigation = true answerChoices.moveCurrentIndexUp() } if(event.key === Qt.Key_Enter && !questionDelay.running) { keyNavigation = true Activity.dayOfWeekSelected = model.get(currentIndex).dayIndex answerChoices.currentItem.select() } if(event.key === Qt.Key_Space && !questionDelay.running) { keyNavigation = true Activity.dayOfWeekSelected = model.get(currentIndex).dayIndex answerChoices.currentItem.select() } if(event.key === Qt.Key_Return && !questionDelay.running) { keyNavigation = true Activity.dayOfWeekSelected = model.get(currentIndex).dayIndex answerChoices.currentItem.select() } } highlight: Rectangle { width: parent.width * 1.2 height: parent.height / 7 anchors.horizontalCenter: parent.horizontalCenter color: "#e99e33" border.width: 2 border.color: "#f2f2f2" radius: 5 visible: answerChoices.keyNavigation y: answerChoices.currentItem.y Behavior on y { SpringAnimation { spring: 3 damping: 0.2 } } } highlightFollowsCurrentItem: false focus: answerChoices.visible } Rectangle { id: questionItemBackground visible: !showTutorial color: "#373737" border.width: 2 border.color: "#f2f2f2" radius: 10 opacity: 0.85 z: 10 anchors { horizontalCenter: parent.horizontalCenter bottomMargin: 10 } width: parent.width - 20 height: parent.height * 0.1 } // Displays the question. GCText { id: questionItem visible: !showTutorial anchors.fill: questionItemBackground anchors.bottom: questionItemBackground.bottom fontSizeMode: Text.Fit wrapMode: Text.Wrap z: 10 color: "white" verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } //Tutorial section starts Loader { active: showTutorial anchors.fill: parent z: 1 sourceComponent: tutorialComponent Component { id: tutorialComponent Image { id: tutorialImage source: "../digital_electricity/resource/texture01.png" anchors.fill: parent fillMode: Image.Tile Tutorial { id: tutorialSection tutorialDetails: tutorialInstructions useImage: false onSkipPressed: { showTutorial = false Activity.initLevel() } } } } } // Tutorial section ends // Answer Submission button. BarButton { id: okButton source: "qrc:/gcompris/src/core/resource/bar_ok.svg" + visible: !showTutorial height: bar.height * 0.8 width: okButton.height sourceSize.width: okButton.width sourceSize.height: okButton.height - z: 10 anchors.top: calendarBox.bottom anchors.right: calendarBox.right anchors.margins: items.horizontalLayout ? 30 : 6 ParticleSystemStarLoader { id: okButtonParticles clip: false } MouseArea { id: okButtonMouseArea anchors.fill: parent onClicked: { Activity.checkAnswer() } } } DialogChooseLevel { id: dialogActivityConfig currentActivity: activity.activityInfo onSaveData: { levelFolder = dialogActivityConfig.chosenLevel currentActivity.currentLevel = dialogActivityConfig.chosenLevel ApplicationSettings.setCurrentLevel(currentActivity.name, dialogActivityConfig.chosenLevel) background.start() home() } onClose: { home() } onStartActivity: { background.start() } } DialogHelp { id: dialogHelp onClose: home() } Bar { id: bar content: BarEnumContent { value: help | home | level | activityConfig } onHelpClicked: { displayDialog(dialogHelp) } onActivityConfigClicked: { displayDialog(dialogActivityConfig) } onPreviousLevelClicked: Activity.previousLevel() onNextLevelClicked: Activity.nextLevel() onHomeClicked: activity.home() } Bonus { id: bonus Component.onCompleted: win.connect(Activity.nextLevel) } Score { id: score visible: !showTutorial height: okButton.height width: height anchors.top: calendarBox.bottom anchors.bottom: undefined anchors.left: undefined anchors.right: answerChoices.visible ? calendarBox.right : okButton.left anchors.margins: items.horizontalLayout ? 30 : 8 } } } diff --git a/src/activities/calendar/calendar.js b/src/activities/calendar/calendar.js index fddca5323..aaa1e070d 100644 --- a/src/activities/calendar/calendar.js +++ b/src/activities/calendar/calendar.js @@ -1,242 +1,248 @@ /* GCompris - calendar.js * * Copyright (C) 2017 Amit Sagtani * * Authors: * Amit Sagtani * * 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 QtQml 2.2 as Qml .import GCompris 1.0 as GCompris //for ApplicationInfo .import "qrc:/gcompris/src/core/core.js" as Core var currentLevel = 0 var numberOfLevel var currentSubLevel = 1 var currentDataSet var currentLevelConfig var dataset var items var daySelected = 1 var monthSelected = 2 var yearSelected = 2018 var dayOfWeekSelected var minRange //sum of min. visible month and year on calendar for navigation bar next/prev button visibility. var maxRange //sum of max. visible month and year on calendar for navigation bar next/prev button visibility. var correctAnswer var mode var daysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] function start(items_) { items = items_ numberOfLevel = items.levels.length currentLevel = 0 if(Qt.locale(GCompris.ApplicationSettings.locale).firstDayOfWeek == Qml.Locale.Monday) { items.daysOfTheWeekModel.move(0, items.daysOfTheWeekModel.count - 1, 1) } initLevel(); } function stop() { } function initLevel() { currentSubLevel = 1; items.bar.level = currentLevel + 1 currentLevelConfig = items.levels[currentLevel] setCalendarConfigurations() initQuestion(); } function nextLevel() { if(numberOfLevel <= ++currentLevel) { currentLevel = 0 } initLevel(); } function previousLevel() { if(--currentLevel < 0) { currentLevel = numberOfLevel - 1 } initLevel(); } // Configure calendar properties for every level. function setCalendarConfigurations() { minRange = Number(currentLevelConfig["minimumDate"].slice(5,7)) + Number(currentLevelConfig["minimumDate"].slice(0,4)) - 1; maxRange = Number(currentLevelConfig["maximumDate"].slice(5,7)) + Number(currentLevelConfig["maximumDate"].slice(0,4)) - 1; mode = currentLevelConfig["mode"] items.calendar.navigationBarVisible = currentLevelConfig["navigationBarVisible"] items.calendar.minimumDate = currentLevelConfig["minimumDate"] items.calendar.maximumDate = currentLevelConfig["maximumDate"] items.calendar.visibleYear = currentLevelConfig["visibleYear"] yearSelected = currentLevelConfig["visibleYear"] items.calendar.visibleMonth = currentLevelConfig["visibleMonth"] monthSelected = currentLevelConfig["visibleMonth"] items.answerChoices.visible = (mode === "findDayOfWeek") ? true : false items.okButton.visible = !items.answerChoices.visible currentDataSet = currentLevelConfig["questionAnswers"] currentDataSet = Core.shuffle(currentDataSet) items.score.numberOfSubLevels = currentDataSet.length items.score.currentSubLevel = currentSubLevel } function isLeapYear(year) { if(year % 100 == 0 && year % 400 != 0) { return false } else if(year % 4 == 0) { return true } else { return false } } function getDateInLongFormat(date) { var months = [qsTr("January"), qsTr("February"), qsTr("March"), qsTr("April"), qsTr("May"), qsTr("June"), qsTr("July"), qsTr("August"), qsTr("September"), qsTr("October"), qsTr("November"), qsTr("December")]; //: return current date with format including current day, current month(in textual format) and current year return qsTr("%1 %2 %3").arg(date.day).arg(months[date.month]).arg(date.year) } function generateRandomYearMonthDay(minimumDate, maximumDate) { var minYear = Number(minimumDate.slice(0, 4)) var maxYear = Number(maximumDate.slice(0, 4)) var minMonth = Number(minimumDate.slice(5, 7)) var maxMonth = Number(maximumDate.slice(5, 7)) var minDate = Number(minimumDate.slice(8, 10)) var currentYear = minYear + Math.floor(Math.random() * Math.floor((maxYear - minYear + 1))) - var currentMonth = minMonth + Math.floor(Math.random() * Math.floor((maxMonth - minMonth + 1))) + var currentMonth + if(currentLevelConfig.questionAnswers.maxOffset) { + currentMonth = minMonth + Math.floor(Math.random() * Math.floor((maxMonth - minMonth - currentLevelConfig.questionAnswers.maxOffset / 30))) + } else { + currentMonth = minMonth + Math.floor(Math.random() * Math.floor((maxMonth - minMonth + 1))) + } + currentMonth = Math.max(currentMonth, 1) var currentDate daysInMonths[1] = (isLeapYear(currentYear)) ? 29 : 28; currentDate = minDate + Math.floor(Math.random() * Math.floor((daysInMonths[currentMonth - 1] - minDate + 1))) return { year: currentYear, month: currentMonth - 1, day: currentDate } } function addOffsetToCurrentDate(currentDate) { var maxOffset = currentLevelConfig.questionAnswers.maxOffset var offset = Math.floor(maxOffset / 2) + Math.floor(Math.random() * Math.floor(maxOffset)) var storedOffset = offset daysInMonths[1] = (isLeapYear(currentDate.year)) ? 29 : 28; offset += currentDate.day var answerDate = 1; var answerMonth = currentDate.month var answerYear = currentDate.year while(offset > 0) { if(offset - daysInMonths[answerMonth] > 0) { offset -= daysInMonths[answerMonth] answerMonth++; } else { answerDate = offset; offset = 0 } - if(answerMonth > 12) { + if(answerMonth > 11) { answerYear++; daysInMonths[1] = (isLeapYear(answerYear)) ? 29 : 28; answerMonth = 0; } } return { year: answerYear, month: answerMonth, day: answerDate, offset: storedOffset } } function getTemplateQuestionText(mode, date) { var questionText if(mode == "findDayOfWeek") { - questionText = qsTr("What day of the week is on %1?").arg(getDateInLongFormat(date)) + questionText = qsTr("What day of the week is on %1 of given month?").arg(date.day) } else if(mode == "findDay") { - questionText = qsTr("Select day %1?").arg(date.day) + questionText = qsTr("Select day %1").arg(date.day) } else if(mode == "findMonthOnly") { questionText = qsTr("Find month number %1").arg(date.month + 1) } else { if(date.offset) { //: The second argument represents the given date in complete format(with complete month name) and the first argument represents the difference in days between given date and answer date. questionText = qsTr("Find the date %1 days after %2").arg(date.offset).arg(getDateInLongFormat(date)) } else //: The argument represents the answer date in complete format(with complete month name) questionText = qsTr("Find the date %1").arg(getDateInLongFormat(date)) } return questionText } function initQuestion() { if(currentDataSet.length < currentSubLevel) { items.bonus.good("lion") } else { if(!currentLevelConfig.questionsExplicitlyGiven) { var randomDate = generateRandomYearMonthDay(currentLevelConfig.minimumDate, currentLevelConfig.maximumDate) items.score.currentSubLevel = currentSubLevel if(currentLevelConfig.mode == "findDayOfWeek") { var selectedDate = new Date(randomDate.year, randomDate.month - 1, randomDate.day) correctAnswer.dayOfWeek = Number(selectedDate.getDay()) } else if(currentLevelConfig.mode == "findYearMonthDay" && currentLevelConfig.questionAnswers.maxOffset) { correctAnswer = addOffsetToCurrentDate(randomDate) randomDate.offset = correctAnswer.offset } else { correctAnswer = randomDate } items.questionItem.text = getTemplateQuestionText(currentLevelConfig.mode, randomDate) } else { items.score.currentSubLevel = currentSubLevel items.questionItem.text = currentDataSet[currentSubLevel-1]["question"] correctAnswer = currentDataSet[currentSubLevel-1]["answer"] } } } function updateScore(isCorrectAnswer) { if(isCorrectAnswer) { items.questionDelay.start() items.okButtonParticles.burst(20) items.score.playWinAnimation() currentSubLevel++; } else items.bonus.bad("lion") } function checkAnswer() { var isCorrectAnswer = false // For levels having questions based on day of week only. if(mode === "findDayOfWeek") { if(dayOfWeekSelected === correctAnswer["dayOfWeek"]) { isCorrectAnswer = true } } // For levels having question based on month only. else if(mode === "findMonthOnly") { if(correctAnswer["month"].indexOf(monthSelected) >= 0) { isCorrectAnswer = true } } // For levels having question based on day only. else if(mode === "findDay") { if(daySelected === correctAnswer["day"]) { isCorrectAnswer = true } } // For levels having questions based on dayOfWeek, month and year. else { if(monthSelected === correctAnswer["month"] && daySelected === correctAnswer["day"] && yearSelected === correctAnswer["year"]) { isCorrectAnswer = true } } updateScore(isCorrectAnswer) } diff --git a/src/activities/calendar/resource/1/Data.qml b/src/activities/calendar/resource/1/Data.qml index 839ae5c8b..c01cfd370 100644 --- a/src/activities/calendar/resource/1/Data.qml +++ b/src/activities/calendar/resource/1/Data.qml @@ -1,223 +1,223 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Calendar Questions for a single month") - difficulty: 1 + difficulty: 4 data: [ { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5 } }, { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Select day 23"), "answer": {"year": 2018, "month": 2, "day": 23} }, { "question": qsTr("Select day 1"), "answer": {"year": 2018, "month": 2, "day": 1} }, { "question": qsTr("Select day 16"), "answer": {"year": 2018, "month": 2, "day": 16} }, { "question": qsTr("Select day 28"), "answer": {"year": 2018, "month": 2, "day": 28} }, { "question": qsTr("Select day 11"), "answer": {"year": 2018, "month": 2, "day": 11} }, { "question": qsTr("Select day 20"), "answer": {"year": 2018, "month": 2, "day": 20} } ] }, { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDayOfWeek", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 7 } }, { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDayOfWeek", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("What day of week is the 4th of given month?"), "answer": {"dayOfWeek": 0} }, { "question": qsTr("What day of the week is the 12th of given month?"), "answer": {"dayOfWeek": 1} }, { "question": qsTr("What day of the week is the 20th of given month?"), "answer": {"dayOfWeek": 2} }, { "question": qsTr("What day of the week is the 28th of given month?"), "answer": {"dayOfWeek": 3} }, { "question": qsTr("What day of the week is the 22nd of given month?"), "answer": {"dayOfWeek": 4} }, { "question": qsTr("What day of the week is the 16th of given month?"), "answer": {"dayOfWeek": 5} }, { "question": qsTr("What day of the week is the 10th of given month?"), "answer": {"dayOfWeek": 6} } ] }, { "navigationBarVisible": false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Select a Monday between days 1 and 7 of given month"), "answer": {"year": 2018, "month": 2, "day": 5} }, { "question": qsTr("Select a Tuesday between days 8 and 16 of given month"), "answer": {"year": 2018, "month": 2, "day": 13} }, { "question": qsTr("Select a Wednesday between days 15 and 22 of given month"), "answer": {"year": 2018, "month": 2, "day": 21} }, { "question": qsTr("Select a Thursday between days 26 and 31 of given month"), "answer": {"year": 2018, "month": 2, "day": 29} }, { "question": qsTr("Select a Friday between days 20 and 25 of given month"), "answer": {"year": 2018, "month": 2, "day": 23} }, { "question": qsTr("Select a Saturday between days 13 and 23 of given month"), "answer": {"year": 2018, "month": 2, "day": 17} }, { "question": qsTr("Select a Sunday between days 5 and 17 of given month"), "answer": {"year": 2018, "month": 2, "day": 11} } ] }, { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Select a Monday between days 1 and 7 of given month"), "answer": {"year": 2018, "month": 2, "day": 5} }, { "question": qsTr("Select a Tuesday between days 8 and 16 of given month"), "answer": {"year": 2018, "month": 2, "day": 13} }, { "question": qsTr("Select a Wednesday between days 15 and 22 of given month"), "answer": {"year": 2018, "month": 2, "day": 21} }, { "question": qsTr("Select a Thursday between days 26 and 31 of given month"), "answer": {"year": 2018, "month": 2, "day": 29} }, { "question": qsTr("Select a Friday between days 20 and 25 of given month"), "answer": {"year": 2018, "month": 2, "day": 23} }, { "question": qsTr("Select a Saturday between days 13 and 23 of given month"), "answer": {"year": 2018, "month": 2, "day": 17} }, { "question": qsTr("Select a Sunday between days 5 and 17 of given month"), "answer": {"year": 2018, "month": 2, "day": 11} } ] } ] } diff --git a/src/activities/calendar/resource/2/Data.qml b/src/activities/calendar/resource/2/Data.qml index c7054e687..ad2084fb0 100644 --- a/src/activities/calendar/resource/2/Data.qml +++ b/src/activities/calendar/resource/2/Data.qml @@ -1,135 +1,135 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Calendar Questions involving 2 months") - difficulty: 2 + difficulty: 5 data: [ { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 30 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDayOfWeek", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("What day of week is 30 days after 10 March?"), "answer": {"dayOfWeek": 1} }, { "question": qsTr("What day of the week is 40 days after 15 July?"), "answer": {"dayOfWeek": 5} }, { "question": qsTr("What day of the week is 20 days after 1 June?"), "answer": {"dayOfWeek": 5} }, { "question": qsTr("What day of the week is 60 days after 10 April?"), "answer": {"dayOfWeek": 6} }, { "question": qsTr("What day of the week is 10 days after 15 December?"), "answer": {"dayOfWeek": 2} } ] }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 60 } }, { "navigationBarVisible" : true, "minimumDate": "2017-01-01", "maximumDate": "2019-12-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Human Rights Day is celebrated five days after December 5.
Find the date of Human Rights Day in 2017."), "answer": {"year": 2017, "month": 11, "day": 10} }, { "question": qsTr("Braille Day is celebrated one day before January 5.
Find the date of Braille Day in 2018"), "answer": {"year": 2018, "month": 0, "day": 4} }, { "question": qsTr("Mark's birthday is on November 4. In 2017 his party was exactly two weeks later.
Find the date of his party in 2017"), "answer": {"year": 2017, "month": 10, "day": 18} }, { "question": qsTr("International Women's Day is celebrated two days before March 10.
Find the date of International Women's Day in 2018."), "answer": {"year": 2018, "month": 2, "day": 8} }, { "question": qsTr("Sports competition was held on last Friday of September 2017.
Select the date of sports competition on the calendar."), "answer": {"year": 2017, "month": 8, "day": 29} } ] } ] } diff --git a/src/activities/calendar/resource/3/Data.qml b/src/activities/calendar/resource/3/Data.qml index 0ca92a698..0de6f428b 100644 --- a/src/activities/calendar/resource/3/Data.qml +++ b/src/activities/calendar/resource/3/Data.qml @@ -1,151 +1,151 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Calendar Questions involving several months") - difficulty: 2 + difficulty: 6 data: [ { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findMonthOnly", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find the month starting a Thursday and having 28 days"), "answer": {"month": [1]} }, { "question": qsTr("Find a month starting a Monday and having 31 days"), "answer": {"month": [0, 9]} }, { "question": qsTr("Find the month between June and August"), "answer": {"month": [6]} }, { "question": qsTr("Find a month starting a Saturday"), "answer": {"month": [8, 11]} }, { "question": qsTr("Find a month having 30 days"), "answer": {"month": [3, 5, 8, 10]} } ] }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 90 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 120 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find the first Monday of January month of year 2019"), "answer": {"year": 2019, "month": 0, "day": 7} }, { "question": qsTr("Find the second Wednesday of February month of year 2019"), "answer": {"year": 2019, "month": 1, "day": 13} }, { "question": qsTr("Find the third Friday of March month of year 2019"), "answer": {"year": 2019, "month": 2, "day": 15} }, { "question": qsTr("Find the fifth Sunday of April month of year 2018"), "answer": {"year": 2018, "month": 3, "day": 29} }, { "question": qsTr("Find the fourth Tuesday of July month of year 2018"), "answer": {"year": 2018, "month": 6, "day": 24} }, { "question": qsTr("Find the first Monday of August month of year 2018"), "answer": {"year": 2018, "month": 7, "day": 6} }, { "question": qsTr("Find the third Thursday of September month of year 2017"), "answer": {"year": 2017, "month": 8, "day": 21} }, { "question": qsTr("Find the fifth Sunday of October month of year 2017"), "answer": {"year": 2017, "month": 9, "day": 29} }, { "question": qsTr("Find the second Friday of December month of year 2017"), "answer": {"year": 2017, "month": 11, "day": 8} } ] } ] } diff --git a/src/activities/find_the_day/resource/1/Data.qml b/src/activities/find_the_day/resource/1/Data.qml index 57241569b..1da5387e0 100644 --- a/src/activities/find_the_day/resource/1/Data.qml +++ b/src/activities/find_the_day/resource/1/Data.qml @@ -1,129 +1,129 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Find the date less than one month away") - difficulty: 1 + difficulty: 4 data: [ { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-01-31", "visibleMonth": 0, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-03-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 10 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-03-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 20 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 7, "visibleYear": 2018, "mode": "findDayOfWeek", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find day of week 3 days after December 5."), "answer": {"dayOfWeek": 6} }, { "question": qsTr("Find day of week 12 days before November 12."), "answer": {"dayOfWeek": 3} }, { "question": qsTr("Find day of week 32 days after January 5."), "answer": {"dayOfWeek": 2} }, { "question": qsTr("Find day of week 5 days after February 23."), "answer": {"dayOfWeek": 3} }, { "question": qsTr("Find day of week 17 days before August 16."), "answer": {"dayOfWeek": 1} } ] }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-05-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 30 } } ] } diff --git a/src/activities/find_the_day/resource/2/Data.qml b/src/activities/find_the_day/resource/2/Data.qml index d9b13cf6a..5406f7af6 100644 --- a/src/activities/find_the_day/resource/2/Data.qml +++ b/src/activities/find_the_day/resource/2/Data.qml @@ -1,129 +1,129 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Find the date less than two month away") - difficulty: 2 + difficulty: 5 data: [ { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-03-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 30 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 45 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 60 } }, { "navigationBarVisible": true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 7, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find the date 2 weeks and 3 days after January 12."), "answer": {"year": 2018, "month": 0, "day": 29} }, { "question": qsTr("Find the date 3 weeks and 2 days after March 22."), "answer": {"year": 2018, "month": 3, "day": 14} }, { "question": qsTr("Find the date 5 weeks and 6 days after October 5."), "answer": {"year": 2018, "month": 10, "day": 15} }, { "question": qsTr("Find the date 1 week and 1 day before August 8."), "answer": {"year": 2018, "month": 6, "day": 31} }, { "question": qsTr("Find the date 2 weeks and 5 days before July 2."), "answer": {"year": 2018, "month": 5, "day": 13} } ] } ] } diff --git a/src/activities/find_the_day/resource/3/Data.qml b/src/activities/find_the_day/resource/3/Data.qml index 5696bed71..56d26c5f9 100644 --- a/src/activities/find_the_day/resource/3/Data.qml +++ b/src/activities/find_the_day/resource/3/Data.qml @@ -1,147 +1,147 @@ /* GCompris - Data.qml * * Copyright (C) 2019 Akshay Kumar * * Authors: * Akshay Kumar * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ import QtQuick 2.6 import GCompris 1.0 import "../../../../core" /* Contains the questions, answers and calendar configurations of every level. Add more levels by inserting questions and answers below. Days of weeks are indexed from 0 i.e (Sunday = 0, Monday = 1, Tuesday = 2, .... ..... .... , Saturday = 6) Months of year are indexed from 0 i.e (January = 0, February = 1, March = 2, .... ..... ...., December = 11) If questions are provided explicitly field questionAnswers contains an array of questions and answers and if they are not provided, then questionAnswers field contains parameter length signifying the number of questions, and optional parameter maxOffset for questions where the user has to find date some days ahead of the given date. [ //MODES // findMonthOnly --> For questions based on finding month only. // findYearMonthDay --> For questions based on finding year, month and day. // findDayOfWeek --> For questions based on finding day of week only. // findDay --> For questions based on finding day of a given month and year. ] */ Dataset { objective: qsTr("Find the date several months away") - difficulty: 3 + difficulty: 6 data: [ { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 0, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 60 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2019-12-31", "visibleMonth": 10, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": false, "questionAnswers": { "length": 5, "maxOffset": 90 } }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 7, "visibleYear": 2018, "mode": "findDayOfWeek", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find day of week 5 months and 2 days after July 3."), "answer": {"dayOfWeek": 3} }, { "question": qsTr("Find day of week 2 months and 4 days after October 8."), "answer": {"dayOfWeek": 3} }, { "question": qsTr("Find day of week 1 month and 3 days before December 28."), "answer": {"dayOfWeek": 0} }, { "question": qsTr("Find day of week 8 months and 7 days after February 28."), "answer": {"dayOfWeek": 0} }, { "question": qsTr("Find day of week 3 months and 3 days before September 15."), "answer": {"dayOfWeek": 2} } ] }, { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 7, "visibleYear": 2018, "mode": "findYearMonthDay", "questionsExplicitlyGiven": true, "questionAnswers": [ { "question": qsTr("Find the date 2 months, 1 week and 5 days after January 12."), "answer": {"year": 2018, "month": 2, "day": 24} }, { "question": qsTr("Find the date 3 months, 2 weeks and 1 day after August 23."), "answer": {"year": 2018, "month": 11, "day": 8} }, { "question": qsTr("Find the date 5 months, 3 weeks and 2 days after March 20."), "answer": {"year": 2018, "month": 8, "day": 12} }, { "question": qsTr("Find the date 1 month 1 week and 1 day before September 10."), "answer": {"year": 2018, "month": 7, "day": 2} }, { "question": qsTr("Find the date 2 months, 1 week and 8 days before April 7."), "answer": {"year": 2018, "month": 0, "day": 23} } ] } ] }