comparison src/gui/dialog/information.cpp @ 47:d8eb763e6661

information.cpp: add widgets to the list tab, and add an "optional date" widget like taiga has so users can specify whether to set the date or not
author Paper <mrpapersonic@gmail.com>
date Mon, 25 Sep 2023 00:43:38 -0400
parents d0adc4aedfc8
children 75c804f713b2
comparison
equal deleted inserted replaced
46:d0adc4aedfc8 47:d8eb763e6661
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/anime_db.h"
3 #include "core/array.h" 4 #include "core/array.h"
4 #include "core/strings.h" 5 #include "core/strings.h"
5 #include "gui/pages/anime_list.h" 6 #include "gui/pages/anime_list.h"
6 #include "gui/translate/anime.h" 7 #include "gui/translate/anime.h"
7 #include "gui/widgets/text.h" 8 #include "gui/widgets/text.h"
9 #include "gui/widgets/optional_date.h"
8 #include "gui/window.h" 10 #include "gui/window.h"
9 #include <QCheckBox> 11 #include <QCheckBox>
10 #include <QComboBox> 12 #include <QComboBox>
13 #include <QDateEdit>
11 #include <QDebug> 14 #include <QDebug>
12 #include <QDialogButtonBox> 15 #include <QDialogButtonBox>
13 #include <QLineEdit> 16 #include <QLineEdit>
14 #include <QPlainTextEdit> 17 #include <QPlainTextEdit>
15 #include <QSpinBox> 18 #include <QSpinBox>
18 #include <QVBoxLayout> 21 #include <QVBoxLayout>
19 #include <functional> 22 #include <functional>
20 23
21 /* 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,
22 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() {
27 Anime::Anime& anime = Anime::db.items[id];
28 }
29
23 InformationDialog::InformationDialog(const Anime::Anime& anime, std::function<void()> accept, QWidget* parent) 30 InformationDialog::InformationDialog(const Anime::Anime& anime, std::function<void()> accept, QWidget* parent)
24 : QDialog(parent) { 31 : QDialog(parent) {
25 setFixedSize(842, 613); 32 setFixedSize(842, 613);
26 setWindowTitle(tr("Anime Information")); 33 setWindowTitle(tr("Anime Information"));
27 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint); 34 setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
114 settings_widget->layout()->addWidget(sg_anime_list_content); 121 settings_widget->layout()->addWidget(sg_anime_list_content);
115 sg_anime_list_content->setLayout(new QVBoxLayout); 122 sg_anime_list_content->setLayout(new QVBoxLayout);
116 sg_anime_list_content->layout()->setSpacing(5); 123 sg_anime_list_content->layout()->setSpacing(5);
117 sg_anime_list_content->layout()->setContentsMargins(12, 0, 0, 0); 124 sg_anime_list_content->layout()->setContentsMargins(12, 0, 0, 0);
118 125
119 /* Note: PLEASE find a way we can consolidate these. By ANY other means than 126 /* these macros make this a lot easier to edit */
120 putting them in a separate function. Macros are very much preferred. */ 127 #define LAYOUT_HORIZ_SPACING 25
121 #define LAYOUT_HORIZ_SPACING 9 128 #define LAYOUT_VERT_SPACING 5
122 #define LAYOUT_VERT_SPACING 5 129 #define LAYOUT_ITEM_WIDTH 175
123 { 130 /* Creates a subsection with a width of 175 */
131 #define CREATE_SUBSECTION(x) \
132 { \
133 QWidget* subsection = new QWidget(section); \
134 subsection->setLayout(new QVBoxLayout); \
135 subsection->setFixedWidth(LAYOUT_ITEM_WIDTH); \
136 subsection->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); \
137 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING); \
138 subsection->layout()->setMargin(0); \
139 x; \
140 layout->addWidget(subsection); \
141 }
142 /* Creates a section in the parent `a` */
143 #define CREATE_SECTION(a, x) \
144 { \
145 QWidget* section = new QWidget(a); \
146 QHBoxLayout* layout = new QHBoxLayout(section); \
147 layout->setSpacing(LAYOUT_HORIZ_SPACING); \
148 layout->setMargin(0); \
149 x; \
150 layout->addStretch(); \
151 a->layout()->addWidget(section); \
152 }
153 /* Creates a subsection that takes up whatever space is necessary */
154 #define CREATE_FULL_WIDTH_SUBSECTION(x) \
155 { \
156 QWidget* subsection = new QWidget(section); \
157 subsection->setLayout(new QVBoxLayout); \
158 subsection->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); \
159 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING); \
160 subsection->layout()->setMargin(0); \
161 x; \
162 layout->addWidget(subsection); \
163 }
164 /* Creates a section in the parent `a` */
165 #define CREATE_FULL_WIDTH_SECTION(a, x) \
166 { \
167 QWidget* section = new QWidget(a); \
168 QHBoxLayout* layout = new QHBoxLayout(section); \
169 layout->setSpacing(LAYOUT_HORIZ_SPACING); \
170 layout->setMargin(0); \
171 x; \
172 a->layout()->addWidget(section); \
173 }
174
175 CREATE_SECTION(sg_anime_list_content, {
124 /* Episodes watched section */ 176 /* Episodes watched section */
125 QWidget* section = new QWidget(sg_anime_list_content); 177 CREATE_SUBSECTION({
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)); 178 subsection->layout()->addWidget(new QLabel(tr("Episodes watched:"), subsection));
137 179
138 QSpinBox* spin_box = new QSpinBox(subsection); 180 QSpinBox* spin_box = new QSpinBox(subsection);
139 spin_box->setRange(0, anime.GetEpisodes()); 181 spin_box->setRange(0, anime.GetEpisodes());
140 spin_box->setSingleStep(1); 182 spin_box->setSingleStep(1);
141 spin_box->setValue(anime.GetUserProgress()); 183 spin_box->setValue(anime.GetUserProgress());
142 subsection->layout()->addWidget(spin_box); 184 subsection->layout()->addWidget(spin_box);
143 185 });
144 layout->addWidget(subsection); 186 CREATE_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)); 187 subsection->layout()->addWidget(new QLabel(tr(" "), subsection));
153 188
154 QCheckBox* rewatched_checkbox = new QCheckBox("Rewatching"); 189 QCheckBox* rewatched_checkbox = new QCheckBox("Rewatching");
155 subsection->layout()->addWidget(rewatched_checkbox); 190 subsection->layout()->addWidget(rewatched_checkbox);
156 191 });
157 layout->addWidget(subsection); 192 });
158 } 193 CREATE_SECTION(sg_anime_list_content, {
159 sg_anime_list_content->layout()->addWidget(section);
160 }
161 {
162 /* Status & score section */ 194 /* Status & score section */
163 QWidget* section = new QWidget(sg_anime_list_content); 195 CREATE_SUBSECTION({
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)); 196 subsection->layout()->addWidget(new QLabel(tr("Status:"), subsection));
175 197
176 QStringList string_list; 198 QStringList string_list;
177 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++) 199 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++)
178 string_list.append(QString::fromStdString(Translate::ToString(Anime::ListStatuses[i]))); 200 string_list.append(QString::fromStdString(Translate::ToString(Anime::ListStatuses[i])));
179 201
180 QComboBox* combo_box = new QComboBox(subsection); 202 QComboBox* combo_box = new QComboBox(subsection);
181 combo_box->addItems(string_list); 203 combo_box->addItems(string_list);
182 subsection->layout()->addWidget(combo_box); 204 subsection->layout()->addWidget(combo_box);
183 205 });
184 layout->addWidget(subsection); 206 CREATE_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)); 207 subsection->layout()->addWidget(new QLabel(tr("Score:"), subsection));
193 208
194 QSpinBox* spin_box = new QSpinBox(subsection); 209 QSpinBox* spin_box = new QSpinBox(subsection);
195 spin_box->setRange(0, 100); 210 spin_box->setRange(0, 100);
196 spin_box->setSingleStep(5); 211 spin_box->setSingleStep(5);
197 spin_box->setValue(anime.GetUserScore()); 212 spin_box->setValue(anime.GetUserScore());
198 subsection->layout()->addWidget(spin_box); 213 subsection->layout()->addWidget(spin_box);
199 214 });
200 layout->addWidget(subsection); 215 });
201 } 216 CREATE_FULL_WIDTH_SECTION(sg_anime_list_content, {
202 sg_anime_list_content->layout()->addWidget(section);
203 }
204 {
205 /* Notes section */ 217 /* Notes section */
206 QWidget* section = new QWidget(sg_anime_list_content); 218 CREATE_FULL_WIDTH_SUBSECTION({
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)); 219 subsection->layout()->addWidget(new QLabel(tr("Notes:"), subsection));
218 220
219 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection); 221 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection);
220 line_edit->setPlaceholderText(tr("Enter your notes about this anime")); 222 line_edit->setPlaceholderText(tr("Enter your notes about this anime"));
221 subsection->layout()->addWidget(line_edit); 223 subsection->layout()->addWidget(line_edit);
222 224 });
223 layout->addWidget(subsection); 225 });
224 } 226 CREATE_SECTION(sg_anime_list_content, {
225 sg_anime_list_content->layout()->addWidget(section); 227 /* Dates section */
226 } 228 CREATE_SUBSECTION({
229 subsection->layout()->addWidget(new QLabel(tr("Date started:"), subsection));
230
231 OptionalDate* date = new OptionalDate(true, subsection);
232 date->SetDate(QDate(2000, 1, 1));
233 subsection->layout()->addWidget(date);
234 });
235 CREATE_SUBSECTION({
236 subsection->layout()->addWidget(new QLabel(tr("Date completed:"), subsection));
237
238 OptionalDate* date = new OptionalDate(true, subsection);
239 date->SetDate(QDate(2000, 1, 1));
240 subsection->layout()->addWidget(date);
241 });
242 });
227 243
228 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); 244 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget));
229 245
230 QWidget* sg_local_content = new QWidget(settings_widget); 246 QWidget* sg_local_content = new QWidget(settings_widget);
231 settings_widget->layout()->addWidget(sg_local_content); 247 settings_widget->layout()->addWidget(sg_local_content);
232 sg_local_content->setLayout(new QVBoxLayout); 248 sg_local_content->setLayout(new QVBoxLayout);
233 sg_local_content->layout()->setSpacing(5); 249 sg_local_content->layout()->setSpacing(5);
234 sg_local_content->layout()->setContentsMargins(12, 0, 0, 0); 250 sg_local_content->layout()->setContentsMargins(12, 0, 0, 0);
235 251
236 { 252 CREATE_FULL_WIDTH_SECTION(sg_local_content, {
237 /* Alternative titles */ 253 /* Alternative titles */
238 QWidget* section = new QWidget(sg_local_content); 254 CREATE_FULL_WIDTH_SUBSECTION({
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)); 255 subsection->layout()->addWidget(new QLabel(tr("Alternative titles:"), subsection));
250 256
251 QLineEdit* line_edit = new QLineEdit(QString::fromStdString(anime.GetUserNotes()), subsection); 257 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)")); 258 line_edit->setPlaceholderText(
259 tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)"));
253 subsection->layout()->addWidget(line_edit); 260 subsection->layout()->addWidget(line_edit);
254 261
255 QCheckBox* checkbox = new QCheckBox("Use the first alternative title to search for torrents"); 262 QCheckBox* checkbox = new QCheckBox("Use the first alternative title to search for torrents");
256 subsection->layout()->addWidget(checkbox); 263 subsection->layout()->addWidget(checkbox);
257 264 });
258 layout->addWidget(subsection); 265 });
259 } 266 #undef CREATE_SECTION
260 sg_local_content->layout()->addWidget(section); 267 #undef CREATE_SUBSECTION
261 } 268 #undef CREATE_FULL_WIDTH_SECTION
269 #undef CREATE_FULL_WIDTH_SUBSECTION
262 270
263 static_cast<QBoxLayout*>(settings_widget->layout())->addStretch(); 271 static_cast<QBoxLayout*>(settings_widget->layout())->addStretch();
264 272
265 tabbed_widget->addTab(main_information_widget, "Main information"); 273 tabbed_widget->addTab(main_information_widget, "Main information");
266 tabbed_widget->addTab(settings_widget, "My list and settings"); 274 tabbed_widget->addTab(settings_widget, "My list and settings");