Mercurial > minori
annotate src/core/date.cc @ 198:bc1ae1810855
dep/animia: switch from using classes to global functions
the old idea was ok, but sort of hackish; this method doesn't use classes
at all, and this way (especially important!) we can do wayland stuff AND x11
at the same time, which wasn't really possible without stupid workarounds in
the other method
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Sun, 24 Dec 2023 02:59:42 -0500 |
parents | c4ca035c565d |
children | 862d0d8619f6 |
rev | line source |
---|---|
9 | 1 #include "core/date.h" |
2 #include "core/json.h" | |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
3 |
9 | 4 #include <QDate> |
51 | 5 #include <QDebug> |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
6 |
63 | 7 #include <algorithm> |
9 | 8 |
9 /* An implementation of AniList's "fuzzy date" */ | |
10 | |
11 Date::Date() { | |
12 } | |
13 | |
51 | 14 Date::Date(unsigned int y) { |
11 | 15 SetYear(y); |
9 | 16 } |
17 | |
51 | 18 Date::Date(unsigned int y, unsigned int m, unsigned int d) { |
11 | 19 SetYear(y); |
20 SetMonth(m); | |
21 SetDay(d); | |
9 | 22 } |
23 | |
51 | 24 Date::Date(const QDate& date) { |
25 SetYear(date.year()); | |
26 SetMonth(date.month()); | |
27 SetDay(date.day()); | |
28 } | |
29 | |
174
f88eda79c60a
anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
30 Date::Date(const nlohmann::json& json) { |
175 | 31 /* NOTE: this constructor is made for use with |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
32 AniList FuzzyDate-style JSON. In the future, some other |
175 | 33 methods may be parsed and whatnot if necessary. */ |
198
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
34 |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
35 if (json.contains("/year"_json_pointer) && json.at("/year"_json_pointer).is_number()) |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
36 SetYear(json.at("/year"_json_pointer).get<unsigned int>()); |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
37 if (json.contains("/month"_json_pointer) && json.at("/month"_json_pointer).is_number()) |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
38 SetMonth(json.at("/month"_json_pointer).get<unsigned int>()); |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
39 if (json.contains("/day"_json_pointer) && json.at("/day"_json_pointer).is_number()) |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
40 SetDay(json.at("/day"_json_pointer).get<unsigned int>()); |
174
f88eda79c60a
anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
41 } |
f88eda79c60a
anime/db: add some more json functionality, still doesn't compile :/
Paper <mrpapersonic@gmail.com>
parents:
81
diff
changeset
|
42 |
9 | 43 void Date::VoidYear() { |
196
f0ff06a45c42
date: use std::optional for values
Paper <mrpapersonic@gmail.com>
parents:
187
diff
changeset
|
44 year.reset(); |
9 | 45 } |
46 | |
47 void Date::VoidMonth() { | |
196
f0ff06a45c42
date: use std::optional for values
Paper <mrpapersonic@gmail.com>
parents:
187
diff
changeset
|
48 month.reset(); |
9 | 49 } |
50 | |
51 void Date::VoidDay() { | |
196
f0ff06a45c42
date: use std::optional for values
Paper <mrpapersonic@gmail.com>
parents:
187
diff
changeset
|
52 day.reset(); |
9 | 53 } |
54 | |
51 | 55 void Date::SetYear(unsigned int y) { |
197 | 56 year.emplace(y); |
9 | 57 } |
58 | |
51 | 59 void Date::SetMonth(unsigned int m) { |
197 | 60 month.emplace(std::clamp(m, 1U, 12U)); |
9 | 61 } |
62 | |
51 | 63 void Date::SetDay(unsigned int d) { |
197 | 64 day.emplace(std::clamp(d, 1U, 31U)); |
9 | 65 } |
66 | |
197 | 67 std::optional<unsigned int> Date::GetYear() const { |
68 return year; | |
9 | 69 } |
70 | |
197 | 71 std::optional<unsigned int> Date::GetMonth() const { |
72 return month; | |
9 | 73 } |
74 | |
197 | 75 std::optional<unsigned int> Date::GetDay() const { |
76 return day; | |
9 | 77 } |
78 | |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
79 bool Date::IsValid() const { |
196
f0ff06a45c42
date: use std::optional for values
Paper <mrpapersonic@gmail.com>
parents:
187
diff
changeset
|
80 return year.has_value() && month.has_value() && day.has_value(); |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
81 } |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
36
diff
changeset
|
82 |
9 | 83 QDate Date::GetAsQDate() const { |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
84 /* QDate doesn't support "missing" values (for good reason), |
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
85 * so we do our best and return what we can. |
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
86 */ |
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
175
diff
changeset
|
87 |
196
f0ff06a45c42
date: use std::optional for values
Paper <mrpapersonic@gmail.com>
parents:
187
diff
changeset
|
88 return QDate(year.value_or(2000), month.value_or(1), day.value_or(1)); |
9 | 89 } |
90 | |
91 nlohmann::json Date::GetAsAniListJson() const { | |
198
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
92 return { |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
93 {"year", year}, |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
94 {"month", month}, |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
95 {"day", day} |
bc1ae1810855
dep/animia: switch from using classes to global functions
Paper <mrpapersonic@gmail.com>
parents:
197
diff
changeset
|
96 }; |
9 | 97 } |