1 #include <QApplication>
2 #include <QLabel>
3 #include <QStackedWidget>
4 #include <QButtonGroup>
5 
6 #include "qt_options.h"
7 #include "viewoptionsdialog.h"
8 
9 #ifndef CXX_BUILD
10 extern "C" {
11 #endif
12 
13 #include <string/stdstring.h>
14 
15 #include "../../../gfx/video_display_server.h"
16 #include "../../../input/input_driver.h"
17 #include "../../../input/input_remapping.h"
18 #include "../../../network/netplay/netplay.h"
19 #include "../../../retroarch.h"
20 
21 #include "../../../verbosity.h"
22 
23 #ifndef CXX_BUILD
24 }
25 #endif
26 
AchievementsCategory(QWidget * parent)27 AchievementsCategory::AchievementsCategory(QWidget *parent) :
28    OptionsCategory(parent)
29 {
30    setDisplayName(MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS);
31    setCategoryIcon("menu_achievements");
32 }
33 
pages()34 QVector<OptionsPage*> AchievementsCategory::pages()
35 {
36    QVector<OptionsPage*> pages;
37 
38    pages << new AchievementsPage(this);
39 
40    return pages;
41 }
42 
AchievementsPage(QObject * parent)43 AchievementsPage::AchievementsPage(QObject *parent) :
44    OptionsPage(parent)
45 {
46 }
47 
widget()48 QWidget *AchievementsPage::widget()
49 {
50    unsigned i;
51    QWidget               *widget     = new QWidget;
52    QVBoxLayout           *layout     = new QVBoxLayout;
53    enum msg_hash_enums check_setting = MENU_ENUM_LABEL_CHEEVOS_ENABLE;
54    CheckableSettingsGroup *group     = new CheckableSettingsGroup(check_setting);
55    settings_t *settings              = config_get_ptr();
56    file_list_t *list = (file_list_t*)calloc(1, sizeof(*list));
57    menu_displaylist_build_list(list, settings,
58          DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST, true);
59 
60    for (i = 0; i < list->size; i++)
61    {
62       menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
63          file_list_get_actiondata_at_offset(list, i);
64 
65       if (cbs->enum_idx == check_setting)
66          continue;
67 
68       group->add(cbs->enum_idx);
69    }
70 
71    file_list_free(list);
72 
73    layout->addWidget(group);
74 
75    layout->addStretch();
76 
77    widget->setLayout(layout);
78 
79    return widget;
80 }
81 
AudioCategory(QWidget * parent)82 AudioCategory::AudioCategory(QWidget *parent) :
83    OptionsCategory(parent)
84 {
85    setDisplayName(MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS);
86    setCategoryIcon("menu_audio");
87 }
88 
pages()89 QVector<OptionsPage*> AudioCategory::pages()
90 {
91    QVector<OptionsPage*> pages;
92 
93    pages << new AudioPage(this);
94    pages << new MenuSoundsPage(this);
95 
96    return pages;
97 }
98 
AudioPage(QObject * parent)99 AudioPage::AudioPage(QObject *parent) :
100    OptionsPage(parent)
101 {
102 }
103 
widget()104 QWidget *AudioPage::widget()
105 {
106    QWidget *widget                = new QWidget;
107    QVBoxLayout *layout            = new QVBoxLayout;
108    SettingsGroup *outputGroup     = new SettingsGroup("Output");
109    SettingsGroup *resamplerGroup  = new SettingsGroup("Resampler");
110    SettingsGroup *syncGroup       = new SettingsGroup(msg_hash_to_str(
111             MENU_ENUM_LABEL_VALUE_AUDIO_SYNC));
112    SettingsGroup *dspGroup        = new SettingsGroup("DSP plugin");
113    SettingsGroup *volumeGroup     = new SettingsGroup("Volume");
114    QGridLayout *volumeLayout      = new QGridLayout();
115 
116    outputGroup->add(MENU_ENUM_LABEL_AUDIO_ENABLE);
117    outputGroup->add(MENU_ENUM_LABEL_AUDIO_DRIVER);
118    outputGroup->add(MENU_ENUM_LABEL_AUDIO_DEVICE);
119    outputGroup->add(MENU_ENUM_LABEL_AUDIO_LATENCY);
120 
121    resamplerGroup->add(MENU_ENUM_LABEL_AUDIO_RESAMPLER_DRIVER);
122    resamplerGroup->add(MENU_ENUM_LABEL_AUDIO_RESAMPLER_QUALITY);
123    resamplerGroup->add(MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE);
124 
125    syncGroup->add(MENU_ENUM_LABEL_AUDIO_SYNC);
126    syncGroup->add(MENU_ENUM_LABEL_AUDIO_MAX_TIMING_SKEW);
127    syncGroup->add(MENU_ENUM_LABEL_AUDIO_RATE_CONTROL_DELTA);
128 
129    dspGroup->add(MENU_ENUM_LABEL_AUDIO_DSP_PLUGIN);
130 
131    volumeLayout->addWidget(new QLabel(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_VOLUME), widget),
132          1, 1);
133    volumeLayout->addWidget(new CheckableIcon(MENU_ENUM_LABEL_AUDIO_MUTE, qApp->style()->standardIcon(QStyle::SP_MediaVolumeMuted)),
134          1, 2);
135    volumeLayout->addLayout(new FloatSliderAndSpinBox(MENU_ENUM_LABEL_AUDIO_VOLUME),
136          1, 3, 1, 1);
137 
138    volumeLayout->addWidget(new QLabel(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_AUDIO_MIXER_VOLUME), widget),
139          2, 1);
140    volumeLayout->addWidget(new CheckableIcon(MENU_ENUM_LABEL_AUDIO_MIXER_MUTE, qApp->style()->standardIcon(QStyle::SP_MediaVolumeMuted)),
141          2, 2);
142    volumeLayout->addLayout(new FloatSliderAndSpinBox(MENU_ENUM_LABEL_AUDIO_MIXER_VOLUME),
143          2, 3, 1, 1);
144 
145    volumeGroup->addRow(volumeLayout);
146    volumeGroup->add(MENU_ENUM_LABEL_AUDIO_FASTFORWARD_MUTE);
147 
148    layout->addWidget(outputGroup);
149    layout->addWidget(resamplerGroup);
150    layout->addWidget(syncGroup);
151    layout->addWidget(dspGroup);
152    layout->addWidget(volumeGroup);
153 
154    layout->addStretch();
155 
156    widget->setLayout(layout);
157 
158    return widget;
159 }
160 
MenuSoundsPage(QObject * parent)161 MenuSoundsPage::MenuSoundsPage(QObject *parent) :
162    OptionsPage(parent)
163 {
164    setDisplayName(MENU_ENUM_LABEL_VALUE_MENU_SOUNDS);
165 }
166 
widget()167 QWidget *MenuSoundsPage::widget()
168 {
169    return create_widget(DISPLAYLIST_MENU_SOUNDS_LIST);
170 }
171 
InputCategory(QWidget * parent)172 InputCategory::InputCategory(QWidget *parent) :
173    OptionsCategory(parent)
174 {
175    setDisplayName(MENU_ENUM_LABEL_VALUE_INPUT_SETTINGS);
176    setCategoryIcon("core-input-remapping-options");
177 }
178 
pages()179 QVector<OptionsPage*> InputCategory::pages()
180 {
181    QVector<OptionsPage*> pages;
182 
183    pages << new InputPage(this);
184    pages << new HotkeyBindsPage(this);
185 
186    return pages;
187 }
188 
InputPage(QObject * parent)189 InputPage::InputPage(QObject *parent) :
190    OptionsPage(parent)
191 {
192 }
193 
widget()194 QWidget *InputPage::widget()
195 {
196    unsigned i;
197    QWidget *widget       = new QWidget;
198    FormLayout *layout    = new FormLayout;
199    settings_t *settings  = config_get_ptr();
200    file_list_t *list     = (file_list_t*)calloc(1, sizeof(*list));
201 
202    menu_displaylist_build_list(list, settings,
203          DISPLAYLIST_INPUT_SETTINGS_LIST, true);
204 
205    for (i = 0; i < list->size; i++)
206    {
207       menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
208          file_list_get_actiondata_at_offset(list, i);
209 
210       if (cbs->enum_idx == MENU_ENUM_LABEL_INPUT_HOTKEY_BINDS)
211          break;
212 
213       layout->add(cbs->enum_idx);
214    }
215 
216    file_list_free(list);
217 
218    widget->setLayout(layout);
219 
220    return widget;
221 }
222 
HotkeyBindsPage(QObject * parent)223 HotkeyBindsPage::HotkeyBindsPage(QObject *parent) :
224    OptionsPage(parent)
225 {
226    setDisplayName(MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS);
227 }
228 
widget()229 QWidget *HotkeyBindsPage::widget()
230 {
231    unsigned i;
232    QWidget *widget         = new QWidget;
233    QHBoxLayout *layout     = new QHBoxLayout;
234    FormLayout *mainLayout  = new FormLayout;
235    settings_t *settings    = config_get_ptr();
236    file_list_t *list       = (file_list_t*)calloc(1, sizeof(*list));
237 
238    menu_displaylist_build_list(list, settings,
239          DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST, true);
240 
241    for (i = 0; i < list->size; i++)
242    {
243       menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
244          file_list_get_actiondata_at_offset(list, i);
245 
246       mainLayout->add(cbs->enum_idx);
247    }
248 
249    file_list_free(list);
250 
251    layout->addLayout(mainLayout);
252 
253    widget->setLayout(layout);
254 
255    return widget;
256 }
257 
UserBindsPage(QObject * parent)258 UserBindsPage::UserBindsPage(QObject *parent) :
259    OptionsPage(parent)
260 {
261    setDisplayName("User Binds");
262 }
263 
widget()264 QWidget *UserBindsPage::widget()
265 {
266    unsigned p, retro_id;
267    unsigned max_users    = *(input_driver_get_uint(INPUT_ACTION_MAX_USERS));
268    QWidget *widget       = new QWidget;
269    QGridLayout *layout   = new QGridLayout;
270    QComboBox *userCombo  = new QComboBox;
271    QStackedWidget *stack = new QStackedWidget;
272 
273    for (p = 0; p < max_users; p++)
274    {
275       userCombo->addItem(QString::number(p));
276 
277       QWidget *uWidget = new QWidget();
278       FormLayout *form = new FormLayout();
279 
280       for (retro_id = 0; retro_id < RARCH_FIRST_CUSTOM_BIND + 20; retro_id++)
281       {
282          char descriptor[300];
283          const struct retro_keybind *keybind   =
284             &input_config_binds[p][retro_id];
285          const struct retro_keybind *auto_bind =
286             (const struct retro_keybind*)
287             input_config_get_bind_auto(p, retro_id);
288 
289          input_config_get_bind_string(descriptor,
290             keybind, auto_bind, sizeof(descriptor));
291 
292          const struct retro_keybind *keyptr =
293             &input_config_binds[p][retro_id];
294 
295          QString label = msg_hash_to_str(keyptr->enum_idx);
296 
297          form->addRow(QString(msg_hash_to_str(keyptr->enum_idx)),
298                new QPushButton(QString(descriptor)));
299       }
300 
301       uWidget->setLayout(form);
302 
303       stack->addWidget(uWidget);
304    }
305 
306    connect(userCombo, SIGNAL(activated(int)),
307          stack, SLOT(setCurrentIndex(int)));
308 
309    layout->addWidget(userCombo, 0, 0);
310    layout->addWidget(stack, 1, 0);
311 
312    widget->setLayout(layout);
313 
314    return widget;
315 }
316 
LatencyCategory(QWidget * parent)317 LatencyCategory::LatencyCategory(QWidget *parent) :
318    OptionsCategory(parent)
319 {
320    setDisplayName(MENU_ENUM_LABEL_VALUE_LATENCY_SETTINGS);
321    setCategoryIcon("menu_latency");
322 }
323 
pages()324 QVector<OptionsPage*> LatencyCategory::pages()
325 {
326    QVector<OptionsPage*> pages;
327 
328    pages << new LatencyPage(this);
329 
330    return pages;
331 }
332 
LatencyPage(QObject * parent)333 LatencyPage::LatencyPage(QObject *parent) :
334    OptionsPage(parent)
335 {
336 }
337 
widget()338 QWidget *LatencyPage::widget()
339 {
340    QWidget                         *widget = new QWidget;
341    FormLayout                      *layout = new FormLayout;
342    CheckableSettingsGroup *runAheadGpuSync = new CheckableSettingsGroup(MENU_ENUM_LABEL_RUN_AHEAD_ENABLED);
343 
344    rarch_setting_t *hardSyncSetting        = menu_setting_find_enum(MENU_ENUM_LABEL_VIDEO_HARD_SYNC);
345 
346    if (hardSyncSetting)
347    {
348       CheckableSettingsGroup *hardSyncGroup = new CheckableSettingsGroup(hardSyncSetting);
349 
350       hardSyncGroup->add(MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES);
351 
352       layout->addRow(hardSyncGroup);
353    }
354 
355    layout->add(MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES);
356 
357    layout->add(MENU_ENUM_LABEL_VIDEO_FRAME_DELAY);
358    layout->add(MENU_ENUM_LABEL_AUDIO_LATENCY);
359    layout->add(MENU_ENUM_LABEL_INPUT_POLL_TYPE_BEHAVIOR);
360 
361    runAheadGpuSync->add(MENU_ENUM_LABEL_RUN_AHEAD_FRAMES);
362    runAheadGpuSync->add(MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE);
363    runAheadGpuSync->add(MENU_ENUM_LABEL_RUN_AHEAD_HIDE_WARNINGS);
364    layout->addRow(runAheadGpuSync);
365 
366    widget->setLayout(layout);
367 
368    return widget;
369 }
370 
NetworkCategory(QWidget * parent)371 NetworkCategory::NetworkCategory(QWidget *parent) :
372    OptionsCategory(parent)
373 {
374    setDisplayName(MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS);
375    setCategoryIcon("menu_network");
376 }
377 
pages()378 QVector<OptionsPage*> NetworkCategory::pages()
379 {
380    QVector<OptionsPage*> pages;
381 
382    pages << new NetplayPage(this);
383    pages << new UpdaterPage(this);
384 
385    return pages;
386 }
387 
NetplayPage(QObject * parent)388 NetplayPage::NetplayPage(QObject *parent) :
389    OptionsPage(parent)
390 {
391    setDisplayName(MENU_ENUM_LABEL_VALUE_NETPLAY);
392 }
393 
widget()394 QWidget *NetplayPage::widget()
395 {
396    QWidget *widget            = new QWidget;
397    QGridLayout *layout        = new QGridLayout;
398    FormLayout *checksLayout   = new FormLayout;
399    QGroupBox *serverGroup     = new QGroupBox("Server");
400    SettingsGroup *syncGroup   = new SettingsGroup("Synchronization");
401    SettingsGroup *slaveGroup  = new SettingsGroup("Slave-Mode");
402    SettingsGroup *inputGroup  = new SettingsGroup("Input Sharing");
403    SettingsGroup *deviceGroup = new SettingsGroup("Device Request");
404    FormLayout *serverForm     = new FormLayout;
405    QHBoxLayout *serverLayout  = new QHBoxLayout;
406    QVBoxLayout *mainLayout    = new QVBoxLayout;
407    QGridLayout *requestGrid   = new QGridLayout;
408    unsigned i                 = 0;
409    unsigned row               = 0;
410    unsigned column            = 0;
411 
412    checksLayout->add(MENU_ENUM_LABEL_NETPLAY_PUBLIC_ANNOUNCE);
413    checksLayout->add(MENU_ENUM_LABEL_NETPLAY_START_AS_SPECTATOR);
414    checksLayout->add(MENU_ENUM_LABEL_NETWORK_ON_DEMAND_THUMBNAILS);
415 
416    serverForm->add(MENU_ENUM_LABEL_NETPLAY_IP_ADDRESS);
417    serverForm->add(MENU_ENUM_LABEL_NETPLAY_TCP_UDP_PORT);
418    serverForm->add(MENU_ENUM_LABEL_NETPLAY_PASSWORD);
419    serverForm->add(MENU_ENUM_LABEL_NETPLAY_SPECTATE_PASSWORD);
420    serverForm->add(MENU_ENUM_LABEL_NETPLAY_NAT_TRAVERSAL);
421 
422    serverLayout->addWidget(createMitmServerGroup());
423    serverLayout->addSpacing(30);
424    serverLayout->addLayout(serverForm);
425 
426    serverGroup->setLayout(serverLayout);
427 
428    slaveGroup->add(MENU_ENUM_LABEL_NETPLAY_ALLOW_SLAVES);
429    slaveGroup->add(MENU_ENUM_LABEL_NETPLAY_REQUIRE_SLAVES);
430 
431    syncGroup->add(MENU_ENUM_LABEL_NETPLAY_STATELESS_MODE);
432    syncGroup->add(MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES);
433    syncGroup->add(MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN);
434    syncGroup->add(MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_RANGE);
435 
436    inputGroup->add(MENU_ENUM_LABEL_NETPLAY_SHARE_DIGITAL);
437    inputGroup->add(MENU_ENUM_LABEL_NETPLAY_SHARE_ANALOG);
438 
439    for (i = 0; i < MAX_USERS; i++)
440    {
441       if (column % 4 == 0)
442       {
443          column = 0;
444          row++;
445       }
446       requestGrid->addWidget(new CheckBox((enum msg_hash_enums)(MENU_ENUM_LABEL_NETPLAY_REQUEST_DEVICE_1 + i)), row, column);
447       column++;
448    }
449 
450    deviceGroup->addRow(requestGrid);
451 
452    layout->addLayout(checksLayout, 0, 0, 1, 2);
453    layout->addWidget(serverGroup, 1, 0, 1, 2);
454    layout->addWidget(slaveGroup, 2, 0, 1, 1);
455    layout->addWidget(syncGroup, 2, 1, 2, 1);
456    layout->addWidget(inputGroup, 3, 0, 1, 1);
457    layout->addWidget(deviceGroup, 4, 0, 1, 2);
458 
459    mainLayout->addLayout(layout);
460 
461    mainLayout->addStretch();
462 
463    widget->setLayout(mainLayout);
464 
465    return widget;
466 }
467 
createMitmServerGroup()468 QGroupBox *NetplayPage::createMitmServerGroup()
469 {
470    unsigned i;
471    CheckableSettingsGroup *groupBox = new CheckableSettingsGroup(
472          MENU_ENUM_LABEL_NETPLAY_USE_MITM_SERVER);
473    QButtonGroup *buttonGroup        = new QButtonGroup(this);
474    unsigned list_len                = ARRAY_SIZE(netplay_mitm_server_list);
475    rarch_setting_t *setting         = menu_setting_find_enum(
476          MENU_ENUM_LABEL_NETPLAY_MITM_SERVER);
477 
478    if (!setting)
479       return nullptr;
480 
481    for (i = 0; i < list_len; i++)
482    {
483       QRadioButton *radioButton = new QRadioButton(
484             netplay_mitm_server_list[i].description);
485 
486       /* find the currently selected server in the list */
487       if (string_is_equal(setting->value.target.string,
488                netplay_mitm_server_list[i].name))
489          radioButton->setChecked(true);
490 
491       buttonGroup->addButton(radioButton, i);
492 
493       groupBox->addRow(radioButton);
494    }
495 
496    connect(buttonGroup, SIGNAL(buttonClicked(int)),
497          this, SLOT(onRadioButtonClicked(int)));
498 
499    return groupBox;
500 }
501 
onRadioButtonClicked(int id)502 void NetplayPage::onRadioButtonClicked(int id)
503 {
504    rarch_setting_t *setting =
505       menu_setting_find_enum(MENU_ENUM_LABEL_NETPLAY_MITM_SERVER);
506 
507    if (!setting)
508       return;
509 
510    strlcpy(setting->value.target.string,
511          netplay_mitm_server_list[id].name, setting->size);
512 }
513 
UpdaterPage(QObject * parent)514 UpdaterPage::UpdaterPage(QObject *parent) :
515    OptionsPage(parent)
516 {
517    setDisplayName(MENU_ENUM_LABEL_VALUE_UPDATER_SETTINGS);
518 }
519 
widget()520 QWidget *UpdaterPage::widget()
521 {
522    return create_widget(DISPLAYLIST_UPDATER_SETTINGS_LIST);
523 }
524 
OnscreenDisplayCategory(QWidget * parent)525 OnscreenDisplayCategory::OnscreenDisplayCategory(QWidget *parent) :
526    OptionsCategory(parent)
527 {
528    setDisplayName(MENU_ENUM_LABEL_VALUE_ONSCREEN_DISPLAY_SETTINGS);
529    setCategoryIcon("menu_osd");
530 }
531 
pages()532 QVector<OptionsPage*> OnscreenDisplayCategory::pages()
533 {
534    QVector<OptionsPage*> pages;
535 
536    pages << new OverlayPage(this);
537    pages << new NotificationsPage(this);
538 
539    return pages;
540 }
541 
NotificationsPage(QObject * parent)542 NotificationsPage::NotificationsPage(QObject *parent) :
543    OptionsPage(parent)
544 {
545    setDisplayName(MENU_ENUM_LABEL_VALUE_ONSCREEN_NOTIFICATIONS_SETTINGS);
546 }
547 
widget()548 QWidget *NotificationsPage::widget()
549 {
550    QWidget                            *widget = new QWidget;
551    QVBoxLayout                        *layout = new QVBoxLayout;
552    CheckableSettingsGroup *notificationsGroup = new CheckableSettingsGroup(MENU_ENUM_LABEL_VIDEO_FONT_ENABLE);
553    CheckableSettingsGroup            *bgGroup = new CheckableSettingsGroup(MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_ENABLE);
554 
555    notificationsGroup->add(MENU_ENUM_LABEL_FPS_SHOW);
556    notificationsGroup->add(MENU_ENUM_LABEL_FPS_UPDATE_INTERVAL);
557    notificationsGroup->add(MENU_ENUM_LABEL_FRAMECOUNT_SHOW);
558    notificationsGroup->add(MENU_ENUM_LABEL_MEMORY_SHOW);
559    notificationsGroup->add(MENU_ENUM_LABEL_MEMORY_UPDATE_INTERVAL);
560    notificationsGroup->add(MENU_ENUM_LABEL_STATISTICS_SHOW);
561    notificationsGroup->add(MENU_ENUM_LABEL_VIDEO_FONT_PATH);
562    notificationsGroup->add(MENU_ENUM_LABEL_VIDEO_FONT_SIZE);
563    notificationsGroup->add(MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_X);
564    notificationsGroup->add(MENU_ENUM_LABEL_VIDEO_MESSAGE_POS_Y);
565    notificationsGroup->addRow("Notification Color: ", new FloatColorButton(
566       MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_RED,
567       MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_GREEN,
568       MENU_ENUM_LABEL_VIDEO_MESSAGE_COLOR_BLUE));
569 
570    bgGroup->addRow("Notification Background Color: ", new UIntColorButton(
571       MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_RED,
572       MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_GREEN,
573       MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_BLUE));
574    bgGroup->add(MENU_ENUM_LABEL_VIDEO_MESSAGE_BGCOLOR_OPACITY);
575 
576    notificationsGroup->addRow(bgGroup);
577 
578    notificationsGroup->add(MENU_ENUM_LABEL_MENU_WIDGETS_ENABLE);
579    notificationsGroup->add(MENU_ENUM_LABEL_MENU_WIDGET_SCALE_AUTO);
580    notificationsGroup->add(MENU_ENUM_LABEL_MENU_WIDGET_SCALE_FACTOR);
581 #if !(defined(RARCH_CONSOLE) || defined(RARCH_MOBILE))
582    notificationsGroup->add(MENU_ENUM_LABEL_MENU_WIDGET_SCALE_FACTOR_WINDOWED);
583 #endif
584    notificationsGroup->add(MENU_ENUM_LABEL_MENU_SHOW_LOAD_CONTENT_ANIMATION);
585    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_AUTOCONFIG);
586    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_REMAP_LOAD);
587    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_CONFIG_OVERRIDE_LOAD);
588    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_SET_INITIAL_DISK);
589    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_FAST_FORWARD);
590    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_CHEATS_APPLIED);
591    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT);
592    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT_DURATION);
593    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_SCREENSHOT_FLASH);
594    notificationsGroup->add(MENU_ENUM_LABEL_NOTIFICATION_SHOW_REFRESH_RATE);
595 
596    layout->addWidget(notificationsGroup);
597 
598    layout->addStretch();
599 
600    widget->setLayout(layout);
601 
602    return widget;
603 }
604 
OverlayPage(QObject * parent)605 OverlayPage::OverlayPage(QObject *parent) :
606    OptionsPage(parent)
607 {
608    setDisplayName(MENU_ENUM_LABEL_VALUE_ONSCREEN_OVERLAY_SETTINGS);
609 }
610 
widget()611 QWidget *OverlayPage::widget()
612 {
613    QWidget                      *widget = new QWidget;
614 #if defined(HAVE_OVERLAY)
615    QVBoxLayout                  *layout = new QVBoxLayout;
616 
617    CheckableSettingsGroup *overlayGroup = new CheckableSettingsGroup(MENU_ENUM_LABEL_INPUT_OVERLAY_ENABLE);
618 
619    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_AUTOLOAD_PREFERRED);
620    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_AUTO_ROTATE);
621    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_IN_MENU);
622    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_HIDE_WHEN_GAMEPAD_CONNECTED);
623    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_MOUSE_CURSOR);
624 
625    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_INPUTS);
626    overlayGroup->add(MENU_ENUM_LABEL_INPUT_OVERLAY_SHOW_INPUTS_PORT);
627 
628    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_PRESET);
629    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_OPACITY);
630    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_SCALE_LANDSCAPE);
631    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_LANDSCAPE);
632    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_LANDSCAPE);
633    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_Y_SEPARATION_LANDSCAPE);
634    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_X_OFFSET_LANDSCAPE);
635    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_Y_OFFSET_LANDSCAPE);
636    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_SCALE_PORTRAIT);
637    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_ASPECT_ADJUST_PORTRAIT);
638    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_X_SEPARATION_PORTRAIT);
639    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_X_OFFSET_PORTRAIT);
640    overlayGroup->add(MENU_ENUM_LABEL_OVERLAY_Y_OFFSET_PORTRAIT);
641 
642    layout->addWidget(overlayGroup);
643 
644    layout->addStretch();
645 
646    widget->setLayout(layout);
647 #endif
648 
649    return widget;
650 }
651 
PlaylistsCategory(QWidget * parent)652 PlaylistsCategory::PlaylistsCategory(QWidget *parent) : OptionsCategory(parent)
653 {
654    setDisplayName(MENU_ENUM_LABEL_VALUE_PLAYLIST_SETTINGS);
655    setCategoryIcon("menu_playlist");
656 }
657 
pages()658 QVector<OptionsPage*> PlaylistsCategory::pages()
659 {
660    QVector<OptionsPage*> pages;
661 
662    pages << new PlaylistsPage(this);
663 
664    return pages;
665 }
666 
PlaylistsPage(QObject * parent)667 PlaylistsPage::PlaylistsPage(QObject *parent) :
668    OptionsPage(parent)
669 {
670 }
671 
widget()672 QWidget *PlaylistsPage::widget()
673 {
674    QWidget *widget                 = new QWidget;
675    FormLayout *layout              = new FormLayout;
676    CheckableSettingsGroup *history = new CheckableSettingsGroup(MENU_ENUM_LABEL_HISTORY_LIST_ENABLE);
677 
678    history->add(MENU_ENUM_LABEL_CONTENT_HISTORY_SIZE);
679 
680    layout->addRow(history);
681 
682    layout->add(MENU_ENUM_LABEL_PLAYLIST_ENTRY_RENAME);
683    /*layout->add(MENU_ENUM_LABEL_PLAYLIST_ENTRY_REMOVE); TOFIX */
684    layout->add(MENU_ENUM_LABEL_PLAYLIST_SORT_ALPHABETICAL);
685    layout->add(MENU_ENUM_LABEL_PLAYLIST_USE_OLD_FORMAT);
686    layout->add(MENU_ENUM_LABEL_PLAYLIST_COMPRESSION);
687    layout->add(MENU_ENUM_LABEL_PLAYLIST_SHOW_SUBLABELS);
688    layout->add(MENU_ENUM_LABEL_PLAYLIST_FUZZY_ARCHIVE_MATCH);
689    layout->add(MENU_ENUM_LABEL_SCAN_WITHOUT_CORE_MATCH);
690 
691    widget->setLayout(layout);
692 
693    return widget;
694 }
695 
RecordingCategory(QWidget * parent)696 RecordingCategory::RecordingCategory(QWidget *parent) :
697    OptionsCategory(parent)
698 {
699    setDisplayName(MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS);
700    setCategoryIcon("menu_record");
701 }
702 
pages()703 QVector<OptionsPage*> RecordingCategory::pages()
704 {
705    QVector<OptionsPage*> pages;
706 
707    pages << new RecordingPage(this);
708 
709    return pages;
710 }
711 
RecordingPage(QObject * parent)712 RecordingPage::RecordingPage(QObject *parent) :
713    OptionsPage(parent)
714 {
715 }
716 
widget()717 QWidget *RecordingPage::widget()
718 {
719    QWidget              * widget = new QWidget;
720    QVBoxLayout           *layout = new QVBoxLayout;
721    SettingsGroup *recordingGroup = new SettingsGroup("Recording");
722    SettingsGroup *streamingGroup = new SettingsGroup("Streaming");
723    QHBoxLayout               *hl = new QHBoxLayout;
724 
725    recordingGroup->add(MENU_ENUM_LABEL_VIDEO_RECORD_QUALITY);
726    recordingGroup->add(MENU_ENUM_LABEL_RECORD_CONFIG);
727    recordingGroup->add(MENU_ENUM_LABEL_VIDEO_RECORD_THREADS);
728    recordingGroup->add(MENU_ENUM_LABEL_RECORDING_OUTPUT_DIRECTORY);
729    recordingGroup->add(MENU_ENUM_LABEL_VIDEO_POST_FILTER_RECORD);
730    recordingGroup->add(MENU_ENUM_LABEL_VIDEO_GPU_RECORD);
731 
732    hl->addWidget(new UIntRadioButtons(MENU_ENUM_LABEL_STREAMING_MODE));
733    hl->addWidget(new UIntRadioButtons(MENU_ENUM_LABEL_VIDEO_STREAM_QUALITY));
734 
735    streamingGroup->addRow(hl);
736 
737    streamingGroup->add(MENU_ENUM_LABEL_STREAM_CONFIG);
738    streamingGroup->add(MENU_ENUM_LABEL_STREAMING_TITLE);
739    streamingGroup->add(MENU_ENUM_LABEL_STREAMING_URL);
740    streamingGroup->add(MENU_ENUM_LABEL_UDP_STREAM_PORT);
741 
742    layout->addWidget(recordingGroup);
743    layout->addWidget(streamingGroup);
744 
745    layout->addStretch();
746 
747    widget->setLayout(layout);
748 
749    return widget;
750 }
751 
SavingCategory(QWidget * parent)752 SavingCategory::SavingCategory(QWidget *parent) :
753    OptionsCategory(parent)
754 {
755    setDisplayName(MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS);
756    setCategoryIcon("menu_saving");
757 }
758 
pages()759 QVector<OptionsPage*> SavingCategory::pages()
760 {
761    QVector<OptionsPage*> pages;
762 
763    pages << new SavingPage(this);
764 
765    return pages;
766 }
767 
SavingPage(QObject * parent)768 SavingPage::SavingPage(QObject *parent) :
769    OptionsPage(parent)
770 {
771 }
772 
widget()773 QWidget *SavingPage::widget()
774 {
775    QWidget                             *widget = new QWidget;
776    FormLayout                          *layout = new FormLayout;
777    SettingsGroup                   *savesGroup = new SettingsGroup("Saves");
778    SettingsGroup              *savestatesGroup = new SettingsGroup("Savestates");
779    CheckableSettingsGroup *autoSavestatesGroup = new CheckableSettingsGroup(MENU_ENUM_LABEL_SAVESTATE_AUTO_SAVE);
780    SettingsGroup                 *saveRamGroup = new SettingsGroup("SaveRAM");
781    SettingsGroup          *systemFilesDirGroup = new SettingsGroup("System Files");
782    SettingsGroup          *screenshotsDirGroup = new SettingsGroup("Screenshots");
783    SettingsGroup          *runtimeLogGroup     = new SettingsGroup("Runtime Log");
784 
785    savesGroup->add(MENU_ENUM_LABEL_SORT_SAVEFILES_ENABLE);
786    savesGroup->add(MENU_ENUM_LABEL_SORT_SAVEFILES_BY_CONTENT_ENABLE);
787    savesGroup->add(MENU_ENUM_LABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE);
788 
789    savestatesGroup->add(MENU_ENUM_LABEL_SAVESTATE_AUTO_INDEX);
790 
791    autoSavestatesGroup->add(MENU_ENUM_LABEL_SAVESTATE_AUTO_LOAD);
792 
793    savestatesGroup->addRow(autoSavestatesGroup);
794    savestatesGroup->add(MENU_ENUM_LABEL_SAVESTATE_THUMBNAIL_ENABLE);
795    savestatesGroup->add(MENU_ENUM_LABEL_SORT_SAVESTATES_ENABLE);
796    savestatesGroup->add(MENU_ENUM_LABEL_SORT_SAVESTATES_BY_CONTENT_ENABLE);
797    savestatesGroup->add(MENU_ENUM_LABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE);
798    savestatesGroup->add(MENU_ENUM_LABEL_SAVESTATE_FILE_COMPRESSION);
799 
800    saveRamGroup->add(MENU_ENUM_LABEL_BLOCK_SRAM_OVERWRITE);
801    saveRamGroup->add(MENU_ENUM_LABEL_AUTOSAVE_INTERVAL);
802    saveRamGroup->add(MENU_ENUM_LABEL_SAVE_FILE_COMPRESSION);
803 
804    systemFilesDirGroup->add(MENU_ENUM_LABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE);
805 
806    screenshotsDirGroup->add(MENU_ENUM_LABEL_SORT_SCREENSHOTS_BY_CONTENT_ENABLE);
807    screenshotsDirGroup->add(MENU_ENUM_LABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE);
808 
809    runtimeLogGroup->add(MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG);
810    runtimeLogGroup->add(MENU_ENUM_LABEL_CONTENT_RUNTIME_LOG_AGGREGATE);
811 
812    layout->addRow(savesGroup);
813    layout->addRow(savestatesGroup);
814    layout->addRow(saveRamGroup);
815    layout->addRow(systemFilesDirGroup);
816    layout->addRow(screenshotsDirGroup);
817    layout->addRow(runtimeLogGroup);
818 
819    widget->setLayout(layout);
820 
821    return widget;
822 }
823 
UserInterfaceCategory(QWidget * parent)824 UserInterfaceCategory::UserInterfaceCategory(QWidget *parent) :
825    OptionsCategory(parent)
826 {
827    setDisplayName(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS);
828    setCategoryIcon("menu_ui");
829 }
830 
UserInterfaceCategory(MainWindow * mainwindow,QWidget * parent)831 UserInterfaceCategory::UserInterfaceCategory(MainWindow *mainwindow, QWidget *parent) :
832    OptionsCategory(parent)
833    ,m_mainwindow(mainwindow)
834 {
835    setDisplayName(MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS);
836    setCategoryIcon("menu_ui");
837 
838    m_pages << new UserInterfacePage(this);
839    m_pages << new ViewsPage(this);
840    m_pages << new AppearancePage(this);
841    m_pages << new DesktopMenuPage(m_mainwindow, this);
842 }
843 
pages()844 QVector<OptionsPage*> UserInterfaceCategory::pages()
845 {
846    return m_pages;
847 }
848 
UserInterfacePage(QObject * parent)849 UserInterfacePage::UserInterfacePage(QObject *parent) :
850    OptionsPage(parent)
851 {
852 }
853 
widget()854 QWidget *UserInterfacePage::widget()
855 {
856    QWidget                     * widget = new QWidget;
857    QVBoxLayout                  *layout = new QVBoxLayout;
858    SettingsGroup             *menuGroup = new SettingsGroup("Menu");
859    SettingsGroup            *inputGroup = new SettingsGroup("Input");
860    SettingsGroup             *miscGroup = new SettingsGroup("Miscellaneous");
861    CheckableSettingsGroup *desktopGroup = new CheckableSettingsGroup(MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE);
862    rarch_setting_t           *kioskMode = menu_setting_find_enum(MENU_ENUM_LABEL_MENU_ENABLE_KIOSK_MODE);
863 
864    menuGroup->add(MENU_ENUM_LABEL_SHOW_ADVANCED_SETTINGS);
865 
866    /* only on XMB and Ozone*/
867    if (kioskMode)
868    {
869       CheckableSettingsGroup *kioskGroup = new CheckableSettingsGroup(kioskMode, widget);
870 
871       kioskGroup->add(MENU_ENUM_LABEL_MENU_KIOSK_MODE_PASSWORD);
872 
873       menuGroup->addRow(kioskGroup);
874    }
875 
876    menuGroup->add(MENU_ENUM_LABEL_NAVIGATION_WRAPAROUND);
877    menuGroup->add(MENU_ENUM_LABEL_PAUSE_LIBRETRO);
878 
879    inputGroup->add(MENU_ENUM_LABEL_MOUSE_ENABLE);
880    inputGroup->add(MENU_ENUM_LABEL_POINTER_ENABLE);
881 
882    menuGroup->addRow(inputGroup);
883    menuGroup->add(MENU_ENUM_LABEL_THREADED_DATA_RUNLOOP_ENABLE);
884 
885    miscGroup->add(MENU_ENUM_LABEL_PAUSE_NONACTIVE);
886    miscGroup->add(MENU_ENUM_LABEL_VIDEO_DISABLE_COMPOSITION);
887 
888    menuGroup->add(MENU_ENUM_LABEL_UI_COMPANION_ENABLE);
889    menuGroup->add(MENU_ENUM_LABEL_UI_COMPANION_START_ON_BOOT);
890    menuGroup->add(MENU_ENUM_LABEL_UI_MENUBAR_ENABLE);
891    menuGroup->add(MENU_ENUM_LABEL_MENU_SCROLL_FAST);
892 
893    /* layout->add(MENU_ENUM_LABEL_DESKTOP_MENU_ENABLE); */
894    desktopGroup->add(MENU_ENUM_LABEL_UI_COMPANION_TOGGLE);
895 
896    layout->addWidget(menuGroup);
897    layout->addWidget(miscGroup);
898    layout->addWidget(desktopGroup);
899    layout->addStretch();
900 
901    widget->setLayout(layout);
902 
903    return widget;
904 }
905 
ViewsPage(QObject * parent)906 ViewsPage::ViewsPage(QObject *parent) :
907    OptionsPage(parent)
908 {
909    setDisplayName(MENU_ENUM_LABEL_VALUE_MENU_VIEWS_SETTINGS);
910 }
911 
widget()912 QWidget *ViewsPage::widget()
913 {
914    unsigned i;
915    QWidget           * widget = new QWidget();
916    QHBoxLayout *mainLayout    = new QHBoxLayout;
917    FormLayout *leftLayout     = new FormLayout;
918    QVBoxLayout *rightLayout   = new QVBoxLayout;
919    SettingsGroup *quickMenu   = new SettingsGroup("Quick Menu");
920    QuickMenuPage *quickPage   = new QuickMenuPage(this);
921    SettingsGroup *mainMenu    = new SettingsGroup("Main Menu");
922    SettingsGroup *settings    = new SettingsGroup("Settings");
923    SettingsGroup *tabs        = new SettingsGroup("Tabs");
924    SettingsGroup *status      = new SettingsGroup("Status");
925    SettingsGroup *startScreen = new SettingsGroup("StartScreen");
926    settings_t *_settings      = config_get_ptr();
927    unsigned tabs_begin        = 0;
928    unsigned status_begin      = 0;
929    file_list_t *list          = (file_list_t*)calloc(1, sizeof(*list));
930 
931    {
932       rarch_setting_t *kiosk_mode = NULL;
933       menu_displaylist_build_list(list, _settings,
934             DISPLAYLIST_MENU_VIEWS_SETTINGS_LIST, true);
935       kiosk_mode                  = menu_setting_find_enum(
936             MENU_ENUM_LABEL_MENU_ENABLE_KIOSK_MODE);
937 
938       for (i = 0; i < list->size; i++)
939       {
940          menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
941             file_list_get_actiondata_at_offset(list, i);
942 
943          if (cbs->enum_idx == (kiosk_mode
944                   ? MENU_ENUM_LABEL_CONTENT_SHOW_SETTINGS
945                   : MENU_ENUM_LABEL_CONTENT_SHOW_EXPLORE))
946          {
947             tabs_begin = i;
948             break;
949          }
950 
951          mainMenu->add(cbs->enum_idx);
952       }
953 
954       for (i = tabs_begin; i < list->size; i++)
955       {
956          menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
957             file_list_get_actiondata_at_offset(list, i);
958 
959          if (cbs->enum_idx == MENU_ENUM_LABEL_TIMEDATE_ENABLE)
960          {
961             status_begin = i;
962             break;
963          }
964 
965          tabs->add(cbs->enum_idx);
966       }
967 
968       for (i = status_begin; i < list->size; i++)
969       {
970          menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
971             file_list_get_actiondata_at_offset(list, i);
972 
973          if (cbs->enum_idx == MENU_ENUM_LABEL_MENU_SHOW_SUBLABELS)
974             break;
975 
976          status->add(cbs->enum_idx);
977       }
978 
979       file_list_free(list);
980    }
981 
982    {
983       unsigned i;
984       file_list_t *list = (file_list_t*)calloc(1, sizeof(*list));
985       menu_displaylist_build_list(list, _settings,
986             DISPLAYLIST_SETTINGS_VIEWS_SETTINGS_LIST, true);
987 
988       for (i = 0; i < list->size; i++)
989       {
990          menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
991             file_list_get_actiondata_at_offset(list, i);
992 
993          settings->add(cbs->enum_idx);
994       }
995 
996       file_list_free(list);
997    }
998 
999    startScreen->add(MENU_ENUM_LABEL_RGUI_SHOW_START_SCREEN);
1000 
1001    quickMenu->layout()->setContentsMargins(0, 0, 0, 0);
1002    quickMenu->addRow(quickPage->widget());
1003 
1004    leftLayout->addRow(mainMenu);
1005    leftLayout->addRow(settings);
1006    leftLayout->addRow(startScreen);
1007    leftLayout->add(MENU_ENUM_LABEL_MENU_SHOW_SUBLABELS);
1008 
1009    rightLayout->addWidget(tabs);
1010    rightLayout->addWidget(quickMenu);
1011    rightLayout->addWidget(status);
1012    rightLayout->addStretch();
1013 
1014    mainLayout->addLayout(leftLayout);
1015    mainLayout->addLayout(rightLayout);
1016 
1017    widget->setLayout(mainLayout);
1018 
1019    return widget;
1020 }
1021 
QuickMenuPage(QObject * parent)1022 QuickMenuPage::QuickMenuPage(QObject *parent) :
1023    OptionsPage(parent)
1024 {
1025    setDisplayName(MENU_ENUM_LABEL_VALUE_QUICK_MENU_VIEWS_SETTINGS);
1026 }
1027 
widget()1028 QWidget *QuickMenuPage::widget()
1029 {
1030    return create_widget(DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST);
1031 }
1032 
AppearancePage(QObject * parent)1033 AppearancePage::AppearancePage(QObject *parent) :
1034    OptionsPage(parent)
1035 {
1036    setDisplayName(MENU_ENUM_LABEL_VALUE_MENU_SETTINGS);
1037 }
1038 
widget()1039 QWidget *AppearancePage::widget()
1040 {
1041    unsigned i;
1042    QWidget            * widget = new QWidget;
1043    FormLayout          *layout = new FormLayout;
1044    file_list_t           *list = (file_list_t*)calloc(1, sizeof(*list));
1045    settings_t *settings        = config_get_ptr();
1046 
1047    menu_displaylist_build_list(
1048          list, settings, DISPLAYLIST_MENU_SETTINGS_LIST, true);
1049 
1050    /* TODO/FIXME - we haven't yet figured out how to
1051     * put a radio button setting next to another radio
1052     * button on the same row */
1053 
1054    for (i = 0; i < list->size; i++)
1055    {
1056       menu_file_list_cbs_t *cbs = (menu_file_list_cbs_t*)
1057          file_list_get_actiondata_at_offset(list, i);
1058 
1059       switch (cbs->enum_idx)
1060       {
1061          /* TODO/FIXME - this is a dirty hack - if we
1062           * detect this setting, we instead replace it with a
1063           * color button and ignore the other two font color
1064           * settings since they are already covered by this one
1065           * color button */
1066          case MENU_ENUM_LABEL_MENU_FONT_COLOR_RED:
1067             layout->addUIntColorButton("Menu Font Color: ",
1068                   MENU_ENUM_LABEL_MENU_FONT_COLOR_RED,
1069                   MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN,
1070                   MENU_ENUM_LABEL_MENU_FONT_COLOR_BLUE);
1071             break;
1072          case MENU_ENUM_LABEL_MENU_FONT_COLOR_GREEN:
1073          case MENU_ENUM_LABEL_MENU_FONT_COLOR_BLUE:
1074             break;
1075          default:
1076             layout->add(cbs->enum_idx);
1077             break;
1078       }
1079    }
1080 
1081    file_list_free(list);
1082 
1083    widget->setLayout(layout);
1084 
1085    return widget;
1086 }
1087 
DesktopMenuPage(MainWindow * mainwindow,QObject * parent)1088 DesktopMenuPage::DesktopMenuPage(MainWindow *mainwindow, QObject *parent) :
1089    OptionsPage(parent)
1090    ,m_widget(new ViewOptionsWidget(mainwindow))
1091 {
1092    setDisplayName("Desktop Menu");
1093 }
1094 
apply()1095 void DesktopMenuPage::apply()
1096 {
1097    m_widget->saveViewOptions();
1098 }
1099 
load()1100 void DesktopMenuPage::load()
1101 {
1102    m_widget->loadViewOptions();
1103 }
1104 
widget()1105 QWidget *DesktopMenuPage::widget()
1106 {
1107    return m_widget;
1108 }
1109 
UserCategory(QWidget * parent)1110 UserCategory::UserCategory(QWidget *parent) :
1111    OptionsCategory(parent)
1112 {
1113    setDisplayName(MENU_ENUM_LABEL_VALUE_USER_SETTINGS);
1114    setCategoryIcon("menu_user");
1115 }
1116 
pages()1117 QVector<OptionsPage*> UserCategory::pages()
1118 {
1119    QVector<OptionsPage*> pages;
1120 
1121    pages << new UserPage(this);
1122    pages << new AccountsPage(this);
1123 
1124    return pages;
1125 }
1126 
UserPage(QObject * parent)1127 UserPage::UserPage(QObject *parent) :
1128    OptionsPage(parent)
1129 {
1130 }
1131 
widget()1132 QWidget *UserPage::widget()
1133 {
1134    QWidget *widget    = new QWidget;
1135    FormLayout *layout = new FormLayout;
1136 
1137    layout->add(MENU_ENUM_LABEL_NETPLAY_NICKNAME);
1138    layout->add(MENU_ENUM_LABEL_USER_LANGUAGE);
1139 
1140    widget->setLayout(layout);
1141 
1142    return widget;
1143 }
1144 
AccountsPage(QObject * parent)1145 AccountsPage::AccountsPage(QObject *parent) :
1146    OptionsPage(parent)
1147 {
1148    setDisplayName(MENU_ENUM_LABEL_VALUE_ACCOUNTS_LIST);
1149 }
1150 
widget()1151 QWidget *AccountsPage::widget()
1152 {
1153    QWidget *widget             = new QWidget;
1154    QVBoxLayout *layout         = new QVBoxLayout;
1155    SettingsGroup *youtubeGroup = new SettingsGroup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_YOUTUBE));
1156    SettingsGroup *twitchGroup  = new SettingsGroup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_TWITCH));
1157    SettingsGroup *facebookGroup = new SettingsGroup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_FACEBOOK));
1158 #ifdef HAVE_CHEEVOS
1159    SettingsGroup *cheevosGroup = new SettingsGroup(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_ACCOUNTS_RETRO_ACHIEVEMENTS));
1160 
1161    cheevosGroup->add(MENU_ENUM_LABEL_CHEEVOS_USERNAME);
1162    cheevosGroup->add(MENU_ENUM_LABEL_CHEEVOS_PASSWORD);
1163 
1164    layout->addWidget(cheevosGroup);
1165 #endif
1166 
1167    youtubeGroup->add(MENU_ENUM_LABEL_YOUTUBE_STREAM_KEY);
1168 
1169    layout->addWidget(youtubeGroup);
1170 
1171    twitchGroup->add(MENU_ENUM_LABEL_TWITCH_STREAM_KEY);
1172 
1173    layout->addWidget(twitchGroup);
1174 
1175    facebookGroup->add(MENU_ENUM_LABEL_FACEBOOK_STREAM_KEY);
1176 
1177    layout->addWidget(facebookGroup);
1178 
1179    layout->addStretch();
1180 
1181    widget->setLayout(layout);
1182 
1183    return widget;
1184 }
1185 
VideoCategory(QWidget * parent)1186 VideoCategory::VideoCategory(QWidget *parent) :
1187    OptionsCategory(parent)
1188 {
1189    setDisplayName(MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS);
1190    setCategoryIcon("menu_video");
1191 }
1192 
pages()1193 QVector<OptionsPage*> VideoCategory::pages()
1194 {
1195    QVector<OptionsPage*> pages;
1196 
1197    pages << new VideoPage(this);
1198    pages << new CrtSwitchresPage(this);
1199 
1200    return pages;
1201 }
1202 
VideoPage(QObject * parent)1203 VideoPage::VideoPage(QObject *parent) :
1204    OptionsPage(parent)
1205    ,m_resolutionCombo(new QComboBox())
1206 {
1207 }
1208 
widget()1209 QWidget *VideoPage::widget()
1210 {
1211    QWidget               *widget       = new QWidget;
1212 
1213    QVBoxLayout        *layout          = new QVBoxLayout;
1214 
1215    SettingsGroup *outputGroup          = new SettingsGroup("Output");
1216    SettingsGroup *aspectGroup          = new SettingsGroup("Scaling");
1217 
1218    SettingsGroup *fullscreenGroup      = new SettingsGroup("Fullscreen Mode");
1219    SettingsGroup *windowedGroup        = new SettingsGroup("Windowed Mode");
1220 
1221    QHBoxLayout *fullcreenSizeLayout    = new QHBoxLayout;
1222    FormLayout *leftFullscreenSizeForm  = new FormLayout;
1223    FormLayout *rightFullscreenSizeForm = new FormLayout;
1224 
1225    QHBoxLayout *windowedSizeLayout     = new QHBoxLayout;
1226    FormLayout *leftWindowedSizeForm    = new FormLayout;
1227    FormLayout *rightWindowedSizeForm   = new FormLayout;
1228 
1229    SettingsGroup *syncGroup            = new SettingsGroup("Synchronization");
1230    CheckableSettingsGroup *vSyncGroup  = new CheckableSettingsGroup(MENU_ENUM_LABEL_VIDEO_VSYNC);
1231 
1232    QHBoxLayout *outputScalingLayout    = new QHBoxLayout;
1233    QHBoxLayout *modeLayout             = new QHBoxLayout;
1234    QHBoxLayout *syncMiscLayout         = new QHBoxLayout;
1235 
1236    SettingsGroup *miscGroup            = new SettingsGroup("Miscellaneous");
1237    SettingsGroup *filterGroup          = new SettingsGroup("Video Filter");
1238 
1239    unsigned i, size                    = 0;
1240    struct video_display_config *list   = (struct video_display_config*) video_display_server_get_resolution_list(&size);
1241 
1242    if (list)
1243    {
1244       for (i = 0; i < size; i++)
1245       {
1246          char val_d[256], str[256];
1247          snprintf(str, sizeof(str), "%dx%d (%d Hz)", list[i].width, list[i].height, list[i].refreshrate);
1248          snprintf(val_d, sizeof(val_d), "%d", i);
1249 
1250          m_resolutionCombo->addItem(str);
1251 
1252          if (list[i].current)
1253             m_resolutionCombo->setCurrentIndex(i);
1254       }
1255 
1256       free(list);
1257    }
1258 
1259    outputGroup->add(MENU_ENUM_LABEL_VIDEO_DRIVER);
1260    outputGroup->add(MENU_ENUM_LABEL_VIDEO_MONITOR_INDEX);
1261    outputGroup->add(MENU_ENUM_LABEL_VIDEO_ROTATION);
1262    outputGroup->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SCREEN_RESOLUTION), m_resolutionCombo);
1263    outputGroup->add(MENU_ENUM_LABEL_VIDEO_FORCE_SRGB_DISABLE);
1264 
1265    fullscreenGroup->add(MENU_ENUM_LABEL_VIDEO_FULLSCREEN);
1266    fullscreenGroup->add(MENU_ENUM_LABEL_VIDEO_WINDOWED_FULLSCREEN);
1267 
1268    leftFullscreenSizeForm->addRow("Width:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_FULLSCREEN_X));
1269    rightFullscreenSizeForm->addRow("Height:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_FULLSCREEN_Y));
1270 
1271    fullcreenSizeLayout->addLayout(leftFullscreenSizeForm);
1272    fullcreenSizeLayout->addLayout(rightFullscreenSizeForm);
1273 
1274    fullscreenGroup->addRow(fullcreenSizeLayout);
1275 
1276    aspectGroup->add(MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER);
1277    aspectGroup->addRow(new AspectRatioGroup("Aspect Ratio"));
1278 
1279    leftWindowedSizeForm->addRow("Scale:", new FloatSpinBox(MENU_ENUM_LABEL_VIDEO_SCALE));
1280    leftWindowedSizeForm->addRow("Width:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_WINDOW_WIDTH));
1281 
1282    rightWindowedSizeForm->addRow("Opacity:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_WINDOW_OPACITY));
1283    rightWindowedSizeForm->addRow("Height:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_WINDOW_HEIGHT));
1284 
1285    windowedSizeLayout->addLayout(leftWindowedSizeForm);
1286    windowedSizeLayout->addLayout(rightWindowedSizeForm);
1287 
1288    windowedGroup->addRow(windowedSizeLayout);
1289 
1290    windowedGroup->add(MENU_ENUM_LABEL_VIDEO_WINDOW_SHOW_DECORATIONS);
1291    windowedGroup->add(MENU_ENUM_LABEL_VIDEO_WINDOW_SAVE_POSITION);
1292 
1293    vSyncGroup->add(MENU_ENUM_LABEL_VIDEO_SWAP_INTERVAL);
1294    vSyncGroup->add(MENU_ENUM_LABEL_VIDEO_ADAPTIVE_VSYNC);
1295    vSyncGroup->add(MENU_ENUM_LABEL_VIDEO_FRAME_DELAY);
1296    syncGroup->addRow(vSyncGroup);
1297 
1298    rarch_setting_t *hardSyncSetting = menu_setting_find_enum(MENU_ENUM_LABEL_VIDEO_HARD_SYNC);
1299 
1300    if (hardSyncSetting)
1301    {
1302       CheckableSettingsGroup *hardSyncGroup = new CheckableSettingsGroup(hardSyncSetting);
1303 
1304       hardSyncGroup->add(MENU_ENUM_LABEL_VIDEO_HARD_SYNC_FRAMES);
1305 
1306       syncGroup->addRow(hardSyncGroup);
1307    }
1308 
1309    syncGroup->add(MENU_ENUM_LABEL_VIDEO_MAX_SWAPCHAIN_IMAGES);
1310 
1311    miscGroup->add(MENU_ENUM_LABEL_SUSPEND_SCREENSAVER_ENABLE);
1312    miscGroup->add(MENU_ENUM_LABEL_VIDEO_THREADED);
1313    miscGroup->add(MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION);
1314    miscGroup->add(MENU_ENUM_LABEL_VIDEO_GPU_SCREENSHOT);
1315    miscGroup->add(MENU_ENUM_LABEL_VIDEO_SMOOTH);
1316    miscGroup->add(MENU_ENUM_LABEL_VIDEO_CTX_SCALING);
1317    miscGroup->add(MENU_ENUM_LABEL_VIDEO_SHADER_DELAY);
1318 
1319    syncMiscLayout->addWidget(syncGroup);
1320    syncMiscLayout->addWidget(miscGroup);
1321 
1322    filterGroup->add(MENU_ENUM_LABEL_VIDEO_FILTER);
1323 
1324    modeLayout->addWidget(fullscreenGroup);
1325    modeLayout->addWidget(windowedGroup);
1326 
1327    aspectGroup->add(MENU_ENUM_LABEL_VIDEO_CROP_OVERSCAN);
1328 
1329    outputScalingLayout->addWidget(outputGroup);
1330    outputScalingLayout->addWidget(aspectGroup);
1331 
1332    layout->addLayout(outputScalingLayout);
1333    layout->addLayout(modeLayout);
1334    layout->addLayout(syncMiscLayout);
1335    layout->addWidget(filterGroup);
1336 
1337    layout->addStretch();
1338 
1339    connect(m_resolutionCombo, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(onResolutionComboIndexChanged(const QString&)));
1340 
1341    widget->setLayout(layout);
1342 
1343    return widget;
1344 }
1345 
AspectRatioGroup(const QString & title,QWidget * parent)1346 AspectRatioGroup::AspectRatioGroup(const QString &title, QWidget *parent) :
1347    SettingsGroup(title, parent)
1348    ,m_radioButton(new AspectRatioRadioButton(ASPECT_RATIO_4_3, ASPECT_RATIO_32_9))
1349    ,m_comboBox(new UIntComboBox(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_4_3, ASPECT_RATIO_32_9))
1350 {
1351    QHBoxLayout *aspectLayout   = new QHBoxLayout;
1352    QHBoxLayout *preset         = new QHBoxLayout;
1353    QHBoxLayout *custom         = new QHBoxLayout;
1354    QVBoxLayout *customRadio    = new QVBoxLayout;
1355    QHBoxLayout *config         = new QHBoxLayout;
1356    QHBoxLayout *full           = new QHBoxLayout;
1357    QHBoxLayout *aspectL        = new QHBoxLayout;
1358    FormLayout *leftAspectForm  = new FormLayout;
1359    FormLayout *rightAspectForm = new FormLayout;
1360    FormLayout *leftAspect      = new FormLayout;
1361    FormLayout *rightAspect     = new FormLayout;
1362 
1363    leftAspectForm->addRow("X Pos.:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X));
1364    leftAspectForm->addRow("Width:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH));
1365    rightAspectForm->addRow("Y Pos.:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y));
1366    rightAspectForm->addRow("Height:", new UIntSpinBox(MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT));
1367 
1368    aspectLayout->addLayout(leftAspectForm);
1369    aspectLayout->addLayout(rightAspectForm);
1370 
1371    preset->addWidget(m_radioButton);
1372    preset->addWidget(m_comboBox);
1373    preset->setStretch(1, 1);
1374 
1375    customRadio->addWidget(new UIntRadioButton(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_CUSTOM), Qt::AlignTop);
1376    customRadio->addStretch();
1377 
1378    custom->addLayout(customRadio);
1379    custom->addLayout(aspectLayout);
1380    custom->addStretch();
1381 
1382    config->addWidget(new UIntRadioButton(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_CONFIG));
1383    config->addWidget(new FloatSpinBox(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO));
1384    config->setStretch(1, 1);
1385    config->setSizeConstraint(QLayout::SetMinimumSize);
1386 
1387    full->addWidget(new UIntRadioButton(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_FULL));
1388 
1389    leftAspect->addRow(new UIntRadioButton(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_CORE));
1390    leftAspect->addRow(preset);
1391 
1392    rightAspect->addRow(config);
1393    rightAspect->addRow(new UIntRadioButton(MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, ASPECT_RATIO_SQUARE));
1394 
1395    aspectL->addLayout(leftAspect);
1396    aspectL->addStretch();
1397    aspectL->addSpacing(30);
1398    aspectL->addLayout(rightAspect);
1399 
1400    addRow(aspectL);
1401    addRow(full);
1402    addRow(custom);
1403 
1404    connect(m_radioButton, SIGNAL(clicked(bool)), this, SLOT(onAspectRadioClicked(bool)));
1405 }
1406 
paintEvent(QPaintEvent * event)1407 void AspectRatioGroup::paintEvent(QPaintEvent *event)
1408 {
1409    settings_t *settings = config_get_ptr();
1410    unsigned       value = settings->uints.video_aspect_ratio_idx;
1411 
1412    if (ASPECT_RATIO_4_3 >= value || value <= ASPECT_RATIO_32_9)
1413    {
1414       m_comboBox->blockSignals(false);
1415       m_radioButton->setChecked(true);
1416    }
1417    else
1418       m_comboBox->blockSignals(true);
1419 
1420    SettingsGroup::paintEvent(event);
1421 }
1422 
onAspectRadioToggled(bool checked)1423 void AspectRatioGroup::onAspectRadioToggled(bool checked)
1424 {
1425    if (checked)
1426       m_comboBox->currentIndexChanged(m_comboBox->currentIndex());
1427    else
1428       m_comboBox->blockSignals(true);
1429 }
1430 
onAspectRadioClicked(bool checked)1431 void AspectRatioGroup::onAspectRadioClicked(bool checked)
1432 {
1433    m_comboBox->blockSignals(false);
1434    m_comboBox->currentIndexChanged(m_comboBox->currentIndex());
1435    setChecked(true);
1436 }
1437 
CrtSwitchresPage(QObject * parent)1438 CrtSwitchresPage::CrtSwitchresPage(QObject *parent) :
1439    OptionsPage(parent)
1440    ,m_crtSuperResolutionCombo(new QComboBox())
1441 {
1442    setDisplayName(MENU_ENUM_LABEL_VALUE_CRT_SWITCHRES_SETTINGS);
1443 }
1444 
widget()1445 QWidget *CrtSwitchresPage::widget()
1446 {
1447    QWidget *widget    = new QWidget;
1448    FormLayout *layout = new FormLayout;
1449 
1450    m_crtSuperResolutionCombo->addItem(msg_hash_to_str(MSG_NATIVE), 0);
1451    m_crtSuperResolutionCombo->addItem("1920", 1920);
1452    m_crtSuperResolutionCombo->addItem("2560", 2560);
1453    m_crtSuperResolutionCombo->addItem("3840", 3840);
1454 
1455    layout->add(MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION);
1456    layout->addRow(msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CRT_SWITCH_RESOLUTION_SUPER), m_crtSuperResolutionCombo);
1457    layout->add(MENU_ENUM_LABEL_CRT_SWITCH_X_AXIS_CENTERING);
1458    layout->add(MENU_ENUM_LABEL_CRT_SWITCH_RESOLUTION_USE_CUSTOM_REFRESH_RATE);
1459 
1460    connect(m_crtSuperResolutionCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(onCrtSuperResolutionComboIndexChanged(int)));
1461 
1462    widget->setLayout(layout);
1463 
1464    return widget;
1465 }
1466 
onResolutionComboIndexChanged(const QString & text)1467 void VideoPage::onResolutionComboIndexChanged(const QString &text)
1468 {
1469    const char *path     = text.toUtf8().constData();
1470    action_cb_push_dropdown_item_resolution(path,
1471          NULL, 0, 0, 0);
1472 }
1473 
onCrtSuperResolutionComboIndexChanged(int index)1474 void CrtSwitchresPage::onCrtSuperResolutionComboIndexChanged(int index)
1475 {
1476    settings_t *settings = config_get_ptr();
1477    Q_UNUSED(index)
1478 
1479    settings->uints.crt_switch_resolution_super =
1480    m_crtSuperResolutionCombo->currentData().value<unsigned>();
1481 }
1482 
AspectRatioRadioButton(unsigned min,unsigned max,QWidget * parent)1483 AspectRatioRadioButton::AspectRatioRadioButton(unsigned min, unsigned max, QWidget *parent) :
1484    QRadioButton(parent)
1485    ,m_min(min)
1486    ,m_max(max)
1487 {
1488 }
1489 
1490 /* DRIVERS */
1491 
DriversCategory(QWidget * parent)1492 DriversCategory::DriversCategory(QWidget *parent) :
1493    OptionsCategory(parent)
1494 {
1495    setDisplayName(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS);
1496    setCategoryIcon("menu_drivers");
1497 }
1498 
pages()1499 QVector<OptionsPage*> DriversCategory::pages()
1500 {
1501    QVector<OptionsPage*> pages;
1502 
1503    pages << new DriversPage(this);
1504 
1505    return pages;
1506 }
1507 
DriversPage(QObject * parent)1508 DriversPage::DriversPage(QObject *parent) :
1509    OptionsPage(parent)
1510 {
1511    setDisplayName(MENU_ENUM_LABEL_VALUE_DRIVER_SETTINGS);
1512 }
1513 
widget()1514 QWidget *DriversPage::widget()
1515 {
1516    return create_widget(DISPLAYLIST_DRIVER_SETTINGS_LIST);
1517 }
1518 
1519 /* DIRECTORY */
1520 
DirectoryCategory(QWidget * parent)1521 DirectoryCategory::DirectoryCategory(QWidget *parent) :
1522    OptionsCategory(parent)
1523 {
1524    setDisplayName(MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS);
1525    setCategoryIcon("folder");
1526 }
1527 
pages()1528 QVector<OptionsPage*> DirectoryCategory::pages()
1529 {
1530    QVector<OptionsPage*> pages;
1531 
1532    pages << new DirectoryPage(this);
1533 
1534    return pages;
1535 }
1536 
DirectoryPage(QObject * parent)1537 DirectoryPage::DirectoryPage(QObject *parent) :
1538    OptionsPage(parent)
1539 {
1540 }
1541 
widget()1542 QWidget *DirectoryPage::widget()
1543 {
1544    return create_widget(DISPLAYLIST_DIRECTORY_SETTINGS_LIST);
1545 }
1546 
1547 /* CONFIGURATION */
1548 
ConfigurationCategory(QWidget * parent)1549 ConfigurationCategory::ConfigurationCategory(QWidget *parent) :
1550    OptionsCategory(parent)
1551 {
1552    setDisplayName(MENU_ENUM_LABEL_VALUE_CONFIGURATION_SETTINGS);
1553    setCategoryIcon("setting");
1554 }
1555 
pages()1556 QVector<OptionsPage*> ConfigurationCategory::pages()
1557 {
1558    QVector<OptionsPage*> pages;
1559 
1560    pages << new ConfigurationPage(this);
1561 
1562    return pages;
1563 }
1564 
ConfigurationPage(QObject * parent)1565 ConfigurationPage::ConfigurationPage(QObject *parent) :
1566    OptionsPage(parent)
1567 {
1568 }
1569 
widget()1570 QWidget *ConfigurationPage::widget()
1571 {
1572    return create_widget(DISPLAYLIST_CONFIGURATION_SETTINGS_LIST);
1573 }
1574 
1575 /* CORE */
1576 
CoreCategory(QWidget * parent)1577 CoreCategory::CoreCategory(QWidget *parent) :
1578    OptionsCategory(parent)
1579 {
1580    setDisplayName(MENU_ENUM_LABEL_VALUE_CORE_SETTINGS);
1581    setCategoryIcon("core-options");
1582 }
1583 
pages()1584 QVector<OptionsPage*> CoreCategory::pages()
1585 {
1586    QVector<OptionsPage*> pages;
1587 
1588    pages << new CorePage(this);
1589 
1590    return pages;
1591 }
1592 
CorePage(QObject * parent)1593 CorePage::CorePage(QObject *parent) :
1594    OptionsPage(parent)
1595 {
1596 }
1597 
widget()1598 QWidget *CorePage::widget()
1599 {
1600    return create_widget(DISPLAYLIST_CORE_SETTINGS_LIST);
1601 }
1602 
1603 /* LOGGING */
1604 
LoggingCategory(QWidget * parent)1605 LoggingCategory::LoggingCategory(QWidget *parent) :
1606    OptionsCategory(parent)
1607 {
1608    setDisplayName(MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS);
1609    setCategoryIcon("menu_log");
1610 }
1611 
pages()1612 QVector<OptionsPage*> LoggingCategory::pages()
1613 {
1614    QVector<OptionsPage*> pages;
1615 
1616    pages << new LoggingPage(this);
1617 
1618    return pages;
1619 }
1620 
LoggingPage(QObject * parent)1621 LoggingPage::LoggingPage(QObject *parent) :
1622    OptionsPage(parent)
1623 {
1624 }
1625 
widget()1626 QWidget *LoggingPage::widget()
1627 {
1628    return create_widget(DISPLAYLIST_LOGGING_SETTINGS_LIST);
1629 }
1630 
1631 /* AI SERVICE */
1632 
AIServiceCategory(QWidget * parent)1633 AIServiceCategory::AIServiceCategory(QWidget *parent) :
1634    OptionsCategory(parent)
1635 {
1636    setDisplayName(MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS);
1637    setCategoryIcon("menu_drivers");
1638 }
1639 
pages()1640 QVector<OptionsPage*> AIServiceCategory::pages()
1641 {
1642    QVector<OptionsPage*> pages;
1643 
1644    pages << new AIServicePage(this);
1645 
1646    return pages;
1647 }
1648 
AIServicePage(QObject * parent)1649 AIServicePage::AIServicePage(QObject *parent) :
1650    OptionsPage(parent)
1651 {
1652    setDisplayName(MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS);
1653 }
1654 
widget()1655 QWidget *AIServicePage::widget()
1656 {
1657    return create_widget(DISPLAYLIST_AI_SERVICE_SETTINGS_LIST);
1658 }
1659 
1660 /* FRAME THROTTLE */
1661 
FrameThrottleCategory(QWidget * parent)1662 FrameThrottleCategory::FrameThrottleCategory(QWidget *parent) :
1663    OptionsCategory(parent)
1664 {
1665    setDisplayName(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS);
1666    setCategoryIcon("menu_frameskip");
1667 }
1668 
pages()1669 QVector<OptionsPage*> FrameThrottleCategory::pages()
1670 {
1671    QVector<OptionsPage*> pages;
1672 
1673    pages << new FrameThrottlePage(this);
1674    pages << new RewindPage(this);
1675 
1676    return pages;
1677 }
1678 
FrameThrottlePage(QObject * parent)1679 FrameThrottlePage::FrameThrottlePage(QObject *parent) :
1680    OptionsPage(parent)
1681 {
1682    setDisplayName(MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS);
1683 }
1684 
widget()1685 QWidget *FrameThrottlePage::widget()
1686 {
1687    return create_widget(DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST);
1688 }
1689 
RewindPage(QObject * parent)1690 RewindPage::RewindPage(QObject *parent) :
1691    OptionsPage(parent)
1692 {
1693    setDisplayName(MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS);
1694 }
1695 
widget()1696 QWidget *RewindPage::widget()
1697 {
1698    return create_widget(DISPLAYLIST_REWIND_SETTINGS_LIST);
1699 }
1700