Mercurial > minori
annotate src/gui/pages/statistics.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 | 649786bae914 |
children | 4d461ef7d424 |
rev | line source |
---|---|
9 | 1 #include "gui/pages/statistics.h" |
15 | 2 #include "core/anime_db.h" |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
3 #include "core/strings.h" |
15 | 4 #include "core/session.h" |
9 | 5 #include "gui/pages/anime_list.h" |
46 | 6 #include "gui/widgets/text.h" |
93 | 7 #include "gui/widgets/graph.h" |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
172
diff
changeset
|
8 |
9 | 9 #include <QString> |
10 #include <QTextDocument> | |
11 #include <QTextStream> | |
12 #include <QTimer> | |
13 #include <QVBoxLayout> | |
14 #include <QWidget> | |
178
bc8d2ccff09c
win32/dark: use existing STL classes for dwmapi
Paper <mrpapersonic@gmail.com>
parents:
172
diff
changeset
|
15 |
9 | 16 #include <sstream> |
17 | |
64 | 18 StatisticsPage::StatisticsPage(QWidget* parent) : QFrame(parent) { |
19 QVBoxLayout* layout = new QVBoxLayout(this); | |
9 | 20 |
64 | 21 setFrameShape(QFrame::Box); |
9 | 22 setFrameShadow(QFrame::Sunken); |
23 | |
46 | 24 setAutoFillBackground(true); |
37
9ae9365dd4ea
window.cpp: fix sidebar on Linux
Paper <mrpapersonic@gmail.com>
parents:
15
diff
changeset
|
25 |
93 | 26 _anime_list.reset(new TextWidgets::LabelledSection( |
51 | 27 tr("Anime list"), |
63 | 28 tr("Anime count:\nEpisode count:\nTime spent watching:\nTime to complete:\nAverage score:\nScore deviation:"), |
93 | 29 "", this)); |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
30 layout->addWidget(_anime_list.get()); |
93 | 31 |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
32 { |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
33 QWidget* score_dist_widget = new QWidget(this); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
34 QVBoxLayout* score_dist_layout = new QVBoxLayout(score_dist_widget); |
9 | 35 |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
36 score_dist_layout->addWidget(new TextWidgets::Header(tr("Score distribution"), score_dist_widget)); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
37 |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
38 /* Ew */ |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
39 { |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
40 QWidget* score_graph_parent = new QWidget(score_dist_widget); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
41 QVBoxLayout* score_parent_layout = new QVBoxLayout(score_graph_parent); |
94
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
42 |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
43 _score_distribution_graph.reset(new Graph<int>(score_graph_parent)); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
44 score_parent_layout->addWidget(_score_distribution_graph.get()); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
45 |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
46 score_parent_layout->setSpacing(0); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
47 score_parent_layout->setContentsMargins(12, 0, 0, 0); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
48 |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
49 score_graph_parent->setContentsMargins(3, 0, 0, 0); |
9 | 50 |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
51 score_dist_layout->addWidget(score_graph_parent); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
52 } |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
53 |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
54 score_dist_layout->setContentsMargins(0, 0, 0, 0); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
55 |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
56 layout->addWidget(score_dist_widget); |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
57 } |
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
58 |
93 | 59 |
60 _application.reset(new TextWidgets::LabelledSection(tr("Minori"), tr("Uptime:\nRequests made:"), "\n\n", this)); | |
172
45a0967485f1
graph, statistics: make my code a little less messy
Paper <mrpapersonic@gmail.com>
parents:
105
diff
changeset
|
61 layout->addWidget(_application.get()); |
93 | 62 |
64 | 63 layout->addStretch(); |
9 | 64 |
65 QTimer* timer = new QTimer(this); | |
66 connect(timer, &QTimer::timeout, this, [this] { | |
67 if (isVisible()) | |
68 UpdateStatistics(); | |
69 }); | |
70 timer->start(1000); // update statistics every second | |
71 } | |
72 | |
64 | 73 void StatisticsPage::showEvent(QShowEvent*) { |
9 | 74 UpdateStatistics(); |
75 } | |
76 | |
77 /* me abusing macros :) */ | |
189 | 78 static void add_time_segment(std::ostringstream& str, int x, const std::string_view& s, const std::string_view& p) { |
79 if (x > 0) | |
80 str << x << ((x == 1) ? s : p); | |
81 } | |
82 | |
102 | 83 std::string StatisticsPage::MinutesToDateString(const int minutes) { |
9 | 84 /* ew */ |
85 int years = (minutes * (1 / 525949.2F)); | |
86 int months = (minutes * (1 / 43829.1F)) - (years * 12); | |
87 int days = (minutes * (1 / 1440.0F)) - (years * 365.2425F) - (months * 30.436875F); | |
88 int hours = (minutes * (1 / 60.0F)) - (years * 8765.82F) - (months * 730.485F) - (days * 24); | |
89 int rest_minutes = (minutes) - (years * 525949.2F) - (months * 43829.1F) - (days * 1440) - (hours * 60); | |
90 std::ostringstream return_stream; | |
189 | 91 add_time_segment(return_stream, years, " year ", " years "); |
92 add_time_segment(return_stream, months, " month ", " months "); | |
93 add_time_segment(return_stream, days, " day ", " days "); | |
94 add_time_segment(return_stream, hours, " hour ", " hours "); | |
9 | 95 if (rest_minutes > 0 || return_stream.str().size() == 0) |
96 return_stream << rest_minutes << ((rest_minutes == 1) ? " minute" : " minutes"); | |
97 return return_stream.str(); | |
98 } | |
99 | |
102 | 100 std::string StatisticsPage::SecondsToDateString(const int sec) { |
9 | 101 /* this is all fairly unnecessary, but works:tm: */ |
10 | 102 int years = sec * (1 / 31556952.0F); |
103 int months = sec * (1 / 2629746.0F) - (years * 12); | |
104 int days = sec * (1 / 86400.0F) - (years * 365.2425F) - (months * 30.436875F); | |
105 int hours = sec * (1 / 3600.0F) - (years * 8765.82F) - (months * 730.485F) - (days * 24); | |
106 int minutes = (sec) * (1 / 60.0F) - (years * 525949.2F) - (months * 43829.1F) - (days * 1440.0F) - (hours * 60.0F); | |
15 | 107 int seconds = |
108 sec - (years * 31556952.0F) - (months * 2629746.0F) - (days * 86400.0F) - (hours * 3600.0F) - (minutes * 60.0F); | |
9 | 109 std::ostringstream return_stream; |
189 | 110 add_time_segment(return_stream, years, " year ", " years "); |
111 add_time_segment(return_stream, months, " month ", " months "); | |
112 add_time_segment(return_stream, days, " day ", " days "); | |
113 add_time_segment(return_stream, hours, " hour ", " hours "); | |
114 add_time_segment(return_stream, minutes, " minute ", " minutes "); | |
10 | 115 if (seconds > 0 || return_stream.str().size() == 0) |
116 return_stream << seconds << ((seconds == 1) ? " second" : " seconds"); | |
9 | 117 return return_stream.str(); |
118 } | |
119 | |
102 | 120 inline int GetTotalWithScore(const int score) { |
93 | 121 int count = 0; |
122 for (const auto& item : Anime::db.items) | |
123 if (item.second.IsInUserList() && item.second.GetUserScore() == score) | |
124 count++; | |
125 return count; | |
126 } | |
127 | |
64 | 128 void StatisticsPage::UpdateStatistics() { |
9 | 129 /* Anime list */ |
130 QString string = ""; | |
131 QTextStream ts(&string); | |
10 | 132 ts << Anime::db.GetTotalAnimeAmount() << '\n'; |
133 ts << Anime::db.GetTotalEpisodeAmount() << '\n'; | |
134 ts << MinutesToDateString(Anime::db.GetTotalWatchedAmount()).c_str() << '\n'; | |
135 ts << MinutesToDateString(Anime::db.GetTotalPlannedAmount()).c_str() << '\n'; | |
136 ts << Anime::db.GetAverageScore() << '\n'; | |
137 ts << Anime::db.GetScoreDeviation(); | |
93 | 138 _anime_list->GetParagraph()->SetText(string); |
139 | |
140 _score_distribution_graph->Clear(); | |
141 for (int i = 10; i <= 100; i += 10) | |
142 _score_distribution_graph->AddItem(i, GetTotalWithScore(i)); | |
9 | 143 |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
144 string = ""; |
187
9613d72b097e
*: multiple performance improvements
Paper <mrpapersonic@gmail.com>
parents:
178
diff
changeset
|
145 ts << Strings::ToQString(SecondsToDateString(session.uptime() / 1000)) << '\n'; |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
146 ts << session.GetRequests(); |
9 | 147 /* Application */ |
148 // UiUtils::SetPlainTextEditData(application_data, QString::number(session.uptime() / 1000)); | |
93 | 149 _application->GetParagraph()->SetText(string); |
9 | 150 } |
151 | |
10 | 152 #include "gui/pages/moc_statistics.cpp" |