diff --git a/src/activities/calendar/Calendar.qml b/src/activities/calendar/Calendar.qml index 306927dd6..1d7b7497c 100644 --- a/src/activities/calendar/Calendar.qml +++ b/src/activities/calendar/Calendar.qml @@ -1,422 +1,422 @@ /* 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 ActivityBase { id: activity property var dataset: Dataset onStart: focus = true onStop: {} 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: { 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 alias score: score property alias answerChoices: answerChoices property alias questionDelay: questionDelay property alias okButtonParticles: okButtonParticles property bool horizontalLayout: background.width > background.height * 1.5 } onStart: { Activity.start(items, dataset) } 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 ? parent.width * 0.45 : (answerChoices.visible ? parent.width * 0.50 : parent.width * 0.70) height: items.horizontalLayout ? parent.height * 0.70 : (answerChoices.visible ? parent.width * 0.50: parent.height * 0.40) anchors.top: parent.top anchors.topMargin: 100 anchors.bottom: bar.top anchors.bottomMargin: 50 anchors.horizontalCenter: parent.horizontalCenter color: "black" opacity: 0.3 } Calendar { id: calendar weekNumbersVisible: false width: calendarBox.width * 0.85 height: calendarBox.height * 0.85 anchors.centerIn: calendarBox frameVisible: true focus: !answerChoices.visible __locale: Qt.locale(ApplicationSettings.locale) style: CalendarStyle { navigationBar: Rectangle { height: Math.round(TextSingleton.implicitHeight * 2.73) color: "lightBlue" Rectangle { color: Qt.rgba(1, 1, 1, 0.6) height: 1 width: parent.width } Rectangle { anchors.bottom: parent.bottom height: 1 width: parent.width color: "#ddd" } BarButton { id: previousMonth height: parent.height width: height * 0.75 anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left source: "qrc:/gcompris/src/core/resource/bar_previous.svg" visible: ((calendar.visibleYear + calendar.visibleMonth) > Activity.minRange) ? true : false - onClicked: control.showPreviousMonth() + onClicked: control.__selectPreviousMonth() } GCText { id: dateText text: styleData.title 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: parent.height width: height * 0.75 anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right source: "qrc:/gcompris/src/core/resource/bar_next.svg" visible: ((calendar.visibleYear + calendar.visibleMonth) < Activity.maxRange) ? true : false - onClicked: control.showNextMonth() + onClicked: control.__selectNextMonth() } } 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 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) { Activity.checkAnswer() event.accepted = true } if(event.key === Qt.Key_Enter) { Activity.checkAnswer() event.accepted = true } if(event.key === Qt.Key_Return) { 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; } } // Creates a table consisting of days of weeks. GridView { id: answerChoices model: [qsTr("Sunday"), qsTr("Monday"), qsTr("Tuesday"), qsTr("Wednesday"), qsTr("Thursday"), qsTr("Friday"), qsTr("Saturday")] anchors.top: calendarBox.top anchors.left: questionItem.left anchors.right: calendarBox.left interactive: false property bool keyNavigation: false width: calendar.width * 0.5 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: calendar.width * 0.5 height: calendar.height / 6.5 choices.text: modelData 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) { keyNavigation = true Activity.dayOfWeekSelected = currentIndex answerChoices.currentItem.select() } if(event.key === Qt.Key_Space) { keyNavigation = true Activity.dayOfWeekSelected = currentIndex answerChoices.currentItem.select() } if(event.key === Qt.Key_Return) { keyNavigation = true Activity.dayOfWeekSelected = currentIndex answerChoices.currentItem.select() } } highlight: Rectangle { width: calendar.width * 0.5 height: calendar.height / 6.5 color: "black" opacity: 0.8 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 color: "black" border.width: 2 radius: 10 opacity: 0.85 z: 10 anchors { horizontalCenter: parent.horizontalCenter bottomMargin: 10 } width: items.horizontalLayout ? calendarBox.width * 2 : parent.width - 20 height: calendarBox.height * 0.125 gradient: Gradient { GradientStop { position: 0.0; color: "#000" } GradientStop { position: 0.9; color: "#666" } GradientStop { position: 1.0; color: "#AAA" } } } // Displays the question. GCText { id: questionItem anchors.fill: questionItemBackground anchors.bottom: questionItemBackground.bottom fontSizeMode: Text.Fit wrapMode: Text.Wrap z: 10 color: "white" verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } // Answer Submission button. BarButton { id: okButton source: "qrc:/gcompris/src/core/resource/bar_ok.svg" width: 50 * ApplicationInfo.ratio height: width sourceSize.width: width sourceSize.height: height y: parent.height * 0.8 z: 10 anchors { horizontalCenter: score.horizontalCenter bottom: calendarBox.bottom } ParticleSystemStarLoader { id: okButtonParticles clip: false } MouseArea { id: okButtonMouseArea anchors.fill: parent onClicked: { Activity.checkAnswer() } } } DialogHelp { id: dialogHelp onClose: home() } Bar { id: bar content: BarEnumContent { value: help | home | level } onHelpClicked: { displayDialog(dialogHelp) } onPreviousLevelClicked: Activity.previousLevel() onNextLevelClicked: Activity.nextLevel() onHomeClicked: activity.home() } Bonus { id: bonus Component.onCompleted: win.connect(Activity.nextLevel) } Score { id: score fontSize: items.horizontalLayout ? internalTextComponent.mediumSize : (answerChoices.visible ? internalTextComponent.smallSize : internalTextComponent.tinySize) anchors.top: questionItemBackground.bottom anchors.bottom: undefined anchors.left: calendarBox.right anchors.right: undefined anchors.margins: items.horizontalLayout ? 30 : 10 } } } diff --git a/src/activities/calendar/calendar_dataset.js b/src/activities/calendar/calendar_dataset.js index e7c164178..06c674b29 100644 --- a/src/activities/calendar/calendar_dataset.js +++ b/src/activities/calendar/calendar_dataset.js @@ -1,317 +1,317 @@ /* GCompris - calendar_dataset.js * * Copyright (C) 2017 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 . */ // 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) //[ //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. // ] function get() { return [ [ // Level 1 [ // Level 1 Configurations { "navigationBarVisible" : false, - "minimumDate": "2017-01-01", - "maximumDate": "2019-12-31", + "minimumDate": "2018-03-01", + "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay" } ], [ // Level 1 Questions { "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} } ] ], [ // Level 2 [ // Level 2 Configurations { "navigationBarVisible" : false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDayOfWeek" } ], [ // Level 2 Questions { "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} } ] ], [ // Level 3 [ // Level 3 configurations { "navigationBarVisible": false, "minimumDate": "2018-03-01", "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay" } ], [ // Level 3 Questions { "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} } ] ], [ // level 4 [ // Level 4 Configurations { "navigationBarVisible" : false, - "minimumDate": "2017-01-01", - "maximumDate": "2019-12-31", + "minimumDate": "2018-03-01", + "maximumDate": "2018-03-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findDay" } ], [ // Level 4 Questions { "question": qsTr("Select second day before the 15th of given month"), "answer": {"year": 2018, "month": 2, "day": 13} }, { "question": qsTr("Select fourth Sunday of given month"), "answer": {"year": 2018, "month": 2, "day": 25} }, { "question": qsTr("Select day one week after 13th of given month"), "answer": {"year": 2018, "month": 2, "day": 20} }, { "question": qsTr("Select fifth Thursday of given month"), "answer": {"year": 2018, "month": 2, "day": 29} }, { "question": qsTr("Select fourth day after 27th of given month"), "answer": {"year": 2018, "month": 2, "day": 31} } ] ], [ // Level 5 [ // Level 5 Configurations { "navigationBarVisible" : true, "minimumDate": "2018-01-01", "maximumDate": "2018-12-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findMonthOnly" } ], [ // Level 5 Questions { "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]} } ] ], [ // level 6 [ // Level 6 Configurations { "navigationBarVisible" : true, "minimumDate": "2017-01-01", "maximumDate": "2019-12-31", "visibleMonth": 2, "visibleYear": 2018, "mode": "findYearMonthDay" } ], [ // Level 6 Questions { "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} } ] ], [ // Level 7 [ // Level 7 Configurations { "navigationBarVisible" : true, "minimumDate": "2017-01-01", "maximumDate": "2019-12-31", "visibleMonth": 1, "visibleYear": 2018, "mode": "findYearMonthDay" } ], [ // Level 7 Questions { "question": qsTr("Columbus Day is celebrated on the second monday of October. Find the date of Columbus Day in 2018"), "answer": {"year": 2018, "month": 9, "day": 8} }, { "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 March 4. His party is exactly two weeks later. Find the date of his party in 2018"), "answer": {"year": 2018, "month": 2, "day": 18} }, { "question": qsTr("Mother's Day falls on the second Sunday in May. Find the date of Mother's Day in 2018"), "answer": {"year": 2018, "month": 4, "day": 13} }, { "question": qsTr("Sports competition will be held on last Friday of September 2018. Select the date of sports competition on the calendar"), "answer": {"year": 2018, "month": 8, "day": 28} } ] ] ] }