Mercurial > minori
annotate src/gui/pages/statistics.cc @ 101:c537996cf67b
*: multitude of config changes
1. theme is now configurable from the settings menu
(but you have to restart for it to apply)
2. config is now stored in an INI file, with no method of
conversion from json (this repo is private-ish anyway)
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Fri, 03 Nov 2023 14:06:02 -0400 |
parents | 2f373d48f889 |
children | b315f3759c56 |
rev | line source |
---|---|
9 | 1 #include "gui/pages/statistics.h" |
15 | 2 #include "core/anime_db.h" |
3 #include "core/session.h" | |
9 | 4 #include "gui/pages/anime_list.h" |
46 | 5 #include "gui/widgets/text.h" |
93 | 6 #include "gui/widgets/graph.h" |
9 | 7 #include <QString> |
8 #include <QTextDocument> | |
9 #include <QTextStream> | |
10 #include <QTimer> | |
11 #include <QVBoxLayout> | |
12 #include <QWidget> | |
13 #include <sstream> | |
14 | |
64 | 15 StatisticsPage::StatisticsPage(QWidget* parent) : QFrame(parent) { |
16 QVBoxLayout* layout = new QVBoxLayout(this); | |
9 | 17 |
64 | 18 setFrameShape(QFrame::Box); |
9 | 19 setFrameShadow(QFrame::Sunken); |
20 | |
37
9ae9365dd4ea
window.cpp: fix sidebar on Linux
Paper <mrpapersonic@gmail.com>
parents:
15
diff
changeset
|
21 QPalette pal = QPalette(); |
49 | 22 pal.setColor(QPalette::Window, pal.color(QPalette::Base)); |
37
9ae9365dd4ea
window.cpp: fix sidebar on Linux
Paper <mrpapersonic@gmail.com>
parents:
15
diff
changeset
|
23 setPalette(pal); |
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)); |
30 | |
31 QWidget* score_dist_widget = new QWidget(this); | |
32 QVBoxLayout* score_dist_layout = new QVBoxLayout(score_dist_widget); | |
9 | 33 |
94
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
34 score_dist_layout->addWidget(new TextWidgets::Header(tr("Score distribution"), score_dist_widget)); |
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
35 |
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
36 /* I have to explain myself here: I hate this :). This makes a widget as a layer to create a margin, |
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
37 similar to what I do in text.cc with sections. I hate it and it should really be put into a separate |
2f373d48f889
*: etc changes to graph stuff
Paper <mrpapersonic@gmail.com>
parents:
93
diff
changeset
|
38 class, but whatever. */ |
93 | 39 QWidget* content = new QWidget(score_dist_widget); |
40 QVBoxLayout* content_layout = new QVBoxLayout(content); | |
41 _score_distribution_graph.reset(new Graph<int>(content)); | |
42 content_layout->addWidget(_score_distribution_graph.get()); | |
43 content_layout->setContentsMargins(0, 0, 0, 0); | |
44 content->setContentsMargins(12, 0, 0, 0); | |
9 | 45 |
93 | 46 score_dist_layout->addWidget(content); |
47 score_dist_layout->setContentsMargins(0, 0, 0, 0); | |
48 | |
49 _application.reset(new TextWidgets::LabelledSection(tr("Minori"), tr("Uptime:\nRequests made:"), "\n\n", this)); | |
50 | |
51 layout->addWidget(_anime_list.get()); | |
52 layout->addWidget(score_dist_widget); | |
53 layout->addWidget(_application.get()); | |
64 | 54 layout->addStretch(); |
9 | 55 |
56 QTimer* timer = new QTimer(this); | |
57 connect(timer, &QTimer::timeout, this, [this] { | |
58 if (isVisible()) | |
59 UpdateStatistics(); | |
60 }); | |
61 timer->start(1000); // update statistics every second | |
62 } | |
63 | |
64 | 64 void StatisticsPage::showEvent(QShowEvent*) { |
9 | 65 UpdateStatistics(); |
66 } | |
67 | |
68 /* me abusing macros :) */ | |
15 | 69 #define ADD_TIME_SEGMENT(r, x, s, p) \ |
64 | 70 if (x > 0) \ |
71 r << x << ((x == 1) ? s : p) | |
72 std::string StatisticsPage::MinutesToDateString(int minutes) { | |
9 | 73 /* ew */ |
74 int years = (minutes * (1 / 525949.2F)); | |
75 int months = (minutes * (1 / 43829.1F)) - (years * 12); | |
76 int days = (minutes * (1 / 1440.0F)) - (years * 365.2425F) - (months * 30.436875F); | |
77 int hours = (minutes * (1 / 60.0F)) - (years * 8765.82F) - (months * 730.485F) - (days * 24); | |
78 int rest_minutes = (minutes) - (years * 525949.2F) - (months * 43829.1F) - (days * 1440) - (hours * 60); | |
79 std::ostringstream return_stream; | |
80 ADD_TIME_SEGMENT(return_stream, years, " year ", " years "); | |
81 ADD_TIME_SEGMENT(return_stream, months, " month ", " months "); | |
82 ADD_TIME_SEGMENT(return_stream, days, " day ", " days "); | |
83 ADD_TIME_SEGMENT(return_stream, hours, " hour ", " hours "); | |
84 if (rest_minutes > 0 || return_stream.str().size() == 0) | |
85 return_stream << rest_minutes << ((rest_minutes == 1) ? " minute" : " minutes"); | |
86 return return_stream.str(); | |
87 } | |
88 | |
64 | 89 std::string StatisticsPage::SecondsToDateString(int sec) { |
9 | 90 /* this is all fairly unnecessary, but works:tm: */ |
10 | 91 int years = sec * (1 / 31556952.0F); |
92 int months = sec * (1 / 2629746.0F) - (years * 12); | |
93 int days = sec * (1 / 86400.0F) - (years * 365.2425F) - (months * 30.436875F); | |
94 int hours = sec * (1 / 3600.0F) - (years * 8765.82F) - (months * 730.485F) - (days * 24); | |
95 int minutes = (sec) * (1 / 60.0F) - (years * 525949.2F) - (months * 43829.1F) - (days * 1440.0F) - (hours * 60.0F); | |
15 | 96 int seconds = |
97 sec - (years * 31556952.0F) - (months * 2629746.0F) - (days * 86400.0F) - (hours * 3600.0F) - (minutes * 60.0F); | |
9 | 98 std::ostringstream return_stream; |
10 | 99 ADD_TIME_SEGMENT(return_stream, years, " year ", " years "); |
100 ADD_TIME_SEGMENT(return_stream, months, " month ", " months "); | |
101 ADD_TIME_SEGMENT(return_stream, days, " day ", " days "); | |
102 ADD_TIME_SEGMENT(return_stream, hours, " hour ", " hours "); | |
103 ADD_TIME_SEGMENT(return_stream, minutes, " minute ", " minutes "); | |
104 if (seconds > 0 || return_stream.str().size() == 0) | |
105 return_stream << seconds << ((seconds == 1) ? " second" : " seconds"); | |
9 | 106 return return_stream.str(); |
107 } | |
108 #undef ADD_TIME_SEGMENT | |
109 | |
93 | 110 inline int GetTotalWithScore(int score) { |
111 int count = 0; | |
112 for (const auto& item : Anime::db.items) | |
113 if (item.second.IsInUserList() && item.second.GetUserScore() == score) | |
114 count++; | |
115 return count; | |
116 } | |
117 | |
64 | 118 void StatisticsPage::UpdateStatistics() { |
9 | 119 /* Anime list */ |
120 QString string = ""; | |
121 QTextStream ts(&string); | |
10 | 122 ts << Anime::db.GetTotalAnimeAmount() << '\n'; |
123 ts << Anime::db.GetTotalEpisodeAmount() << '\n'; | |
124 ts << MinutesToDateString(Anime::db.GetTotalWatchedAmount()).c_str() << '\n'; | |
125 ts << MinutesToDateString(Anime::db.GetTotalPlannedAmount()).c_str() << '\n'; | |
126 ts << Anime::db.GetAverageScore() << '\n'; | |
127 ts << Anime::db.GetScoreDeviation(); | |
93 | 128 _anime_list->GetParagraph()->SetText(string); |
129 | |
130 _score_distribution_graph->Clear(); | |
131 for (int i = 10; i <= 100; i += 10) | |
132 _score_distribution_graph->AddItem(i, GetTotalWithScore(i)); | |
9 | 133 |
47
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
134 string = ""; |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
135 ts << QString::fromUtf8(SecondsToDateString(session.uptime() / 1000).c_str()) << '\n'; |
d8eb763e6661
information.cpp: add widgets to the list tab, and add an
Paper <mrpapersonic@gmail.com>
parents:
46
diff
changeset
|
136 ts << session.GetRequests(); |
9 | 137 /* Application */ |
138 // UiUtils::SetPlainTextEditData(application_data, QString::number(session.uptime() / 1000)); | |
93 | 139 _application->GetParagraph()->SetText(string); |
9 | 140 } |
141 | |
10 | 142 #include "gui/pages/moc_statistics.cpp" |