Merge lp:~ubuntu-clock-dev/ubuntu-clock-app/4-migrate-alarm-listitems into lp:ubuntu-clock-app

Proposed by Nekhelesh Ramananthan
Status: Merged
Approved by: Bartosz Kosiorek
Approved revision: 278
Merged at revision: 311
Proposed branch: lp:~ubuntu-clock-dev/ubuntu-clock-app/4-migrate-alarm-listitems
Merge into: lp:ubuntu-clock-app
Prerequisite: lp:~ubuntu-clock-dev/ubuntu-clock-app/3-migrate-settings-page-listitems
Diff against target: 749 lines (+112/-490)
7 files modified
app/alarm/AlarmDelegate.qml (+4/-4)
app/alarm/AlarmList.qml (+48/-106)
app/alarm/AlarmPage.qml (+52/-77)
app/components/HeaderButton.qml (+0/-65)
app/upstreamcomponents/MultipleSelectionListView.qml (+0/-199)
app/upstreamcomponents/MultipleSelectionVisualModel.qml (+0/-31)
po/com.ubuntu.clock.pot (+8/-8)
To merge this branch: bzr merge lp:~ubuntu-clock-dev/ubuntu-clock-app/4-migrate-alarm-listitems
Reviewer Review Type Date Requested Status
Bartosz Kosiorek Approve
Ubuntu Phone Apps Jenkins Bot continuous-integration Approve
Review via email: mp+263889@code.launchpad.net

Commit message

- Transitions AlarmDelegate, AlarmList to using the new 15.04 ListItems
- Updated multi-select mode design to be similar to what Dekko and Music app have
- Removed custom components like MultipleSelectionListView, MultipleSelectionVisualMode and HeaderButton

Description of the change

This MP implements the following,
- Transitions AlarmDelegate, AlarmList to using the new 15.04 ListItems
- Updated multi-select mode design to be similar to what Dekko and Music app have
- Removed custom components like MultipleSelectionListView, MultipleSelectionVisualMode and HeaderButton

To post a comment you must log in.
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Needs Fixing (continuous-integration)
278. By Nekhelesh Ramananthan

merged prerequisite

Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Approve (continuous-integration)
Revision history for this message
Bartosz Kosiorek (gang65) wrote :

It is working perfectly for me

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'app/alarm/AlarmDelegate.qml'
--- app/alarm/AlarmDelegate.qml 2015-06-18 13:36:42 +0000
+++ app/alarm/AlarmDelegate.qml 2015-07-24 13:32:56 +0000
@@ -18,17 +18,15 @@
1818
19import QtQuick 2.419import QtQuick 2.4
20import Ubuntu.Components 1.220import Ubuntu.Components 1.2
21import "../upstreamcomponents"
2221
23ListItemWithActions {22ListItem {
24 id: root23 id: root
2524
26 property var localTime25 property var localTime
2726
28 width: parent ? parent.width : 027 width: parent ? parent.width : 0
29 height: units.gu(6)28 height: units.gu(6)
30 color: "Transparent"29 divider.visible: false
31 selectedColor: "Transparent"
3230
33 Label {31 Label {
34 id: alarmTime32 id: alarmTime
@@ -37,6 +35,7 @@
37 anchors {35 anchors {
38 top: alarmDetailsColumn.top36 top: alarmDetailsColumn.top
39 left: parent.left37 left: parent.left
38 leftMargin: units.gu(2)
40 }39 }
4140
42 fontSize: "medium"41 fontSize: "medium"
@@ -87,6 +86,7 @@
8786
88 anchors {87 anchors {
89 right: parent.right88 right: parent.right
89 rightMargin: units.gu(2)
90 verticalCenter: parent.verticalCenter90 verticalCenter: parent.verticalCenter
91 }91 }
9292
9393
=== modified file 'app/alarm/AlarmList.qml'
--- app/alarm/AlarmList.qml 2015-05-27 16:03:23 +0000
+++ app/alarm/AlarmList.qml 2015-07-24 13:32:56 +0000
@@ -18,127 +18,69 @@
1818
19import QtQuick 2.419import QtQuick 2.4
20import Ubuntu.Components 1.220import Ubuntu.Components 1.2
21import Ubuntu.Components.ListItems 1.0 as ListItem
22import "../components"
23import "../upstreamcomponents"
2421
25MultipleSelectionListView {22UbuntuListView {
26 id: alarmListView23 id: alarmListView
27 objectName: "alarmListView"24 objectName: "alarmListView"
2825
29 property var _currentSwipedItem: null
30 property var localTime26 property var localTime
3127
32 function _updateSwipeState(item)28 signal clearSelection()
33 {29 signal closeSelection()
34 if (item.swipping) {30 signal selectAll()
35 return
36 }
37
38 if (item.swipeState !== "Normal") {
39 if (alarmListView._currentSwipedItem !== item) {
40 if (alarmListView._currentSwipedItem) {
41 alarmListView._currentSwipedItem.resetSwipe()
42 }
43 alarmListView._currentSwipedItem = item
44 }
45 } else if (item.swipeState !== "Normal"
46 && alarmListView._currentSwipedItem === item) {
47 alarmListView._currentSwipedItem = null
48 }
49 }
5031
51 clip: true32 clip: true
52 anchors.fill: parent33 anchors.fill: parent
5334
54 listDelegate: AlarmDelegate {35 delegate: AlarmDelegate {
55 id: alarmDelegate36 id: alarmDelegate
56 objectName: "alarm" + index37 objectName: "alarm" + index
5738
58 property var removalAnimation
59 localTime: alarmListView.localTime39 localTime: alarmListView.localTime
6040
61 function remove() {41 leadingActions: ListItemActions {
62 removalAnimation.start()42 actions: [
63 }43 Action {
6444 iconName: "delete"
65 selectionMode: alarmListView.isInSelectionMode45 text: i18n.tr("Delete")
66 selected: alarmListView.isSelected(alarmDelegate)46 onTriggered: {
6747 var alarm = alarmModel.get(index)
68 onSwippingChanged: {48 alarm.cancel()
69 _updateSwipeState(alarmDelegate)49 }
70 }50 }
7151 ]
72 onSwipeStateChanged: {52 }
73 _updateSwipeState(alarmDelegate)53
74 }54 onClicked: {
7555 if (selectMode) {
76 leftSideAction: Action {56 selected = !selected
77 iconName: "delete"57 } else {
78 text: i18n.tr("Delete")58 pageStack.push(Qt.resolvedUrl("EditAlarmPage.qml"), {isNewAlarm: false, tempAlarm: model})
79 onTriggered: {59 }
80 alarmDelegate.remove()60 }
81 }61
82 }62 onPressAndHold: {
8363 ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode
84 ListView.onRemove: ScriptAction {64 }
85 script: {65 }
86 if (_currentSwipedItem66
87 === alarmDelegate) {67 onClearSelection: {
88 _currentSwipedItem = null68 ViewItems.selectedIndices = []
89 }69 }
90 }70
91 }71 onSelectAll: {
9272 var tmp = []
93 removalAnimation: SequentialAnimation {73
94 alwaysRunToEnd: true74 for (var i=0; i < model.count; i++) {
9575 tmp.push(i)
96 PropertyAction {76 }
97 target: alarmDelegate77
98 property: "ListView.delayRemove"78 ViewItems.selectedIndices = tmp
99 value: true79 }
100 }80
10181 onCloseSelection: {
102 UbuntuNumberAnimation {82 clearSelection()
103 target: alarmDelegate83 ViewItems.selectMode = false
104 property: "height"
105 to: 0
106 }
107
108 PropertyAction {
109 target: alarmDelegate
110 property: "ListView.delayRemove"
111 value: false
112 }
113
114 ScriptAction {
115 script: {
116 var alarm = alarmModel.get(index)
117 alarm.cancel()
118 }
119 }
120 }
121
122 onItemClicked: {
123 if(alarmListView.isInSelectionMode) {
124 if(!alarmListView.selectItem(alarmDelegate)) {
125 alarmListView.deselectItem(alarmDelegate)
126 }
127 return
128 }
129
130 else {
131 pageStack.push(Qt.resolvedUrl("EditAlarmPage.qml"),
132 {isNewAlarm: false, tempAlarm: model})
133 }
134 }
135
136 onItemPressAndHold: {
137 if (!alarmListView.isInSelectionMode) {
138 alarmListView.startSelection()
139 alarmListView.selectItem(alarmDelegate)
140 }
141 }
142 }84 }
143}85}
14486
14587
=== modified file 'app/alarm/AlarmPage.qml'
--- app/alarm/AlarmPage.qml 2015-07-16 21:02:18 +0000
+++ app/alarm/AlarmPage.qml 2015-07-24 13:32:56 +0000
@@ -18,23 +18,21 @@
1818
19import QtQuick 2.419import QtQuick 2.4
20import Ubuntu.Components 1.220import Ubuntu.Components 1.2
21import "../components"
2221
23Page {22Page {
24 id: alarmPage23 id: alarmPage
2524
26 title: i18n.tr("Alarms")25 title: i18n.tr("Alarms")
27 objectName: 'AlarmPage'26 objectName: 'AlarmPage'
27 flickable: null
2828
29 Component.onCompleted: console.log("[LOG]: Alarm Page loaded")29 Component.onCompleted: console.log("[LOG]: Alarm Page loaded")
3030
31 flickable: null
32
33 states: [31 states: [
34 PageHeadState {32 PageHeadState {
35 name: "default"33 name: "default"
36 head: alarmPage.head34 head: alarmPage.head
37 when: !alarmListView.isInSelectionMode35 when: !alarmListView.ViewItems.selectMode
3836
39 backAction: Action {37 backAction: Action {
40 iconName: "down"38 iconName: "down"
@@ -59,89 +57,66 @@
59 PageHeadState {57 PageHeadState {
60 name: "selection"58 name: "selection"
61 head: alarmPage.head59 head: alarmPage.head
62 when: alarmListView.isInSelectionMode60 when: alarmListView.ViewItems.selectMode
6361
64 backAction: Action {62 backAction: Action {
65 iconName: "back"63 iconName: "back"
66 text: i18n.tr("Back")64 text: i18n.tr("Back")
67 onTriggered: {65 onTriggered: {
68 alarmListView.cancelSelection()66 alarmListView.ViewItems.selectMode = false
69 }67 }
70 }68 }
7169
72 contents: Loader {70 actions: [
73 id: selectionStateLoader71 Action {
74 active: alarmPage.state === "selection"72 text: {
75 sourceComponent: selectionStateComponent73 if(alarmListView.ViewItems.selectedIndices.length === alarmListView.count) {
76 height: parent ? parent.height : undefined74 return i18n.tr("Select None")
77 anchors.right: parent ? parent.right: undefined75 } else {
78 }76 return i18n.tr("Select All")
77 }
78 }
79
80 iconSource: {
81 if(alarmListView.ViewItems.selectedIndices.length === alarmListView.count) {
82 return Qt.resolvedUrl("../graphics/select-none.svg")
83 } else {
84 return Qt.resolvedUrl("../graphics/select.svg")
85 }
86 }
87
88 onTriggered: {
89 if(alarmListView.ViewItems.selectedIndices.length === alarmListView.count) {
90 alarmListView.clearSelection()
91 } else {
92 alarmListView.selectAll()
93 }
94 }
95 },
96
97 Action {
98 iconName: "delete"
99 text: i18n.tr("Delete")
100 enabled: alarmListView.ViewItems.selectedIndices.length !== 0
101
102 onTriggered: {
103 var items = alarmListView.ViewItems.selectedIndices
104
105 for(var i=0; i < alarmListView.ViewItems.selectedIndices.length; i++) {
106 var alarm = alarmModel.get(alarmListView.ViewItems.selectedIndices[i])
107 alarm.cancel()
108 }
109
110 alarmListView.closeSelection()
111 }
112 }
113 ]
79 }114 }
80 ]115 ]
81116
82 Component {
83 id: selectionStateComponent
84 Item {
85 HeaderButton {
86 id: selectButton
87
88 anchors {
89 right: deleteButton.left
90 rightMargin: units.gu(1)
91 }
92
93 text: {
94 if(alarmListView.selectedItems.count === alarmListView.count) {
95 return i18n.tr("Select None")
96 } else {
97 return i18n.tr("Select All")
98 }
99 }
100
101 iconSource: {
102 if(alarmListView.selectedItems.count === alarmListView.count) {
103 return Qt.resolvedUrl("../graphics/select-none.svg")
104 } else {
105 return Qt.resolvedUrl("../graphics/select.svg")
106 }
107 }
108
109 onTriggered: {
110 if(alarmListView.selectedItems.count === alarmListView.count) {
111 alarmListView.clearSelection()
112 } else {
113 alarmListView.selectAll()
114 }
115 }
116 }
117
118 HeaderButton {
119 id: deleteButton
120
121 anchors.right: parent.right
122 anchors.rightMargin: units.gu(2)
123
124 iconName: "delete"
125 text: i18n.tr("Delete")
126 enabled: alarmListView.selectedItems.count !== 0
127
128 onTriggered: {
129 var items = alarmListView.selectedItems
130
131 for(var i=0; i < items.count; i++) {
132 var alarm = alarmModel.get(items.get(i).itemsIndex)
133 alarm.cancel()
134 }
135
136 alarmListView.endSelection()
137 }
138 }
139 }
140 }
141
142 AlarmList {117 AlarmList {
143 id: alarmListView118 id: alarmListView
144 listModel: alarmModel119 model: alarmModel
145 anchors.fill: parent120 anchors.fill: parent
146 localTime: clockTime121 localTime: clockTime
147 }122 }
148123
=== removed file 'app/components/HeaderButton.qml'
--- app/components/HeaderButton.qml 2015-05-27 16:03:23 +0000
+++ app/components/HeaderButton.qml 1970-01-01 00:00:00 +0000
@@ -1,65 +0,0 @@
1/*
2 * Copyright (C) 2014 Canonical Ltd
3 *
4 * This file is part of Ubuntu Clock App
5 *
6 * Ubuntu Clock App is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 3 as
8 * published by the Free Software Foundation.
9 *
10 * Ubuntu Clock App is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19import QtQuick 2.4
20import Ubuntu.Components 1.2
21
22AbstractButton {
23 id: headerButton
24
25 property alias iconSource: _icon.source
26 property alias iconName: _icon.name
27 property alias text: _label.text
28
29 width: units.gu(6)
30 height: parent ? parent.height : undefined
31
32 Rectangle {
33 anchors.fill: parent
34 visible: headerButton.pressed
35 color: Theme.palette.selected.background
36 }
37
38 Column {
39 id: buttonHolder
40
41 width: _label.width
42 height: childrenRect.height
43
44 spacing: units.gu(0.2)
45 anchors.centerIn: parent
46 anchors.verticalCenterOffset: units.gu(0.3)
47
48 Icon {
49 id: _icon
50 color: UbuntuColors.darkGrey
51 width: units.gu(2.5)
52 height: width
53 opacity: headerButton.enabled ? 1.0 : 0.3
54 anchors.horizontalCenter: parent.horizontalCenter
55 }
56
57 Label {
58 id: _label
59 color: UbuntuColors.darkGrey
60 fontSize: "xx-small"
61 opacity: headerButton.enabled ? 1.0 : 0.3
62 anchors.horizontalCenter: _icon.horizontalCenter
63 }
64 }
65}
660
=== removed file 'app/upstreamcomponents/MultipleSelectionListView.qml'
--- app/upstreamcomponents/MultipleSelectionListView.qml 2015-05-27 16:03:23 +0000
+++ app/upstreamcomponents/MultipleSelectionListView.qml 1970-01-01 00:00:00 +0000
@@ -1,199 +0,0 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17import QtQuick 2.4
18import Ubuntu.Components 1.2
19import Ubuntu.Components.Popups 1.0 as Popups
20
21/*!
22 \qmltype ContactSimpleListView
23 \inqmlmodule Ubuntu.Contacts 0.1
24 \ingroup ubuntu
25 \brief The MultipleSelectionListView provides a ListView with support to multiple selection
26
27 The MultipleSelectionListViewprovides a ListView with support to multiple selection which can be used by any
28 application.
29
30 Example:
31 \qml
32 import Ubuntu.Contacts 0.1
33
34 MultipleSelectionListView {
35 id: view
36 anchors.fill: paret
37 model: 100
38 delegate: Rectangle {
39 width: parent.width
40 height: 100
41 color: view.selectedItems.indexOf(index) == -1 ? "white" : "blue"
42
43 MouseArea {
44 anchors.fill: parent
45 onClicked: {
46 if (view.isInSelectionModel) {
47 view.selectItem(index)
48 }
49 }
50 onPressAndHold: view.startSelection()
51 }
52 }
53 onSelectionDone: console.debug("Selected items:" + view.selectedItems)
54 }
55 \endqml
56*/
57
58ListView {
59 id: listView
60
61 /*!
62 \qmlproperty model selectedItems
63
64 This property holds the list of selected items
65 */
66 readonly property alias selectedItems: visualModel.selectedItems
67 /*!
68 \qmlproperty bool multipleSelection
69
70 This property holds if the selection will accept multiple items or single items
71 */
72 property bool multipleSelection: true
73
74 /*!
75 \qmlproperty model listModel
76
77 This property holds the model providing data for the list.
78 */
79 property alias listModel: visualModel.model
80 /*!
81 \qmlproperty Component listDelegate
82
83 The delegate provides a template defining each item instantiated by the view.
84 */
85 property alias listDelegate: visualModel.delegate
86
87 /*!
88 \qmlproperty bool isInSelectionMode
89
90 This property holds a list with the index of selected items
91 */
92 readonly property bool isInSelectionMode: state === "selection"
93 /*!
94 This handler is called when the selection mode is finished without be canceled
95 */
96 signal selectionDone(var items)
97 /*!
98 This handler is called when the selection mode is canceled
99 */
100 signal selectionCanceled()
101
102 /*!
103 Start the selection mode on the list view.
104 */
105 function startSelection()
106 {
107 state = "selection"
108 }
109 /*!
110 Check if the item is selected
111 Returns true if the item was marked as selected or false if the item is unselected
112 */
113 function isSelected(item)
114 {
115 if (item && item.VisualDataModel) {
116 return (item.VisualDataModel.inSelected === true)
117 } else {
118 return false
119 }
120 }
121 /*!
122 Mark the item as selected
123 Returns true if the item was marked as selected or false if the item is already selected
124 */
125 function selectItem(item)
126 {
127 if (item.VisualDataModel.inSelected) {
128 return false
129 } else {
130 if (!multipleSelection) {
131 clearSelection()
132 }
133 item.VisualDataModel.inSelected = true
134 return true
135 }
136 }
137 /*!
138 Remove the index from the selected list
139 */
140 function deselectItem(item)
141 {
142 var result = false
143 if (item.VisualDataModel.inSelected) {
144 item.VisualDataModel.inSelected = false
145 result = true
146 }
147 return result
148 }
149 /*!
150 Finish the selection mode with sucess
151 */
152 function endSelection()
153 {
154 selectionDone(listView.selectedItems)
155 clearSelection()
156 state = ""
157 }
158 /*!
159 Cancel the selection
160 */
161 function cancelSelection()
162 {
163 selectionCanceled()
164 clearSelection()
165 state = ""
166 }
167 /*!
168 Remove any selected item from the selection list
169 */
170 function clearSelection()
171 {
172 if (selectedItems.count > 0) {
173 selectedItems.remove(0, selectedItems.count)
174 }
175 }
176 /*!
177 Select all items in the list
178 */
179 function selectAll()
180 {
181 if (multipleSelection) {
182 visualModel.items.addGroups(0, visualModel.items.count, ["selected"] )
183 }
184 }
185
186 model: visualModel
187
188 MultipleSelectionVisualModel {
189 id: visualModel
190 }
191
192 Component.onCompleted: {
193 // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
194 // for Flickable.maximumFlickVelocity and Flickable.flickDeceleration
195 var scaleFactor = units.gridUnit / 8;
196 maximumFlickVelocity = maximumFlickVelocity * scaleFactor;
197 flickDeceleration = flickDeceleration * scaleFactor;
198 }
199}
2000
=== removed file 'app/upstreamcomponents/MultipleSelectionVisualModel.qml'
--- app/upstreamcomponents/MultipleSelectionVisualModel.qml 2015-05-27 16:03:23 +0000
+++ app/upstreamcomponents/MultipleSelectionVisualModel.qml 1970-01-01 00:00:00 +0000
@@ -1,31 +0,0 @@
1/*
2 * Copyright (C) 2012-2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17import QtQuick 2.4
18
19VisualDataModel {
20 id: contactVisualModel
21
22 property alias selectedItems: selectedGroup
23
24 groups: [
25 VisualDataGroup {
26 id: selectedGroup
27
28 name: "selected"
29 }
30 ]
31}
320
=== modified file 'po/com.ubuntu.clock.pot'
--- po/com.ubuntu.clock.pot 2015-07-24 13:32:56 +0000
+++ po/com.ubuntu.clock.pot 2015-07-24 13:32:56 +0000
@@ -23,38 +23,38 @@
23msgid "Label"23msgid "Label"
24msgstr ""24msgstr ""
2525
26#: ../app/alarm/AlarmList.qml:78 ../app/alarm/AlarmPage.qml:12526#: ../app/alarm/AlarmList.qml:45 ../app/alarm/AlarmPage.qml:99
27#: ../app/worldclock/UserWorldCityList.qml:10127#: ../app/worldclock/UserWorldCityList.qml:101
28msgid "Delete"28msgid "Delete"
29msgstr ""29msgstr ""
3030
31#: ../app/alarm/AlarmPage.qml:2631#: ../app/alarm/AlarmPage.qml:25
32msgid "Alarms"32msgid "Alarms"
33msgstr ""33msgstr ""
3434
35#: ../app/alarm/AlarmPage.qml:41 ../app/alarm/AlarmPage.qml:6635#: ../app/alarm/AlarmPage.qml:39 ../app/alarm/AlarmPage.qml:64
36#: ../app/worldclock/WorldCityList.qml:7936#: ../app/worldclock/WorldCityList.qml:79
37msgid "Back"37msgid "Back"
38msgstr ""38msgstr ""
3939
40#: ../app/alarm/AlarmPage.qml:51 ../app/alarm/EditAlarmPage.qml:4440#: ../app/alarm/AlarmPage.qml:49 ../app/alarm/EditAlarmPage.qml:44
41#: ../app/alarm/EditAlarmPage.qml:16641#: ../app/alarm/EditAlarmPage.qml:166
42msgid "Alarm"42msgid "Alarm"
43msgstr ""43msgstr ""
4444
45#: ../app/alarm/AlarmPage.qml:9545#: ../app/alarm/AlarmPage.qml:74
46msgid "Select None"46msgid "Select None"
47msgstr ""47msgstr ""
4848
49#: ../app/alarm/AlarmPage.qml:97 ../app/alarm/AlarmRepeat.qml:3849#: ../app/alarm/AlarmPage.qml:76 ../app/alarm/AlarmRepeat.qml:38
50msgid "Select All"50msgid "Select All"
51msgstr ""51msgstr ""
5252
53#: ../app/alarm/AlarmPage.qml:16253#: ../app/alarm/AlarmPage.qml:137
54msgid "No saved alarms"54msgid "No saved alarms"
55msgstr ""55msgstr ""
5656
57#: ../app/alarm/AlarmPage.qml:16357#: ../app/alarm/AlarmPage.qml:138
58msgid "Tap the + icon to add an alarm"58msgid "Tap the + icon to add an alarm"
59msgstr ""59msgstr ""
6060

Subscribers

People subscribed via source and target branches

to all changes: