comparison src/gui/dialog/information.cpp @ 46:d0adc4aedfc8

*: update... this commit: 1. consolidates dark theme stuff to dark_theme.cpp 2. creates a new widgets folder to store all of our custom widgets 3. creates the list settings page in the information dialog, although much of it is nonfunctional: it doesn't save, and the status doesn't even get filled in... we'll fix this later!
author Paper <mrpapersonic@gmail.com>
date Sat, 23 Sep 2023 01:02:15 -0400
parents 2743011a6042
children d8eb763e6661
comparison
equal deleted inserted replaced
45:4b05bc7668eb 46:d0adc4aedfc8
1 #include "gui/dialog/information.h" 1 #include "gui/dialog/information.h"
2 #include "core/anime.h" 2 #include "core/anime.h"
3 #include "core/array.h"
3 #include "core/strings.h" 4 #include "core/strings.h"
4 #include "gui/pages/anime_list.h" 5 #include "gui/pages/anime_list.h"
5 #include "gui/translate/anime.h" 6 #include "gui/translate/anime.h"
6 #include "gui/ui_utils.h" 7 #include "gui/widgets/text.h"
7 #include "gui/window.h" 8 #include "gui/window.h"
9 #include <QCheckBox>
10 #include <QComboBox>
8 #include <QDebug> 11 #include <QDebug>
9 #include <QDialogButtonBox> 12 #include <QDialogButtonBox>
13 #include <QLineEdit>
10 #include <QPlainTextEdit> 14 #include <QPlainTextEdit>
15 #include <QSpinBox>
16 #include <QStringList>
11 #include <QTextStream> 17 #include <QTextStream>
12 #include <QVBoxLayout> 18 #include <QVBoxLayout>
13 #include <functional> 19 #include <functional>
14 20
15 InformationDialog::InformationDialog(Anime::Anime& anime, std::function<void()> accept, QWidget* parent) 21 /* TODO: Taiga disables rendering of the tab widget entirely when the anime is not part of a list,
22 which sucks. Think of a better way to implement this later. */
23 InformationDialog::InformationDialog(const Anime::Anime& anime, std::function<void()> accept, QWidget* parent)
16 : QDialog(parent) { 24 : QDialog(parent) {
17 setFixedSize(842, 613); 25 setFixedSize(842, 613);
18 setWindowTitle(tr("Anime Information")); 26 setWindowTitle(tr("Anime Information"));
19 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); 27 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
20 28
40 } 48 }
41 49
42 main_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 50 main_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
43 51
44 /* anime title header text */ 52 /* anime title header text */
45 UiUtils::Paragraph* anime_title = 53 TextWidgets::Paragraph* anime_title =
46 new UiUtils::Paragraph(QString::fromUtf8(anime.GetUserPreferredTitle().c_str()), main_widget); 54 new TextWidgets::Paragraph(QString::fromUtf8(anime.GetUserPreferredTitle().c_str()), main_widget);
47 anime_title->setReadOnly(true); 55 anime_title->setReadOnly(true);
48 anime_title->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 56 anime_title->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
49 anime_title->setWordWrapMode(QTextOption::NoWrap); 57 anime_title->setWordWrapMode(QTextOption::NoWrap);
50 anime_title->setFrameShape(QFrame::NoFrame); 58 anime_title->setFrameShape(QFrame::NoFrame);
51 anime_title->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); 59 anime_title->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
58 anime_title->setFont(font); 66 anime_title->setFont(font);
59 } 67 }
60 68
61 { 69 {
62 QPalette pal; 70 QPalette pal;
63 pal.setColor(QPalette::Window, QColor(255, 255, 255, 0)); 71 pal.setColor(QPalette::Window, Qt::transparent);
64 pal.setColor(QPalette::WindowText, Qt::blue); 72 pal.setColor(QPalette::WindowText, Qt::blue);
65 } 73 }
66 74
67 /* tabbed widget */ 75 /* tabbed widget */
68 QTabWidget* tabbed_widget = new QTabWidget(main_widget); 76 QTabWidget* tabbed_widget = new QTabWidget(main_widget);
71 /* main info tab */ 79 /* main info tab */
72 QWidget* main_information_widget = new QWidget(tabbed_widget); 80 QWidget* main_information_widget = new QWidget(tabbed_widget);
73 main_information_widget->setLayout(new QVBoxLayout); 81 main_information_widget->setLayout(new QVBoxLayout);
74 82
75 /* alt titles */ 83 /* alt titles */
76 main_information_widget->layout()->addWidget(new UiUtils::SelectableTextParagraph( 84 main_information_widget->layout()->addWidget(new TextWidgets::SelectableTextParagraph(
77 "Alternative titles", QString::fromUtf8(Strings::Implode(anime.GetTitleSynonyms(), ", ").c_str()), 85 "Alternative titles", QString::fromUtf8(Strings::Implode(anime.GetTitleSynonyms(), ", ").c_str()),
78 main_information_widget)); 86 main_information_widget));
79 87
80 /* details */ 88 /* details */
81 QString details_data; 89 QString details_data;
82 QTextStream details_data_s(&details_data); 90 QTextStream details_data_s(&details_data);
83 details_data_s << Translate::ToString(anime.GetFormat()).c_str() << "\n" 91 details_data_s << Translate::ToString(anime.GetFormat()).c_str() << "\n"
84 << anime.GetEpisodes() << "\n" 92 << anime.GetEpisodes() << "\n"
85 << Translate::ToString(anime.GetUserStatus()).c_str() << "\n" 93 << Translate::ToString(anime.GetUserStatus()).c_str() << "\n"
86 << Translate::ToString(anime.GetSeason()).c_str() << " " << anime.GetAirDate().GetYear() 94 << Translate::ToString(anime.GetSeason()).c_str() << " " << anime.GetAirDate().GetYear() << "\n"
87 << "\n"
88 << Strings::Implode(anime.GetGenres(), ", ").c_str() << "\n" 95 << Strings::Implode(anime.GetGenres(), ", ").c_str() << "\n"
89 << anime.GetAudienceScore() << "%"; 96 << anime.GetAudienceScore() << "%";
90 main_information_widget->layout()->addWidget(new UiUtils::LabelledTextParagraph( 97 main_information_widget->layout()->addWidget(new TextWidgets::LabelledTextParagraph(
91 "Details", "Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nScore:", details_data, main_information_widget)); 98 "Details", "Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nScore:", details_data, main_information_widget));
92 99
93 /* synopsis */ 100 /* synopsis */
94 UiUtils::SelectableTextParagraph* synopsis = new UiUtils::SelectableTextParagraph( 101 TextWidgets::SelectableTextParagraph* synopsis = new TextWidgets::SelectableTextParagraph(
95 "Synopsis", QString::fromUtf8(anime.GetSynopsis().c_str()), main_information_widget); 102 "Synopsis", QString::fromUtf8(anime.GetSynopsis().c_str()), main_information_widget);
96 103
97 synopsis->GetParagraph()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); 104 synopsis->GetParagraph()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
98 ((QVBoxLayout*)main_information_widget->layout())->addWidget(synopsis); 105 main_information_widget->layout()->addWidget(synopsis);
99 106
100 QWidget* settings_widget = new QWidget(tabbed_widget); 107 QWidget* settings_widget = new QWidget(tabbed_widget);
108 settings_widget->setLayout(new QVBoxLayout);
109 settings_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
110
111 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Anime list"), settings_widget));
112
113 QWidget* sg_anime_list_content = new QWidget(settings_widget);
114 settings_widget->layout()->addWidget(sg_anime_list_content);
115 sg_anime_list_content->setLayout(new QVBoxLayout);
116 sg_anime_list_content->layout()->setSpacing(5);
117 sg_anime_list_content->layout()->setContentsMargins(12, 0, 0, 0);
118
119 /* Note: PLEASE find a way we can consolidate these. By ANY other means than
120 putting them in a separate function. Macros are very much preferred. */
121 #define LAYOUT_HORIZ_SPACING 9
122 #define LAYOUT_VERT_SPACING 5
123 {
124 /* Episodes watched section */
125 QWidget* section = new QWidget(sg_anime_list_content);
126 QHBoxLayout* layout = new QHBoxLayout;
127 layout->setSpacing(LAYOUT_HORIZ_SPACING);
128 layout->setMargin(0);
129 section->setLayout(layout);
130 {
131 QWidget* subsection = new QWidget(section);
132 subsection->setLayout(new QVBoxLayout);
133 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
134 subsection->layout()->setMargin(0);
135
136 subsection->layout()->addWidget(new QLabel(tr("Episodes watched:"), subsection));
137
138 QSpinBox* spin_box = new QSpinBox(subsection);
139 spin_box->setRange(0, anime.GetEpisodes());
140 spin_box->setSingleStep(1);
141 spin_box->setValue(anime.GetUserProgress());
142 subsection->layout()->addWidget(spin_box);
143
144 layout->addWidget(subsection);
145 }
146 {
147 QWidget* subsection = new QWidget(section);
148 subsection->setLayout(new QVBoxLayout);
149 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
150 subsection->layout()->setMargin(0);
151
152 subsection->layout()->addWidget(new QLabel(tr(" "), subsection));
153
154 QCheckBox* rewatched_checkbox = new QCheckBox("Rewatching");
155 subsection->layout()->addWidget(rewatched_checkbox);
156
157 layout->addWidget(subsection);
158 }
159 sg_anime_list_content->layout()->addWidget(section);
160 }
161 {
162 /* Status & score section */
163 QWidget* section = new QWidget(sg_anime_list_content);
164 QHBoxLayout* layout = new QHBoxLayout;
165 layout->setSpacing(LAYOUT_HORIZ_SPACING);
166 layout->setMargin(0);
167 section->setLayout(layout);
168 {
169 QWidget* subsection = new QWidget(section);
170 subsection->setLayout(new QVBoxLayout);
171 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
172 subsection->layout()->setMargin(0);
173
174 subsection->layout()->addWidget(new QLabel(tr("Status:"), subsection));
175
176 QStringList string_list;
177 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++)
178 string_list.append(QString::fromStdString(Translate::ToString(Anime::ListStatuses[i])));
179
180 QComboBox* combo_box = new QComboBox(subsection);
181 combo_box->addItems(string_list);
182 subsection->layout()->addWidget(combo_box);
183
184 layout->addWidget(subsection);
185 }
186 {
187 QWidget* subsection = new QWidget(section);
188 subsection->setLayout(new QVBoxLayout);
189 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
190 subsection->layout()->setMargin(0);
191
192 subsection->layout()->addWidget(new QLabel(tr("Score:"), subsection));
193
194 QSpinBox* spin_box = new QSpinBox(subsection);
195 spin_box->setRange(0, 100);
196 spin_box->setSingleStep(5);
197 spin_box->setValue(anime.GetUserScore());
198 subsection->layout()->addWidget(spin_box);
199
200 layout->addWidget(subsection);
201 }
202 sg_anime_list_content->layout()->addWidget(section);
203 }
204 {
205 /* Notes section */
206 QWidget* section = new QWidget(sg_anime_list_content);
207 QHBoxLayout* layout = new QHBoxLayout;
208 layout->setSpacing(LAYOUT_HORIZ_SPACING);
209 layout->setMargin(0);
210 section->setLayout(layout);
211 {
212 QWidget* subsection = new QWidget(section);
213 subsection->setLayout(new QVBoxLayout);
214 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
215 subsection->layout()->setMargin(0);
216
217 subsection->layout()->addWidget(new QLabel(tr("Notes:"), subsection));
218
219 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection);
220 line_edit->setPlaceholderText(tr("Enter your notes about this anime"));
221 subsection->layout()->addWidget(line_edit);
222
223 layout->addWidget(subsection);
224 }
225 sg_anime_list_content->layout()->addWidget(section);
226 }
227
228 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget));
229
230 QWidget* sg_local_content = new QWidget(settings_widget);
231 settings_widget->layout()->addWidget(sg_local_content);
232 sg_local_content->setLayout(new QVBoxLayout);
233 sg_local_content->layout()->setSpacing(5);
234 sg_local_content->layout()->setContentsMargins(12, 0, 0, 0);
235
236 {
237 /* Alternative titles */
238 QWidget* section = new QWidget(sg_local_content);
239 QHBoxLayout* layout = new QHBoxLayout;
240 layout->setSpacing(LAYOUT_HORIZ_SPACING);
241 layout->setMargin(0);
242 section->setLayout(layout);
243 {
244 QWidget* subsection = new QWidget(section);
245 subsection->setLayout(new QVBoxLayout);
246 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING);
247 subsection->layout()->setMargin(0);
248
249 subsection->layout()->addWidget(new QLabel(tr("Alternative titles:"), subsection));
250
251 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection);
252 line_edit->setPlaceholderText(tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)"));
253 subsection->layout()->addWidget(line_edit);
254
255 QCheckBox* checkbox = new QCheckBox("Use the first alternative title to search for torrents");
256 subsection->layout()->addWidget(checkbox);
257
258 layout->addWidget(subsection);
259 }
260 sg_local_content->layout()->addWidget(section);
261 }
262
263 static_cast<QBoxLayout*>(settings_widget->layout())->addStretch();
101 264
102 tabbed_widget->addTab(main_information_widget, "Main information"); 265 tabbed_widget->addTab(main_information_widget, "Main information");
103 tabbed_widget->addTab(settings_widget, "My list and settings"); 266 tabbed_widget->addTab(settings_widget, "My list and settings");
104 267
105 QVBoxLayout* main_layout = new QVBoxLayout; 268 QVBoxLayout* main_layout = new QVBoxLayout;