Mercurial > minori
comparison src/gui/dialog/information.cpp @ 51:75c804f713b2
window: add about window,
*: use tr() when applicable (useful for i18n)
author | Paper <mrpapersonic@gmail.com> |
---|---|
date | Mon, 25 Sep 2023 20:29:26 -0400 |
parents | d8eb763e6661 |
children | 4c6dd5999b39 |
comparison
equal
deleted
inserted
replaced
50:10868c3fb2be | 51:75c804f713b2 |
---|---|
23 | 23 |
24 /* TODO: Taiga disables rendering of the tab widget entirely when the anime is not part of a list, | 24 /* TODO: Taiga disables rendering of the tab widget entirely when the anime is not part of a list, |
25 which sucks. Think of a better way to implement this later. */ | 25 which sucks. Think of a better way to implement this later. */ |
26 void InformationDialog::SaveData() { | 26 void InformationDialog::SaveData() { |
27 Anime::Anime& anime = Anime::db.items[id]; | 27 Anime::Anime& anime = Anime::db.items[id]; |
28 anime.SetUserProgress(progress); | |
29 anime.SetUserScore(score); | |
30 anime.SetUserIsRewatching(rewatching); | |
31 anime.SetUserStatus(status); | |
32 anime.SetUserNotes(notes); | |
33 anime.SetUserDateStarted(started); | |
34 anime.SetUserDateCompleted(completed); | |
28 } | 35 } |
29 | 36 |
30 InformationDialog::InformationDialog(const Anime::Anime& anime, std::function<void()> accept, QWidget* parent) | 37 InformationDialog::InformationDialog(const Anime::Anime& anime, std::function<void()> accept, QWidget* parent) |
31 : QDialog(parent) { | 38 : QDialog(parent) { |
32 setFixedSize(842, 613); | 39 setFixedSize(842, 613); |
54 main_widget->setPalette(pal); | 61 main_widget->setPalette(pal); |
55 } | 62 } |
56 | 63 |
57 main_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); | 64 main_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
58 | 65 |
66 id = anime.GetId(); | |
59 /* anime title header text */ | 67 /* anime title header text */ |
60 TextWidgets::Paragraph* anime_title = | 68 TextWidgets::Paragraph* anime_title = |
61 new TextWidgets::Paragraph(QString::fromUtf8(anime.GetUserPreferredTitle().c_str()), main_widget); | 69 new TextWidgets::Paragraph(QString::fromUtf8(anime.GetUserPreferredTitle().c_str()), main_widget); |
62 anime_title->setReadOnly(true); | 70 anime_title->setReadOnly(true); |
63 anime_title->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); | 71 anime_title->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); |
87 QWidget* main_information_widget = new QWidget(tabbed_widget); | 95 QWidget* main_information_widget = new QWidget(tabbed_widget); |
88 main_information_widget->setLayout(new QVBoxLayout); | 96 main_information_widget->setLayout(new QVBoxLayout); |
89 | 97 |
90 /* alt titles */ | 98 /* alt titles */ |
91 main_information_widget->layout()->addWidget(new TextWidgets::SelectableTextParagraph( | 99 main_information_widget->layout()->addWidget(new TextWidgets::SelectableTextParagraph( |
92 "Alternative titles", QString::fromUtf8(Strings::Implode(anime.GetTitleSynonyms(), ", ").c_str()), | 100 tr("Alternative titles"), QString::fromUtf8(Strings::Implode(anime.GetTitleSynonyms(), ", ").c_str()), |
93 main_information_widget)); | 101 main_information_widget)); |
94 | 102 |
95 /* details */ | 103 /* details */ |
96 QString details_data; | 104 QString details_data; |
97 QTextStream details_data_s(&details_data); | 105 QTextStream details_data_s(&details_data); |
100 << Translate::ToString(anime.GetUserStatus()).c_str() << "\n" | 108 << Translate::ToString(anime.GetUserStatus()).c_str() << "\n" |
101 << Translate::ToString(anime.GetSeason()).c_str() << " " << anime.GetAirDate().GetYear() << "\n" | 109 << Translate::ToString(anime.GetSeason()).c_str() << " " << anime.GetAirDate().GetYear() << "\n" |
102 << Strings::Implode(anime.GetGenres(), ", ").c_str() << "\n" | 110 << Strings::Implode(anime.GetGenres(), ", ").c_str() << "\n" |
103 << anime.GetAudienceScore() << "%"; | 111 << anime.GetAudienceScore() << "%"; |
104 main_information_widget->layout()->addWidget(new TextWidgets::LabelledTextParagraph( | 112 main_information_widget->layout()->addWidget(new TextWidgets::LabelledTextParagraph( |
105 "Details", "Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nScore:", details_data, main_information_widget)); | 113 tr("Details"), tr("Type:\nEpisodes:\nStatus:\nSeason:\nGenres:\nScore:"), details_data, main_information_widget)); |
106 | 114 |
107 /* synopsis */ | 115 /* synopsis */ |
108 TextWidgets::SelectableTextParagraph* synopsis = new TextWidgets::SelectableTextParagraph( | 116 TextWidgets::SelectableTextParagraph* synopsis = new TextWidgets::SelectableTextParagraph( |
109 "Synopsis", QString::fromUtf8(anime.GetSynopsis().c_str()), main_information_widget); | 117 tr("Synopsis"), QString::fromUtf8(anime.GetSynopsis().c_str()), main_information_widget); |
110 | 118 |
111 synopsis->GetParagraph()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); | 119 synopsis->GetParagraph()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); |
112 main_information_widget->layout()->addWidget(synopsis); | 120 main_information_widget->layout()->addWidget(synopsis); |
113 | 121 |
114 QWidget* settings_widget = new QWidget(tabbed_widget); | 122 QWidget* settings_widget = new QWidget(tabbed_widget); |
176 /* Episodes watched section */ | 184 /* Episodes watched section */ |
177 CREATE_SUBSECTION({ | 185 CREATE_SUBSECTION({ |
178 subsection->layout()->addWidget(new QLabel(tr("Episodes watched:"), subsection)); | 186 subsection->layout()->addWidget(new QLabel(tr("Episodes watched:"), subsection)); |
179 | 187 |
180 QSpinBox* spin_box = new QSpinBox(subsection); | 188 QSpinBox* spin_box = new QSpinBox(subsection); |
189 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { | |
190 progress = i; | |
191 }); | |
181 spin_box->setRange(0, anime.GetEpisodes()); | 192 spin_box->setRange(0, anime.GetEpisodes()); |
182 spin_box->setSingleStep(1); | 193 spin_box->setSingleStep(1); |
183 spin_box->setValue(anime.GetUserProgress()); | 194 spin_box->setValue(progress = anime.GetUserProgress()); |
184 subsection->layout()->addWidget(spin_box); | 195 subsection->layout()->addWidget(spin_box); |
185 }); | 196 }); |
186 CREATE_SUBSECTION({ | 197 CREATE_SUBSECTION({ |
187 subsection->layout()->addWidget(new QLabel(tr(" "), subsection)); | 198 subsection->layout()->addWidget(new QLabel(tr(" "), subsection)); |
188 | 199 |
189 QCheckBox* rewatched_checkbox = new QCheckBox("Rewatching"); | 200 QCheckBox* checkbox = new QCheckBox(tr("Rewatching")); |
190 subsection->layout()->addWidget(rewatched_checkbox); | 201 connect(checkbox, QOverload<int>::of(&QCheckBox::stateChanged), this, [this](int state) { |
202 rewatching = (state == Qt::Checked); | |
203 }); | |
204 checkbox->setCheckState(anime.GetUserIsRewatching() ? Qt::Checked : Qt::Unchecked); | |
205 subsection->layout()->addWidget(checkbox); | |
191 }); | 206 }); |
192 }); | 207 }); |
193 CREATE_SECTION(sg_anime_list_content, { | 208 CREATE_SECTION(sg_anime_list_content, { |
194 /* Status & score section */ | 209 /* Status & score section */ |
195 CREATE_SUBSECTION({ | 210 CREATE_SUBSECTION({ |
199 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++) | 214 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++) |
200 string_list.append(QString::fromStdString(Translate::ToString(Anime::ListStatuses[i]))); | 215 string_list.append(QString::fromStdString(Translate::ToString(Anime::ListStatuses[i]))); |
201 | 216 |
202 QComboBox* combo_box = new QComboBox(subsection); | 217 QComboBox* combo_box = new QComboBox(subsection); |
203 combo_box->addItems(string_list); | 218 combo_box->addItems(string_list); |
219 connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this](int i) { | |
220 status = Anime::ListStatuses[i]; | |
221 }); | |
222 combo_box->setCurrentIndex(static_cast<int>(status = anime.GetUserStatus())-1); | |
204 subsection->layout()->addWidget(combo_box); | 223 subsection->layout()->addWidget(combo_box); |
205 }); | 224 }); |
206 CREATE_SUBSECTION({ | 225 CREATE_SUBSECTION({ |
207 subsection->layout()->addWidget(new QLabel(tr("Score:"), subsection)); | 226 subsection->layout()->addWidget(new QLabel(tr("Score:"), subsection)); |
208 | 227 |
209 QSpinBox* spin_box = new QSpinBox(subsection); | 228 QSpinBox* spin_box = new QSpinBox(subsection); |
229 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { | |
230 score = i; | |
231 }); | |
210 spin_box->setRange(0, 100); | 232 spin_box->setRange(0, 100); |
211 spin_box->setSingleStep(5); | 233 spin_box->setSingleStep(5); |
212 spin_box->setValue(anime.GetUserScore()); | 234 spin_box->setValue(score = anime.GetUserScore()); |
213 subsection->layout()->addWidget(spin_box); | 235 subsection->layout()->addWidget(spin_box); |
214 }); | 236 }); |
215 }); | 237 }); |
216 CREATE_FULL_WIDTH_SECTION(sg_anime_list_content, { | 238 CREATE_FULL_WIDTH_SECTION(sg_anime_list_content, { |
217 /* Notes section */ | 239 /* Notes section */ |
218 CREATE_FULL_WIDTH_SUBSECTION({ | 240 CREATE_FULL_WIDTH_SUBSECTION({ |
219 subsection->layout()->addWidget(new QLabel(tr("Notes:"), subsection)); | 241 subsection->layout()->addWidget(new QLabel(tr("Notes:"), subsection)); |
220 | 242 |
221 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection); | 243 QLineEdit* line_edit = new QLineEdit(subsection); |
244 connect(line_edit, &QLineEdit::textChanged, this, [this](const QString& text) { | |
245 /* this sucks but I don't really want to implement anything smarter :) */ | |
246 notes = text.toStdString(); | |
247 }); | |
248 line_edit->setText(QString::fromStdString(notes = anime.GetUserNotes())); | |
222 line_edit->setPlaceholderText(tr("Enter your notes about this anime")); | 249 line_edit->setPlaceholderText(tr("Enter your notes about this anime")); |
223 subsection->layout()->addWidget(line_edit); | 250 subsection->layout()->addWidget(line_edit); |
224 }); | 251 }); |
225 }); | 252 }); |
226 CREATE_SECTION(sg_anime_list_content, { | 253 CREATE_SECTION(sg_anime_list_content, { |
227 /* Dates section */ | 254 /* Dates section */ |
228 CREATE_SUBSECTION({ | 255 CREATE_SUBSECTION({ |
229 subsection->layout()->addWidget(new QLabel(tr("Date started:"), subsection)); | 256 subsection->layout()->addWidget(new QLabel(tr("Date started:"), subsection)); |
230 | 257 |
231 OptionalDate* date = new OptionalDate(true, subsection); | 258 OptionalDate* date = new OptionalDate(true, subsection); |
232 date->SetDate(QDate(2000, 1, 1)); | 259 connect(date, &OptionalDate::DataChanged, this, [this](bool enabled, Date date) { |
260 started = (enabled) ? date : Date(); | |
261 }); | |
262 started = anime.GetUserDateStarted(); | |
263 if (!started.IsValid()) { | |
264 date->SetEnabled(false); | |
265 started = anime.GetAirDate(); | |
266 } | |
267 date->SetDate(started); | |
233 subsection->layout()->addWidget(date); | 268 subsection->layout()->addWidget(date); |
234 }); | 269 }); |
235 CREATE_SUBSECTION({ | 270 CREATE_SUBSECTION({ |
236 subsection->layout()->addWidget(new QLabel(tr("Date completed:"), subsection)); | 271 subsection->layout()->addWidget(new QLabel(tr("Date completed:"), subsection)); |
237 | 272 |
238 OptionalDate* date = new OptionalDate(true, subsection); | 273 OptionalDate* date = new OptionalDate(true, subsection); |
239 date->SetDate(QDate(2000, 1, 1)); | 274 connect(date, &OptionalDate::DataChanged, this, [this](bool enabled, Date date) { |
275 completed = (enabled) ? date : Date(); | |
276 }); | |
277 completed = anime.GetUserDateCompleted(); | |
278 if (!completed.IsValid()) { | |
279 date->SetEnabled(false); | |
280 completed = anime.GetAirDate(); | |
281 } | |
282 date->SetDate(completed); | |
240 subsection->layout()->addWidget(date); | 283 subsection->layout()->addWidget(date); |
241 }); | 284 }); |
242 }); | 285 }); |
243 | 286 |
244 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); | 287 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); |
257 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection); | 300 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection); |
258 line_edit->setPlaceholderText( | 301 line_edit->setPlaceholderText( |
259 tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)")); | 302 tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)")); |
260 subsection->layout()->addWidget(line_edit); | 303 subsection->layout()->addWidget(line_edit); |
261 | 304 |
262 QCheckBox* checkbox = new QCheckBox("Use the first alternative title to search for torrents"); | 305 QCheckBox* checkbox = new QCheckBox(tr("Use the first alternative title to search for torrents")); |
263 subsection->layout()->addWidget(checkbox); | 306 subsection->layout()->addWidget(checkbox); |
264 }); | 307 }); |
265 }); | 308 }); |
266 #undef CREATE_SECTION | 309 #undef CREATE_SECTION |
267 #undef CREATE_SUBSECTION | 310 #undef CREATE_SUBSECTION |
268 #undef CREATE_FULL_WIDTH_SECTION | 311 #undef CREATE_FULL_WIDTH_SECTION |
269 #undef CREATE_FULL_WIDTH_SUBSECTION | 312 #undef CREATE_FULL_WIDTH_SUBSECTION |
270 | 313 |
271 static_cast<QBoxLayout*>(settings_widget->layout())->addStretch(); | 314 static_cast<QBoxLayout*>(settings_widget->layout())->addStretch(); |
272 | 315 |
273 tabbed_widget->addTab(main_information_widget, "Main information"); | 316 tabbed_widget->addTab(main_information_widget, tr("Main information")); |
274 tabbed_widget->addTab(settings_widget, "My list and settings"); | 317 tabbed_widget->addTab(settings_widget, tr("My list and settings")); |
275 | 318 |
276 QVBoxLayout* main_layout = new QVBoxLayout; | 319 QVBoxLayout* main_layout = new QVBoxLayout; |
277 main_layout->addWidget(anime_title); | 320 main_layout->addWidget(anime_title); |
278 main_layout->addWidget(tabbed_widget); | 321 main_layout->addWidget(tabbed_widget); |
279 main_layout->setMargin(0); | 322 main_layout->setMargin(0); |
284 layout->addWidget(main_widget); | 327 layout->addWidget(main_widget); |
285 widget->setLayout(layout); | 328 widget->setLayout(layout); |
286 | 329 |
287 QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); | 330 QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); |
288 connect(button_box, &QDialogButtonBox::accepted, this, [this, accept] { | 331 connect(button_box, &QDialogButtonBox::accepted, this, [this, accept] { |
332 SaveData(); | |
289 accept(); | 333 accept(); |
290 QDialog::accept(); | 334 QDialog::accept(); |
291 }); | 335 }); |
292 connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); | 336 connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); |
293 | 337 |