aboutsummaryrefslogtreecommitdiffstats
path: root/src/caltypes.h
blob: 10a65f194bca46b6d737c1b6c91e5b8f952a08e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
/*
 * qtmaildir - a Qt6 mail client for notmuch-indexed Maildirs
 * Copyright (C) 2026 Danilo M. <danix@danix.xyz>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#pragma once

#include "repeatrule.h"

#include <QByteArray>
#include <QColor>
#include <QDateTime>
#include <QList>
#include <QString>

/// One vdir collection: a subdirectory of calendars_dir.
struct CalCollection
{
    QString dir;          ///< The directory's own name, e.g. "52".
    QString path;         ///< Absolute path.
    /// From the vdir's `displayname` file, which vdirsyncer's metasync fills
    /// from the server; the directory name when absent.
    QString displayName;
    /// From the vdir's `color` file (`#RRGGBB`); a colour hashed from the
    /// directory name when absent, so no collection is ever invisible.
    QColor color;
    bool readOnly = false;  ///< The directory is not writable.
};

struct CalPerson
{
    QString name;      ///< CN, possibly empty.
    QString address;   ///< The address with "mailto:" removed.
    QString partstat;  ///< PARTSTAT as written, e.g. "ACCEPTED"; empty if absent.
};

/// A RECURRENCE-ID override: one occurrence of a series moved or changed.
struct CalOverride
{
    QDateTime recurrenceId;  ///< The original slot it replaces.
    QDateTime start;
    QDateTime end;
    bool allDay = false;
    QString summary;
    QString location;
    QString description;
    bool cancelled = false;  ///< STATUS:CANCELLED: the slot is removed.
};

/// One .ics file's event, as the rest of the application sees it.
struct CalEvent
{
    QString filePath;
    QString collectionDir;
    QString uid;
    QString summary;
    QString location;
    QString description;
    QDateTime start;
    QDateTime end;   ///< Exclusive. For an all-day event, midnight after the last day.
    bool allDay = false;
    RepeatRule repeat;  ///< Freq::None when the event does not repeat.
    QList<QDateTime> exdates;
    QList<CalOverride> overrides;
    bool hasAlarm = false;
    CalPerson organizer;  ///< Empty address: no ORGANIZER.
    QList<CalPerson> attendees;
    int sequence = 0;
    QByteArray rawText;  ///< The file exactly as read: stale checks and undo.
};

/// One expanded occurrence. What a view is built from.
struct Occurrence
{
    int eventIndex = -1;       ///< Into LoadResult::events.
    QDateTime start;
    QDateTime end;
    bool allDay = false;
    /// The slot this occurrence fills in its series, which is what a
    /// RECURRENCE-ID or an EXDATE names. Invalid for a non-repeating event.
    QDateTime recurrenceId;
    bool isOverride = false;
    int overrideIndex = -1;    ///< Into CalEvent::overrides when isOverride.
};

/// An occurrence plus what a view draws. Views see nothing else.
struct CalendarItem
{
    Occurrence occurrence;
    QString title;
    QColor color;
};

/// What the edit form produces.
struct EventEdit
{
    QString summary;
    QString location;
    QString description;
    QDateTime start;
    QDateTime end;
    bool allDay = false;
    RepeatRule repeat;
    QString collectionDir;
};

struct LoadResult
{
    QList<CalCollection> collections;
    QList<CalEvent> events;
    int unparsable = 0;     ///< Files skipped because they did not parse.
    int unknownZones = 0;   ///< Events whose TZID resolved to nothing, shown in local time.
};