CalendarView.qml 24.4 KB
Newer Older
1
/*
2
3
4
5
6
7
    SPDX-FileCopyrightText: 2013 Sebastian Kügler <sebas@kde.org>
    SPDX-FileCopyrightText: 2015 Martin Klapetek <mklapetek@kde.org>
    SPDX-FileCopyrightText: 2021 Carl Schwan <carlschwan@kde.org>

    SPDX-License-Identifier: GPL-2.0-or-later
*/
8
import QtQuick 2.4
9
import QtQuick.Layouts 1.1
Konrad Materka's avatar
Konrad Materka committed
10
import QtQml 2.15
11
12

import org.kde.kquickcontrolsaddons 2.0 // For kcmshell
13
14
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.calendar 2.0 as PlasmaCalendar
15
import org.kde.plasma.components 3.0 as PlasmaComponents3
16
import org.kde.plasma.extras 2.0 as PlasmaExtras
Carl Schwan's avatar
Carl Schwan committed
17
import org.kde.plasma.private.digitalclock 1.0
18

Carl Schwan's avatar
Carl Schwan committed
19
20
21
22
// Top-level layout containing:
// - Left column with world clock and agenda view
// - Right column with current date header and calendar
PlasmaExtras.Representation {
23
24
    id: calendar

25
    // The "sensible" values
Carl Schwan's avatar
Carl Schwan committed
26
27
    property int _minimumWidth: (calendar.showAgenda || calendar.showClocks) ? PlasmaCore.Units.gridUnit * 45 : PlasmaCore.Units.gridUnit * 22
    property int _minimumHeight: PlasmaCore.Units.gridUnit * 25
28

29
30
31
    Layout.minimumWidth: _minimumWidth
    Layout.minimumHeight: _minimumHeight
    Layout.preferredWidth: _minimumWidth
32
33
34
    Layout.preferredHeight: _minimumHeight
    Layout.maximumWidth: _minimumWidth
    Layout.maximumHeight: _minimumHeight
35

Carl Schwan's avatar
Carl Schwan committed
36
37
    collapseMarginsHint: true

Nate Graham's avatar
Nate Graham committed
38
    readonly property int paddings: PlasmaCore.Units.smallSpacing
39
    readonly property bool showAgenda: PlasmaCalendar.EventPluginsManager.enabledPlugins.length > 0
40
    readonly property bool showClocks: plasmoid.configuration.selectedTimeZones.length > 1
41

42
43
44
45
46
    property alias borderWidth: monthView.borderWidth
    property alias monthView: monthView

    property bool debug: false

47
48
49
    property bool isExpanded: plasmoid.expanded

    onIsExpandedChanged: {
50
51
        // clear all the selections when the plasmoid is showing/hiding
        monthView.resetToToday();
52
53
    }

54
55
56
    // Header containing date and pin button
    header: PlasmaExtras.PlasmoidHeading {
        id: headerArea
Carl Schwan's avatar
Carl Schwan committed
57
        implicitHeight: calendarHeader.implicitHeight
58

Carl Schwan's avatar
Carl Schwan committed
59
60
61
62
        // Agenda view header
        // -----------------
        ColumnLayout {
            id: eventHeader
63
64

            anchors.left: parent.left
Carl Schwan's avatar
Carl Schwan committed
65
            width: visible ? parent.width / 2 - 1 : 0
66

Carl Schwan's avatar
Carl Schwan committed
67
68
69
70
71
            visible: calendar.showAgenda || calendar.showClocks
            RowLayout {
                PlasmaExtras.Heading {
                    Layout.fillWidth: true
                    Layout.leftMargin: calendar.paddings // Match calendar title
72

Carl Schwan's avatar
Carl Schwan committed
73
74
75
                    text: monthView.currentDate.toLocaleDateString(Qt.locale(), Locale.LongFormat)
                }
            }
Carl Schwan's avatar
Carl Schwan committed
76
77
78
79
            RowLayout {
                // Heading text
                PlasmaExtras.Heading {
                    visible: agenda.visible
Carl Schwan's avatar
Carl Schwan committed
80

Carl Schwan's avatar
Carl Schwan committed
81
82
                    Layout.fillWidth: true
                    Layout.leftMargin: calendar.paddings
83

Carl Schwan's avatar
Carl Schwan committed
84
                    level: 2
85

Carl Schwan's avatar
Carl Schwan committed
86
87
88
89
90
91
                    text: i18n("Events")
                    maximumLineCount: 1
                    elide: Text.ElideRight
                }
                PlasmaComponents3.ToolButton {
                    visible: agenda.visible && ApplicationIntegration.korganizerInstalled
92
                    text: i18nc("@action:button Add event", "Add…")
Carl Schwan's avatar
Carl Schwan committed
93
94
95
96
                    Layout.rightMargin: calendar.paddings
                    icon.name: "list-add"
                    onClicked: ApplicationIntegration.launchKorganizer()
                }
Carl Schwan's avatar
Carl Schwan committed
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
            }
        }

        // Vertical separator line between columns
        // =======================================
        PlasmaCore.SvgItem {
            id: headerSeparator
            anchors.left: eventHeader.right
            anchors.bottomMargin: PlasmaCore.Units.smallSpacing * 2
            width: visible ? 1 : 0
            height: calendarHeader.height - PlasmaCore.Units.smallSpacing * 2
            visible: eventHeader.visible

            elementId: "vertical-line"
            svg: PlasmaCore.Svg {
                imagePath: "widgets/line"
            }
        }

        GridLayout {
            id: calendarHeader
            width: calendar.showAgenda || calendar.showClocks ? parent.width / 2 : parent.width
            anchors.left: headerSeparator.right
            columns: 6
            rows: 2

            PlasmaExtras.Heading {
                Layout.row: 0
                Layout.column: 0
                Layout.columnSpan: 3
                Layout.fillWidth: true
                Layout.leftMargin: calendar.paddings + PlasmaCore.Units.smallSpacing
                text: monthView.selectedYear === (new Date()).getFullYear() ? monthView.selectedMonth : i18nc("Format: month year", "%1 %2", monthView.selectedMonth, monthView.selectedYear.toString())
130
            }
131
132

            PlasmaComponents3.ToolButton {
Carl Schwan's avatar
Carl Schwan committed
133
134
135
                Layout.row: 0
                Layout.column: 4
                Layout.alignment: Qt.AlignRight
136
137
138
139
140
141
142
143
                visible: plasmoid.action("configure").enabled
                icon.name: "configure"
                onClicked: plasmoid.action("configure").trigger()
                PlasmaComponents3.ToolTip {
                    text: plasmoid.action("configure").text
                }
            }

144
145
            // Allows the user to keep the calendar open for reference
            PlasmaComponents3.ToolButton {
Carl Schwan's avatar
Carl Schwan committed
146
147
                Layout.row: 0
                Layout.column: 5
148
149
150
151
152
153
154
155
                checkable: true
                checked: plasmoid.configuration.pin
                onToggled: plasmoid.configuration.pin = checked
                icon.name: "window-pin"
                PlasmaComponents3.ToolTip {
                    text: i18n("Keep Open")
                }
            }
Carl Schwan's avatar
Carl Schwan committed
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244

            PlasmaComponents3.TabBar {
                id: tabbar
                currentIndex: monthView.currentIndex
                Layout.row: 1
                Layout.column: 0
                Layout.columnSpan: 3
                Layout.topMargin: PlasmaCore.Units.smallSpacing
                Layout.fillWidth: true
                Layout.leftMargin: PlasmaCore.Units.smallSpacing

                PlasmaComponents3.TabButton {
                    text: i18n("Days");
                    onClicked: monthView.showMonthView();
                    display: PlasmaComponents3.AbstractButton.TextOnly
                }
                PlasmaComponents3.TabButton {
                    text: i18n("Months");
                    onClicked: monthView.showYearView();
                    display: PlasmaComponents3.AbstractButton.TextOnly
                }
                PlasmaComponents3.TabButton {
                    text: i18n("Years");
                    onClicked: monthView.showDecadeView();
                    display: PlasmaComponents3.AbstractButton.TextOnly
                }
            }

            PlasmaComponents3.ToolButton {
                id: previousButton
                property string tooltip
                Layout.row: 1
                Layout.column: 3

                Layout.leftMargin: PlasmaCore.Units.smallSpacing
                Layout.bottomMargin: PlasmaCore.Units.smallSpacing
                icon.name: Qt.application.layoutDirection === Qt.RightToLeft ? "go-next" : "go-previous"
                onClicked: monthView.previousView()
                Accessible.name: tooltip
                PlasmaComponents3.ToolTip {
                    text: {
                        switch(monthView.calendarViewDisplayed) {
                            case PlasmaCalendar.MonthView.CalendarView.DayView:
                                return i18n("Previous month")
                            case PlasmaCalendar.MonthView.CalendarView.MonthView:
                                return i18n("Previous year")
                            case PlasmaCalendar.MonthView.CalendarView.YearView:
                                return i18n("Previous decade")
                            default:
                                return "";
                        }
                    }
                }
            }

            PlasmaComponents3.ToolButton {
                Layout.bottomMargin: PlasmaCore.Units.smallSpacing
                Layout.row: 1
                Layout.column: 4
                onClicked: monthView.resetToToday()
                text: i18ndc("libplasma5", "Reset calendar to today", "Today")
                Accessible.description: i18nd("libplasma5", "Reset calendar to today")
            }

            PlasmaComponents3.ToolButton {
                id: nextButton
                property string tooltip
                Layout.bottomMargin: PlasmaCore.Units.smallSpacing
                Layout.row: 1
                Layout.column: 5

                icon.name: Qt.application.layoutDirection === Qt.RightToLeft ? "go-previous" : "go-next"
                onClicked: monthView.nextView()
                Accessible.name: tooltip
                PlasmaComponents3.ToolTip {
                    text: {
                        switch(monthView.calendarViewDisplayed) {
                            case PlasmaCalendar.MonthView.CalendarView.DayView:
                                return i18n("Next month")
                            case PlasmaCalendar.MonthView.CalendarView.MonthView:
                                return i18n("Next year")
                            case PlasmaCalendar.MonthView.CalendarView.YearView:
                                return i18n("Next decade")
                            default:
                                return "";
                        }
                    }
                }
            }
245
246
        }
    }
247

Carl Schwan's avatar
Carl Schwan committed
248
249
250
251
252
253
254
    // Left column containing agenda view and time zones
    // ==================================================
    ColumnLayout {
        id: leftColumn

        visible: calendar.showAgenda || calendar.showClocks
        width: parent.width / 2 - 1
255
256
        anchors {
            left: parent.left
Carl Schwan's avatar
Carl Schwan committed
257
258
            top: parent.top
            bottom: parent.bottom
259
260
        }

261

Carl Schwan's avatar
Carl Schwan committed
262
        // Agenda view itself
263
        Item {
Carl Schwan's avatar
Carl Schwan committed
264
265
266
            id: agenda
            visible: calendar.showAgenda

267
            Layout.fillWidth: true
Carl Schwan's avatar
Carl Schwan committed
268
269
270
271
272
273
274
275
276
277
278
279
            Layout.fillHeight: true
            Layout.minimumHeight: PlasmaCore.Units.gridUnit * 4

            function formatDateWithoutYear(date) {
                // Unfortunatelly Qt overrides ECMA's Date.toLocaleDateString(),
                // which is able to return locale-specific date-and-month-only date
                // formats, with its dumb version that only supports Qt::DateFormat
                // enum subset. So to get a day-and-month-only date format string we
                // must resort to this magic and hope there are no locales that use
                // other separators...
                var format = Qt.locale().dateFormat(Locale.ShortFormat).replace(/[./ ]*Y{2,4}[./ ]*/i, '');
                return Qt.formatDate(date, format);
280
            }
281

Carl Schwan's avatar
Carl Schwan committed
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
            function dateEquals(date1, date2) {
                const values1 = [
                    date1.getFullYear(),
                    date1.getMonth(),
                    date1.getDate()
                ];

                const values2 = [
                    date2.getFullYear(),
                    date2.getMonth(),
                    date2.getDate()
                ];

                return values1.every((value, index) => {
                    return (value === values2[index]);
                }, false)
            }
299

Carl Schwan's avatar
Carl Schwan committed
300
301
302
303
304
305
306
307
308
309
310
311
312
            Connections {
                target: monthView

                function onCurrentDateChanged() {
                    // Apparently this is needed because this is a simple QList being
                    // returned and if the list for the current day has 1 event and the
                    // user clicks some other date which also has 1 event, QML sees the
                    // sizes match and does not update the labels with the content.
                    // Resetting the model to null first clears it and then correct data
                    // are displayed.
                    holidaysList.model = null;
                    holidaysList.model = monthView.daysModel.eventsForDate(monthView.currentDate);
                }
313
314
            }

Carl Schwan's avatar
Carl Schwan committed
315
316
            Connections {
                target: monthView.daysModel
317

Carl Schwan's avatar
Carl Schwan committed
318
319
320
321
322
323
324
                function onAgendaUpdated(updatedDate) {
                    if (agenda.dateEquals(updatedDate, monthView.currentDate)) {
                        holidaysList.model = null;
                        holidaysList.model = monthView.daysModel.eventsForDate(monthView.currentDate);
                    }
                }
            }
325

Carl Schwan's avatar
Carl Schwan committed
326
327
            Connections {
                target: plasmoid.configuration
328

Carl Schwan's avatar
Carl Schwan committed
329
330
331
332
                onEnabledCalendarPluginsChanged: {
                    PlasmaCalendar.EventPluginsManager.enabledPlugins = plasmoid.configuration.enabledCalendarPlugins;
                }
            }
333

Carl Schwan's avatar
Carl Schwan committed
334
335
336
337
338
339
            Binding {
                target: plasmoid
                property: "hideOnWindowDeactivate"
                value: !plasmoid.configuration.pin
                restoreMode: Binding.RestoreBinding
            }
340

Carl Schwan's avatar
Carl Schwan committed
341
342
            TextMetrics {
                id: dateLabelMetrics
343

Carl Schwan's avatar
Carl Schwan committed
344
345
346
                // Date/time are arbitrary values with all parts being two-digit
                readonly property string timeString: Qt.formatTime(new Date(2000, 12, 12, 12, 12, 12, 12))
                readonly property string dateString: agenda.formatDateWithoutYear(new Date(2000, 12, 12, 12, 12, 12))
347

Carl Schwan's avatar
Carl Schwan committed
348
349
                font: PlasmaCore.Theme.defaultFont
                text: timeString.length > dateString.length ? timeString : dateString
350
            }
351

Carl Schwan's avatar
Carl Schwan committed
352
353
354
            PlasmaComponents3.ScrollView {
                id: holidaysView
                anchors.fill: parent
355

Carl Schwan's avatar
Carl Schwan committed
356
357
358
                ListView {
                    id: holidaysList
                    highlight: Item {}
359

Carl Schwan's avatar
Carl Schwan committed
360
361
362
363
364
365
                    delegate: PlasmaComponents3.ItemDelegate {
                        id: eventItem
                        width: holidaysList.width
                        padding: calendar.paddings
                        leftPadding: calendar.paddings + PlasmaCore.Units.smallSpacing * 2
                        text: eventTitle.text
366
                        hoverEnabled: true
Carl Schwan's avatar
Carl Schwan committed
367
368
369
370
371
372
373
374
375
376
377
                        property bool hasTime: {
                            // Explicitly all-day event
                            if (modelData.isAllDay) {
                                return false;
                            }
                            // Multi-day event which does not start or end today (so
                            // is all-day from today's point of view)
                            if (modelData.startDateTime - monthView.currentDate < 0 &&
                                modelData.endDateTime - monthView.currentDate > 86400000) { // 24hrs in ms
                                return false;
                            }
378

Carl Schwan's avatar
Carl Schwan committed
379
380
381
                            // Non-explicit all-day event
                            const startIsMidnight = modelData.startDateTime.getHours() === 0
                                            && modelData.startDateTime.getMinutes() === 0;
382

Carl Schwan's avatar
Carl Schwan committed
383
384
                            const endIsMidnight = modelData.endDateTime.getHours() === 0
                                            && modelData.endDateTime.getMinutes() === 0;
385

Carl Schwan's avatar
Carl Schwan committed
386
387
                            const sameDay = modelData.startDateTime.getDate() === modelData.endDateTime.getDate()
                                    && modelData.startDateTime.getDay() === modelData.endDateTime.getDay()
388

Carl Schwan's avatar
Carl Schwan committed
389
                            return !(startIsMidnight && endIsMidnight && sameDay);
390
                        }
391

Carl Schwan's avatar
Carl Schwan committed
392
393
                        PlasmaComponents3.ToolTip {
                            text: modelData.description
394
                            visible: text !== "" && eventItem.hovered
Carl Schwan's avatar
Carl Schwan committed
395
                        }
396

Carl Schwan's avatar
Carl Schwan committed
397
398
399
400
401
402
                        contentItem: GridLayout {
                            id: eventGrid
                            columns: 3
                            rows: 2
                            rowSpacing: 0
                            columnSpacing: 2 * PlasmaCore.Units.smallSpacing
403

Carl Schwan's avatar
Carl Schwan committed
404
405
                            Rectangle {
                                id: eventColor
406

Carl Schwan's avatar
Carl Schwan committed
407
408
409
410
                                Layout.row: 0
                                Layout.column: 0
                                Layout.rowSpan: 2
                                Layout.fillHeight: true
411

Carl Schwan's avatar
Carl Schwan committed
412
413
414
415
                                color: modelData.eventColor
                                width: 5 * PlasmaCore.Units.devicePixelRatio
                                visible: modelData.eventColor !== ""
                            }
416

Carl Schwan's avatar
Carl Schwan committed
417
418
419
420
421
                            PlasmaComponents3.Label {
                                id: startTimeLabel

                                readonly property bool startsToday: modelData.startDateTime - monthView.currentDate >= 0
                                readonly property bool startedYesterdayLessThan12HoursAgo: modelData.startDateTime - monthView.currentDate >= -43200000 //12hrs in ms
422

Carl Schwan's avatar
Carl Schwan committed
423
424
425
426
427
428
429
430
431
                                Layout.row: 0
                                Layout.column: 1
                                Layout.minimumWidth: dateLabelMetrics.width

                                text: startsToday || startedYesterdayLessThan12HoursAgo
                                        ? Qt.formatTime(modelData.startDateTime)
                                        : agenda.formatDateWithoutYear(modelData.startDateTime)
                                horizontalAlignment: Qt.AlignRight
                                visible: eventItem.hasTime
432
                            }
433

Carl Schwan's avatar
Carl Schwan committed
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
                            PlasmaComponents3.Label {
                                id: endTimeLabel

                                readonly property bool endsToday: modelData.endDateTime - monthView.currentDate <= 86400000 // 24hrs in ms
                                readonly property bool endsTomorrowInLessThan12Hours: modelData.endDateTime - monthView.currentDate <= 86400000 + 43200000 // 36hrs in ms

                                Layout.row: 1
                                Layout.column: 1
                                Layout.minimumWidth: dateLabelMetrics.width

                                text: endsToday || endsTomorrowInLessThan12Hours
                                        ? Qt.formatTime(modelData.endDateTime)
                                        : agenda.formatDateWithoutYear(modelData.endDateTime)
                                horizontalAlignment: Qt.AlignRight
                                opacity: 0.7

                                visible: eventItem.hasTime
                            }

                            PlasmaComponents3.Label {
                                id: eventTitle

                                Layout.row: 0
                                Layout.column: 2
                                Layout.fillWidth: true

                                elide: Text.ElideRight
                                text: modelData.title
                                verticalAlignment: Text.AlignVCenter
                                maximumLineCount: 2
464
                            }
465
466
                        }
                    }
467
                }
Carl Schwan's avatar
Carl Schwan committed
468
            }
469

Carl Schwan's avatar
Carl Schwan committed
470
471
472
473
474
475
476
477
478
479
480
            PlasmaExtras.Heading {
                anchors.fill: holidaysView
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
                anchors.leftMargin: PlasmaCore.Units.largeSpacing
                anchors.rightMargin: PlasmaCore.Units.largeSpacing
                text: monthView.isToday(monthView.currentDate) ? i18n("No events for today")
                                                            : i18n("No events for this day");
                level: 3
                enabled: false
                visible: holidaysList.count == 0
481
            }
Carl Schwan's avatar
Carl Schwan committed
482
        }
483

Carl Schwan's avatar
Carl Schwan committed
484
485
486
        // Horizontal separator line between events and time zones
        PlasmaCore.SvgItem {
            visible: worldClocks.visible && agenda.visible
487

Carl Schwan's avatar
Carl Schwan committed
488
489
            Layout.fillWidth: true
            Layout.preferredHeight: naturalSize.height
490

Carl Schwan's avatar
Carl Schwan committed
491
492
493
            elementId: "horizontal-line"
            svg: PlasmaCore.Svg {
                imagePath: "widgets/line"
494
            }
Carl Schwan's avatar
Carl Schwan committed
495
        }
496

Carl Schwan's avatar
Carl Schwan committed
497
498
499
500
501
502
503
504
505
        // Clocks stuff
        // ------------
        // Header text + button to change time & timezone
        PlasmaExtras.PlasmoidHeading {
            visible: worldClocks.visible
            leftInset: 0
            rightInset: 0
            rightPadding: PlasmaCore.Units.smallSpacing
            contentItem: RowLayout {
506
                PlasmaExtras.Heading {
Carl Schwan's avatar
Carl Schwan committed
507
                    Layout.leftMargin: calendar.paddings + PlasmaCore.Units.smallSpacing * 2
508
                    Layout.fillWidth: true
509

510
                    level: 2
511

512
513
514
515
516
517
518
                    text: i18n("Time Zones")
                    maximumLineCount: 1
                    elide: Text.ElideRight
                }

                PlasmaComponents3.ToolButton {
                    visible: KCMShell.authorize("clock.desktop").length > 0
519
                    text: i18n("Switch…")
520
521
522
523
524
525
526
                    icon.name: "preferences-system-time"
                    onClicked: KCMShell.openSystemSettings("clock")

                    PlasmaComponents3.ToolTip {
                        text: i18n("Switch to another timezone")
                    }
                }
527
            }
Carl Schwan's avatar
Carl Schwan committed
528
        }
529

Carl Schwan's avatar
Carl Schwan committed
530
531
532
533
        // Clocks view itself
        PlasmaComponents3.ScrollView {
            id: worldClocks
            visible: calendar.showClocks
534

Carl Schwan's avatar
Carl Schwan committed
535
536
537
            Layout.fillWidth: true
            Layout.fillHeight: !agenda.visible
            Layout.minimumHeight: visible ? PlasmaCore.Units.gridUnit * 7 : 0
538
            Layout.maximumHeight: agenda.visible ? PlasmaCore.Units.gridUnit * 10 : -1
539

Carl Schwan's avatar
Carl Schwan committed
540
541
            ListView {
                id: clocksList
542
543
544
                anchors.left: parent.left
                anchors.right: parent.right
                anchors.rightMargin: PlasmaCore.Units.smallSpacing * 2
545

Carl Schwan's avatar
Carl Schwan committed
546
                highlight: Item {}
547

Carl Schwan's avatar
Carl Schwan committed
548
549
550
551
                model: {
                    let timezones = [];
                    for (let i = 0; i < plasmoid.configuration.selectedTimeZones.length; i++) {
                        timezones.push(plasmoid.configuration.selectedTimeZones[i]);
552
                    }
553

Carl Schwan's avatar
Carl Schwan committed
554
555
                    return timezones;
                }
556

Carl Schwan's avatar
Carl Schwan committed
557
558
559
560
561
562
563
564
565
566
567
568
569
570
                delegate: PlasmaComponents3.ItemDelegate {
                    id: listItem
                    readonly property bool isCurrentTimeZone: modelData === plasmoid.configuration.lastSelectedTimezone
                    width: clocksList.width
                    padding: calendar.paddings
                    leftPadding: calendar.paddings + PlasmaCore.Units.smallSpacing * 2

                    contentItem: RowLayout {
                        PlasmaComponents3.Label {
                            text: root.nameForZone(modelData)
                            font.weight: listItem.isCurrentTimeZone ? Font.Bold : Font.Normal
                            maximumLineCount: 1
                            elide: Text.ElideRight
                        }
571

Carl Schwan's avatar
Carl Schwan committed
572
573
574
575
576
577
578
                        PlasmaComponents3.Label {
                            Layout.fillWidth: true
                            horizontalAlignment: Qt.AlignRight
                            text: root.timeForZone(modelData)
                            font.weight: listItem.isCurrentTimeZone ? Font.Bold : Font.Normal
                            elide: Text.ElideRight
                            maximumLineCount: 1
579
580
581
582
583
584
                        }
                    }
                }
            }
        }
    }
Carl Schwan's avatar
Carl Schwan committed
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623

    // Vertical separator line between columns
    // =======================================
    PlasmaCore.SvgItem {
        id: mainSeparator
        visible: leftColumn.visible
        anchors {
            right: monthViewWrapper.left
            top: parent.top
            bottom: parent.bottom
        }
        width: 1

        elementId: "vertical-line"
        svg: PlasmaCore.Svg {
            imagePath: "widgets/line"
        }
    }

    // Right column containing calendar
    // ===============================
    FocusScope {
        id: monthViewWrapper
        width: calendar.showAgenda || calendar.showClocks ? parent.width / 2 : parent.width
        anchors.right: parent.right
        anchors.top: parent.top
        anchors.bottom: parent.bottom
        PlasmaCalendar.MonthView {
            id: monthView
            anchors.margins: PlasmaCore.Units.smallSpacing
            borderOpacity: 0.25
            today: root.tzDate
            firstDayOfWeek: plasmoid.configuration.firstDayOfWeek > -1
                ? plasmoid.configuration.firstDayOfWeek
                : Qt.locale().firstDayOfWeek
            showWeekNumbers: plasmoid.configuration.showWeekNumbers
            showCustomHeader: true
        }
    }
624
}