comparison src/gui/dialog/information.cpp @ 68:2417121d894e

*: normalize usage of layouts before, I used them two ways, once was by setting the layout later by using setLayout(QWidget), and the other was just using the constructor. I find the constructor to be easier to read, so I chose that one.
author Paper <mrpapersonic@gmail.com>
date Mon, 02 Oct 2023 21:33:25 -0400
parents 6481c5aed3e1
children 27a19dd6cba1
comparison
equal deleted inserted replaced
67:442065432549 68:2417121d894e
55 QVBoxLayout* sidebar_layout = new QVBoxLayout(sidebar); 55 QVBoxLayout* sidebar_layout = new QVBoxLayout(sidebar);
56 Poster* poster = new Poster(anime.GetId(), sidebar); 56 Poster* poster = new Poster(anime.GetId(), sidebar);
57 sidebar_layout->addWidget(poster); 57 sidebar_layout->addWidget(poster);
58 sidebar_layout->setContentsMargins(0, 0, 0, 0); 58 sidebar_layout->setContentsMargins(0, 0, 0, 0);
59 sidebar_layout->addStretch(); 59 sidebar_layout->addStretch();
60 sidebar->setFixedWidth(175);
61 60
62 /* main widget */ 61 /* main widget */
63 QWidget* main_widget = new QWidget(widget); 62 QWidget* main_widget = new QWidget(widget);
64 63
65 { 64 {
81 80
82 /* main info tab */ 81 /* main info tab */
83 AnimeInfoWidget* main_information_widget = new AnimeInfoWidget(anime, tabbed_widget); 82 AnimeInfoWidget* main_information_widget = new AnimeInfoWidget(anime, tabbed_widget);
84 83
85 QWidget* settings_widget = new QWidget(tabbed_widget); 84 QWidget* settings_widget = new QWidget(tabbed_widget);
86 settings_widget->setLayout(new QVBoxLayout);
87 settings_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); 85 settings_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
88 86
89 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Anime list"), settings_widget)); 87 QVBoxLayout* settings_layout = new QVBoxLayout(settings_widget);
88 settings_layout->addWidget(new TextWidgets::Header(tr("Anime list"), settings_widget));
90 89
91 QWidget* sg_anime_list_content = new QWidget(settings_widget); 90 QWidget* sg_anime_list_content = new QWidget(settings_widget);
92 settings_widget->layout()->addWidget(sg_anime_list_content); 91
93 sg_anime_list_content->setLayout(new QVBoxLayout); 92 QVBoxLayout* al_layout = new QVBoxLayout(sg_anime_list_content);
94 sg_anime_list_content->layout()->setSpacing(5); 93 al_layout->setSpacing(5);
95 sg_anime_list_content->layout()->setContentsMargins(12, 0, 0, 0); 94 al_layout->setContentsMargins(12, 0, 0, 0);
96 95
97 /* these macros make this a lot easier to edit */
98 #define LAYOUT_HORIZ_SPACING 25 96 #define LAYOUT_HORIZ_SPACING 25
99 #define LAYOUT_VERT_SPACING 5 97 #define LAYOUT_VERT_SPACING 5
100 #define LAYOUT_ITEM_WIDTH 175 98 #define LAYOUT_ITEM_WIDTH 175
101 /* Creates a subsection that takes up whatever space is necessary */ 99 /* Creates a subsection that takes up whatever space is necessary */
102 #define CREATE_FULL_WIDTH_SUBSECTION(x) \ 100 #define CREATE_FULL_WIDTH_SUBSECTION(x) \
103 { \ 101 { \
104 QWidget* subsection = new QWidget(section); \ 102 QWidget* subsection = new QWidget(section); \
105 subsection->setLayout(new QVBoxLayout); \
106 subsection->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); \ 103 subsection->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); \
107 subsection->layout()->setSpacing(LAYOUT_VERT_SPACING); \ 104 QVBoxLayout* subsection_layout = new QVBoxLayout(subsection); \
108 subsection->layout()->setContentsMargins(0, 0, 0, 0); \ 105 subsection_layout->setSpacing(LAYOUT_VERT_SPACING); \
106 subsection_layout->setContentsMargins(0, 0, 0, 0); \
109 x; \ 107 x; \
110 layout->addWidget(subsection); \ 108 layout->addWidget(subsection); \
111 } 109 }
112
113 /* Creates a subsection with a width of 175 */
114 #define CREATE_SUBSECTION(x) CREATE_FULL_WIDTH_SUBSECTION(x subsection->setFixedWidth(LAYOUT_ITEM_WIDTH);)
115 110
116 /* Creates a section in the parent `a` */ 111 /* Creates a section in the parent `a` */
117 #define CREATE_FULL_WIDTH_SECTION(a, x) \ 112 #define CREATE_FULL_WIDTH_SECTION(a, x) \
118 { \ 113 { \
119 QWidget* section = new QWidget(a); \ 114 QWidget* section = new QWidget(a); \
122 layout->setContentsMargins(0, 0, 0, 0); \ 117 layout->setContentsMargins(0, 0, 0, 0); \
123 x; \ 118 x; \
124 a->layout()->addWidget(section); \ 119 a->layout()->addWidget(section); \
125 } 120 }
126 121
122 /* Creates a subsection with a width of 175 */
123 #define CREATE_SUBSECTION(x) CREATE_FULL_WIDTH_SUBSECTION(x subsection->setFixedWidth(LAYOUT_ITEM_WIDTH);)
127 /* Creates a section in the parent `a` */ 124 /* Creates a section in the parent `a` */
128 #define CREATE_SECTION(a, x) CREATE_FULL_WIDTH_SECTION(a, x layout->addStretch();) 125 #define CREATE_SECTION(a, x) CREATE_FULL_WIDTH_SECTION(a, x layout->addStretch();)
129 126
130 CREATE_SECTION(sg_anime_list_content, { 127 CREATE_SECTION(sg_anime_list_content, {
131 /* Episodes watched section */ 128 /* Episodes watched section */
132 CREATE_SUBSECTION({ 129 CREATE_SUBSECTION({
133 subsection->layout()->addWidget(new QLabel(tr("Episodes watched:"), subsection)); 130 subsection_layout->addWidget(new QLabel(tr("Episodes watched:"), subsection));
134 131
135 QSpinBox* spin_box = new QSpinBox(subsection); 132 QSpinBox* spin_box = new QSpinBox(subsection);
136 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { progress = i; }); 133 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { progress = i; });
137 spin_box->setRange(0, anime.GetEpisodes()); 134 spin_box->setRange(0, anime.GetEpisodes());
138 spin_box->setSingleStep(1); 135 spin_box->setSingleStep(1);
139 spin_box->setValue(progress = anime.GetUserProgress()); 136 spin_box->setValue(progress = anime.GetUserProgress());
140 subsection->layout()->addWidget(spin_box); 137 subsection_layout->addWidget(spin_box);
141 }); 138 });
142 CREATE_SUBSECTION({ 139 CREATE_SUBSECTION({
143 subsection->layout()->addWidget(new QLabel(tr(" "), subsection)); 140 subsection_layout->addWidget(new QLabel(tr(" "), subsection));
144 141
145 QCheckBox* checkbox = new QCheckBox(tr("Rewatching")); 142 QCheckBox* checkbox = new QCheckBox(tr("Rewatching"));
146 connect(checkbox, QOverload<int>::of(&QCheckBox::stateChanged), this, 143 connect(checkbox, QOverload<int>::of(&QCheckBox::stateChanged), this,
147 [this](int state) { rewatching = (state == Qt::Checked); }); 144 [this](int state) { rewatching = (state == Qt::Checked); });
148 checkbox->setCheckState(anime.GetUserIsRewatching() ? Qt::Checked : Qt::Unchecked); 145 checkbox->setCheckState(anime.GetUserIsRewatching() ? Qt::Checked : Qt::Unchecked);
149 subsection->layout()->addWidget(checkbox); 146 subsection_layout->addWidget(checkbox);
150 }); 147 });
151 }); 148 });
152 CREATE_SECTION(sg_anime_list_content, { 149 CREATE_SECTION(sg_anime_list_content, {
153 /* Status & score section */ 150 /* Status & score section */
154 CREATE_SUBSECTION({ 151 CREATE_SUBSECTION({
155 subsection->layout()->addWidget(new QLabel(tr("Status:"), subsection)); 152 subsection_layout->addWidget(new QLabel(tr("Status:"), subsection));
156 153
157 QStringList string_list; 154 QStringList string_list;
158 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++) 155 for (unsigned int i = 0; i < ARRAYSIZE(Anime::ListStatuses); i++)
159 string_list.append(Strings::ToQString(Translate::ToString(Anime::ListStatuses[i]))); 156 string_list.append(Strings::ToQString(Translate::ToString(Anime::ListStatuses[i])));
160 157
161 QComboBox* combo_box = new QComboBox(subsection); 158 QComboBox* combo_box = new QComboBox(subsection);
162 combo_box->addItems(string_list); 159 combo_box->addItems(string_list);
163 connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged), this, 160 connect(combo_box, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
164 [this](int i) { status = Anime::ListStatuses[i]; }); 161 [this](int i) { status = Anime::ListStatuses[i]; });
165 combo_box->setCurrentIndex(static_cast<int>(status = anime.GetUserStatus()) - 1); 162 combo_box->setCurrentIndex(static_cast<int>(status = anime.GetUserStatus()) - 1);
166 subsection->layout()->addWidget(combo_box); 163 subsection_layout->addWidget(combo_box);
167 }); 164 });
168 CREATE_SUBSECTION({ 165 CREATE_SUBSECTION({
169 subsection->layout()->addWidget(new QLabel(tr("Score:"), subsection)); 166 subsection_layout->addWidget(new QLabel(tr("Score:"), subsection));
170 167
171 QSpinBox* spin_box = new QSpinBox(subsection); 168 QSpinBox* spin_box = new QSpinBox(subsection);
172 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { score = i; }); 169 connect(spin_box, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int i) { score = i; });
173 spin_box->setRange(0, 100); 170 spin_box->setRange(0, 100);
174 spin_box->setSingleStep(5); 171 spin_box->setSingleStep(5);
175 spin_box->setValue(score = anime.GetUserScore()); 172 spin_box->setValue(score = anime.GetUserScore());
176 subsection->layout()->addWidget(spin_box); 173 subsection_layout->addWidget(spin_box);
177 }); 174 });
178 }); 175 });
179 CREATE_FULL_WIDTH_SECTION(sg_anime_list_content, { 176 CREATE_FULL_WIDTH_SECTION(sg_anime_list_content, {
180 /* Notes section */ 177 /* Notes section */
181 CREATE_FULL_WIDTH_SUBSECTION({ 178 CREATE_FULL_WIDTH_SUBSECTION({
182 subsection->layout()->addWidget(new QLabel(tr("Notes:"), subsection)); 179 subsection_layout->addWidget(new QLabel(tr("Notes:"), subsection));
183 180
184 QLineEdit* line_edit = new QLineEdit(subsection); 181 QLineEdit* line_edit = new QLineEdit(subsection);
185 connect(line_edit, &QLineEdit::textChanged, this, [this](const QString& text) { 182 connect(line_edit, &QLineEdit::textChanged, this, [this](const QString& text) {
186 /* this sucks but I don't really want to implement anything smarter :) */ 183 /* this sucks but I don't really want to implement anything smarter :) */
187 notes = Strings::ToUtf8String(text); 184 notes = Strings::ToUtf8String(text);
188 }); 185 });
189 line_edit->setText(Strings::ToQString(notes = anime.GetUserNotes())); 186 line_edit->setText(Strings::ToQString(notes = anime.GetUserNotes()));
190 line_edit->setPlaceholderText(tr("Enter your notes about this anime")); 187 line_edit->setPlaceholderText(tr("Enter your notes about this anime"));
191 subsection->layout()->addWidget(line_edit); 188 subsection_layout->addWidget(line_edit);
192 }); 189 });
193 }); 190 });
194 CREATE_SECTION(sg_anime_list_content, { 191 CREATE_SECTION(sg_anime_list_content, {
195 /* Dates section */ 192 /* Dates section */
196 CREATE_SUBSECTION({ 193 CREATE_SUBSECTION({
197 subsection->layout()->addWidget(new QLabel(tr("Date started:"), subsection)); 194 subsection_layout->addWidget(new QLabel(tr("Date started:"), subsection));
198 195
199 OptionalDate* date = new OptionalDate(true, subsection); 196 OptionalDate* date = new OptionalDate(true, subsection);
200 connect(date, &OptionalDate::DataChanged, this, 197 connect(date, &OptionalDate::DataChanged, this,
201 [this](bool enabled, Date date) { started = (enabled) ? date : Date(); }); 198 [this](bool enabled, Date date) { started = (enabled) ? date : Date(); });
202 started = anime.GetUserDateStarted(); 199 started = anime.GetUserDateStarted();
203 if (!started.IsValid()) { 200 if (!started.IsValid()) {
204 date->SetEnabled(false); 201 date->SetEnabled(false);
205 started = anime.GetAirDate(); 202 started = anime.GetAirDate();
206 } 203 }
207 date->SetDate(started); 204 date->SetDate(started);
208 subsection->layout()->addWidget(date); 205 subsection_layout->addWidget(date);
209 }); 206 });
210 CREATE_SUBSECTION({ 207 CREATE_SUBSECTION({
211 subsection->layout()->addWidget(new QLabel(tr("Date completed:"), subsection)); 208 subsection_layout->addWidget(new QLabel(tr("Date completed:"), subsection));
212 209
213 OptionalDate* date = new OptionalDate(true, subsection); 210 OptionalDate* date = new OptionalDate(true, subsection);
214 connect(date, &OptionalDate::DataChanged, this, 211 connect(date, &OptionalDate::DataChanged, this,
215 [this](bool enabled, Date date) { completed = (enabled) ? date : Date(); }); 212 [this](bool enabled, Date date) { completed = (enabled) ? date : Date(); });
216 completed = anime.GetUserDateCompleted(); 213 completed = anime.GetUserDateCompleted();
217 if (!completed.IsValid()) { 214 if (!completed.IsValid()) {
218 date->SetEnabled(false); 215 date->SetEnabled(false);
219 completed = anime.GetAirDate(); 216 completed = anime.GetAirDate();
220 } 217 }
221 date->SetDate(completed); 218 date->SetDate(completed);
222 subsection->layout()->addWidget(date); 219 subsection_layout->addWidget(date);
223 }); 220 });
224 }); 221 });
225 222
226 settings_widget->layout()->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget)); 223 settings_layout->addWidget(sg_anime_list_content);
224
225 settings_layout->addWidget(new TextWidgets::Header(tr("Local settings"), settings_widget));
227 226
228 QWidget* sg_local_content = new QWidget(settings_widget); 227 QWidget* sg_local_content = new QWidget(settings_widget);
229 settings_widget->layout()->addWidget(sg_local_content); 228 QVBoxLayout* sg_local_layout = new QVBoxLayout(sg_local_content);
230 sg_local_content->setLayout(new QVBoxLayout); 229 sg_local_layout->setSpacing(5);
231 sg_local_content->layout()->setSpacing(5); 230 sg_local_layout->setContentsMargins(12, 0, 0, 0);
232 sg_local_content->layout()->setContentsMargins(12, 0, 0, 0);
233 231
234 CREATE_FULL_WIDTH_SECTION(sg_local_content, { 232 CREATE_FULL_WIDTH_SECTION(sg_local_content, {
235 /* Alternative titles */ 233 /* Alternative titles */
236 CREATE_FULL_WIDTH_SUBSECTION({ 234 CREATE_FULL_WIDTH_SUBSECTION({
237 subsection->layout()->addWidget(new QLabel(tr("Alternative titles:"), subsection)); 235 subsection_layout->addWidget(new QLabel(tr("Alternative titles:"), subsection));
238 236
239 QLineEdit* line_edit = new QLineEdit(Strings::ToQString(anime.GetUserNotes()), subsection); 237 QLineEdit* line_edit = new QLineEdit(Strings::ToQString(anime.GetUserNotes()), subsection);
240 line_edit->setPlaceholderText( 238 line_edit->setPlaceholderText(
241 tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)")); 239 tr("Enter alternative titles here, separated by a semicolon (i.e. Title 1; Title 2)"));
242 subsection->layout()->addWidget(line_edit); 240 subsection_layout->addWidget(line_edit);
243 241
244 QCheckBox* checkbox = new QCheckBox(tr("Use the first alternative title to search for torrents")); 242 QCheckBox* checkbox = new QCheckBox(tr("Use the first alternative title to search for torrents"));
245 subsection->layout()->addWidget(checkbox); 243 subsection_layout->addWidget(checkbox);
246 }); 244 });
247 }); 245 });
248 #undef CREATE_SECTION 246 #undef CREATE_SECTION
249 #undef CREATE_SUBSECTION 247 #undef CREATE_SUBSECTION
250 #undef CREATE_FULL_WIDTH_SECTION 248 #undef CREATE_FULL_WIDTH_SECTION
251 #undef CREATE_FULL_WIDTH_SUBSECTION 249 #undef CREATE_FULL_WIDTH_SUBSECTION
252 250
253 reinterpret_cast<QBoxLayout*>(settings_widget->layout())->addStretch(); 251 settings_layout->addWidget(sg_local_content);
252 settings_layout->addStretch();
254 253
255 tabbed_widget->addTab(main_information_widget, tr("Main information")); 254 tabbed_widget->addTab(main_information_widget, tr("Main information"));
256 tabbed_widget->addTab(settings_widget, tr("My list and settings")); 255 tabbed_widget->addTab(settings_widget, tr("My list and settings"));
257 256
258 QVBoxLayout* main_layout = new QVBoxLayout; 257 QVBoxLayout* main_layout = new QVBoxLayout(main_widget);
259 main_layout->addWidget(anime_title); 258 main_layout->addWidget(anime_title);
260 main_layout->addWidget(tabbed_widget); 259 main_layout->addWidget(tabbed_widget);
261 main_layout->setContentsMargins(0, 0, 0, 0); 260 main_layout->setContentsMargins(0, 0, 0, 0);
262 main_widget->setLayout(main_layout); 261
263 262 QHBoxLayout* layout = new QHBoxLayout(widget);
264 QHBoxLayout* layout = new QHBoxLayout;
265 layout->addWidget(sidebar); 263 layout->addWidget(sidebar);
266 layout->addWidget(main_widget); 264 layout->addWidget(main_widget);
267 widget->setLayout(layout); 265 layout->setSpacing(12);
268 266
269 QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); 267 QDialogButtonBox* button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
270 connect(button_box, &QDialogButtonBox::accepted, this, [this, accept] { 268 connect(button_box, &QDialogButtonBox::accepted, this, [this, accept] {
271 SaveData(); 269 SaveData();
272 accept(); 270 accept();
273 QDialog::accept(); 271 QDialog::accept();
274 }); 272 });
275 connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); 273 connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
276 274
277 QVBoxLayout* buttons_layout = new QVBoxLayout; 275 QVBoxLayout* buttons_layout = new QVBoxLayout(this);
278 buttons_layout->addWidget(widget); 276 buttons_layout->addWidget(widget);
279 buttons_layout->addWidget(button_box, 0, Qt::AlignBottom); 277 buttons_layout->addWidget(button_box, 0, Qt::AlignBottom);
280 setLayout(buttons_layout);
281 } 278 }
282 279
283 #include "gui/dialog/moc_information.cpp" 280 #include "gui/dialog/moc_information.cpp"