comparison src/gui/pages/statistics.cc @ 370:ea3a74ed2ef9

*: hm, last commit wasn't quite finished?
author Paper <paper@tflc.us>
date Fri, 25 Jul 2025 10:22:04 -0400
parents 6b0768158dcd
children
comparison
equal deleted inserted replaced
369:47c9f8502269 370:ea3a74ed2ef9
15 #include <QWidget> 15 #include <QWidget>
16 16
17 #include <cmath> 17 #include <cmath>
18 #include <sstream> 18 #include <sstream>
19 19
20 StatisticsPage::StatisticsPage(QWidget* parent) 20 StatisticsPage::StatisticsPage(QWidget *parent) : QFrame(parent)
21 : QFrame(parent) { 21 {
22 setBackgroundRole(QPalette::Base); 22 setBackgroundRole(QPalette::Base);
23 23
24 QVBoxLayout* layout = new QVBoxLayout(this); 24 QVBoxLayout *layout = new QVBoxLayout(this);
25 25
26 setFrameShape(QFrame::Box); 26 setFrameShape(QFrame::Box);
27 setFrameShadow(QFrame::Sunken); 27 setFrameShadow(QFrame::Sunken);
28 28
29 setAutoFillBackground(true); 29 setAutoFillBackground(true);
30 30
31 const std::vector<std::pair<std::string, std::string>> al_data_template = { 31 const std::vector<std::pair<std::string, std::string>> al_data_template = {
32 {Strings::Translate("Anime count:"), ""}, 32 {Strings::Translate("Anime count:"), ""},
33 {Strings::Translate("Episode count:"), ""}, 33 {Strings::Translate("Episode count:"), ""},
34 {Strings::Translate("Time spent watching:"), ""}, 34 {Strings::Translate("Time spent watching:"), ""},
35 {Strings::Translate("Time to complete:"), ""}, 35 {Strings::Translate("Time to complete:"), ""},
36 {Strings::Translate("Average score:"), ""}, 36 {Strings::Translate("Average score:"), ""},
37 {Strings::Translate("Score deviation:"), ""}, 37 {Strings::Translate("Score deviation:"), ""},
38 }; 38 };
39 39
40 _anime_list.GetHeader().SetText(Strings::Translate("Anime List")); 40 _anime_list.GetHeader().SetText(Strings::Translate("Anime List"));
41 _anime_list.GetContent().SetData(al_data_template); 41 _anime_list.GetContent().SetData(al_data_template);
42 42
43 layout->addWidget(&_anime_list); 43 layout->addWidget(&_anime_list);
44 44
45 { 45 {
46 QWidget* score_dist_widget = new QWidget(this); 46 QWidget *score_dist_widget = new QWidget(this);
47 QVBoxLayout* score_dist_layout = new QVBoxLayout(score_dist_widget); 47 QVBoxLayout *score_dist_layout = new QVBoxLayout(score_dist_widget);
48 48
49 TextWidgets::Header* hdr = new TextWidgets::Header(score_dist_widget); 49 TextWidgets::Header *hdr = new TextWidgets::Header(score_dist_widget);
50 hdr->SetText(Strings::Translate("Score distribution")); 50 hdr->SetText(Strings::Translate("Score distribution"));
51 score_dist_layout->addWidget(hdr); 51 score_dist_layout->addWidget(hdr);
52 52
53 /* Ew */ 53 /* Ew */
54 { 54 {
55 QWidget* score_graph_parent = new QWidget(score_dist_widget); 55 QWidget *score_graph_parent = new QWidget(score_dist_widget);
56 QVBoxLayout* score_parent_layout = new QVBoxLayout(score_graph_parent); 56 QVBoxLayout *score_parent_layout = new QVBoxLayout(score_graph_parent);
57 57
58 score_parent_layout->addWidget(&_score_distribution_graph); 58 score_parent_layout->addWidget(&_score_distribution_graph);
59 59
60 score_parent_layout->setSpacing(0); 60 score_parent_layout->setSpacing(0);
61 score_parent_layout->setContentsMargins(12, 0, 0, 0); 61 score_parent_layout->setContentsMargins(12, 0, 0, 0);
67 67
68 layout->addWidget(score_dist_widget); 68 layout->addWidget(score_dist_widget);
69 } 69 }
70 70
71 const std::vector<std::pair<std::string, std::string>> app_data_template = { 71 const std::vector<std::pair<std::string, std::string>> app_data_template = {
72 {Strings::Translate("Uptime:"), ""}, 72 {Strings::Translate("Uptime:"), ""},
73 {Strings::Translate("Requests made:"), ""}, 73 {Strings::Translate("Requests made:"), ""},
74 }; 74 };
75 75
76 _application.GetHeader().SetText(Strings::Translate("Minori")); 76 _application.GetHeader().SetText(Strings::Translate("Minori"));
77 _application.GetContent().SetData(app_data_template); 77 _application.GetContent().SetData(app_data_template);
78 78
79 layout->addWidget(&_application); 79 layout->addWidget(&_application);
80 80
81 layout->addStretch(); 81 layout->addStretch();
82 82
83 QTimer* timer = new QTimer(this); 83 QTimer *timer = new QTimer(this);
84 connect(timer, &QTimer::timeout, this, [this] { 84 connect(timer, &QTimer::timeout, this, [this] {
85 if (isVisible()) 85 if (isVisible())
86 UpdateStatistics(); 86 UpdateStatistics();
87 }); 87 });
88 timer->start(1000); // update statistics every second 88 timer->start(1000); // update statistics every second
89 } 89 }
90 90
91 void StatisticsPage::showEvent(QShowEvent*) { 91 void StatisticsPage::showEvent(QShowEvent *)
92 {
92 UpdateStatistics(); 93 UpdateStatistics();
93 } 94 }
94 95
95 inline int GetTotalWithScore(const int score) { 96 inline int GetTotalWithScore(const int score)
97 {
96 int count = 0; 98 int count = 0;
97 for (const auto& item : Anime::db.items) 99 for (const auto &item : Anime::db.items)
98 if (item.second.IsInUserList() && item.second.GetUserScore() == score) 100 if (item.second.IsInUserList() && item.second.GetUserScore() == score)
99 count++; 101 count++;
100 return count; 102 return count;
101 } 103 }
102 104
103 void StatisticsPage::UpdateStatistics() { 105 void StatisticsPage::UpdateStatistics()
106 {
104 const std::vector<std::pair<std::string, std::string>> al_data = { 107 const std::vector<std::pair<std::string, std::string>> al_data = {
105 {Strings::Translate("Anime count:"), Strings::ToUtf8String(Anime::db.GetTotalAnimeAmount())}, 108 {Strings::Translate("Anime count:"), Strings::ToUtf8String(Anime::db.GetTotalAnimeAmount())},
106 {Strings::Translate("Episode count:"), Strings::ToUtf8String(Anime::db.GetTotalEpisodeAmount())}, 109 {Strings::Translate("Episode count:"), Strings::ToUtf8String(Anime::db.GetTotalEpisodeAmount())},
107 {Strings::Translate("Time spent watching:"), Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalWatchedAmount(), 60.0)}, 110 {Strings::Translate("Time spent watching:"),
108 {Strings::Translate("Time to complete:"), Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalPlannedAmount(), 60.0)}, 111 Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalWatchedAmount(), 60.0)},
109 {Strings::Translate("Average score:"), Strings::ToUtf8String(Anime::db.GetAverageScore())}, 112 {Strings::Translate("Time to complete:"),
110 {Strings::Translate("Score deviation:"), Strings::ToUtf8String(Anime::db.GetScoreDeviation())}, 113 Time::GetSecondsAsAbsoluteString(Time::Units::Minutes, Anime::db.GetTotalPlannedAmount(), 60.0)},
114 {Strings::Translate("Average score:"), Strings::ToUtf8String(Anime::db.GetAverageScore())},
115 {Strings::Translate("Score deviation:"), Strings::ToUtf8String(Anime::db.GetScoreDeviation())},
111 }; 116 };
112 117
113 _anime_list.GetContent().SetData(al_data); 118 _anime_list.GetContent().SetData(al_data);
114 119
115 _score_distribution_graph.Clear(); 120 _score_distribution_graph.Clear();
116 for (int i = 10; i <= 100; i += 10) 121 for (int i = 10; i <= 100; i += 10)
117 _score_distribution_graph.AddItem(i, GetTotalWithScore(i)); 122 _score_distribution_graph.AddItem(i, GetTotalWithScore(i));
118 123
119 /* Application */ 124 /* Application */
120 const std::vector<std::pair<std::string, std::string>> app_data_template = { 125 const std::vector<std::pair<std::string, std::string>> app_data_template = {
121 {Strings::Translate("Uptime:"), Time::GetSecondsAsAbsoluteString(Time::Units::Seconds, session.uptime() / 1000)}, 126 {Strings::Translate("Uptime:"),
122 {Strings::Translate("Requests made:"), Strings::ToUtf8String(session.GetRequests())}, 127 Time::GetSecondsAsAbsoluteString(Time::Units::Seconds, session.uptime() / 1000)},
128 {Strings::Translate("Requests made:"), Strings::ToUtf8String(session.GetRequests())},
123 }; 129 };
124 130
125 _application.GetContent().SetData(app_data_template); 131 _application.GetContent().SetData(app_data_template);
126 } 132 }