+StorageSelectionPage::StorageSelectionPage(const QVariantList& backendInfos, QWidget* parent)
+ : QWizardPage(parent)
+{
+ ui.setupUi(this);
+
+ setTitle(tr("Select Storage Backend"));
+ setSubTitle(tr("Please select a storage backend for Quassel Core."));
+ setCommitPage(true);
+
+ registerField("storage.backend", ui.backendList);
+
+ int defaultIndex{0}; // Legacy cores send backend infos in arbitrary order
+
+ for (auto&& backendInfo : backendInfos) {
+ auto props = backendInfo.toMap();
+ // Extract field infos to avoid having to reparse the list
+ std::vector<FieldInfo> fields;
+
+ // Legacy cores (prior to 0.13) didn't send SetupData for storage backends; deal with this
+ if (!props.contains("SetupData")) {
+ const auto& defaultValues = props["SetupDefaults"].toMap();
+ for (auto&& key : props["SetupKeys"].toStringList()) {
+ fields.emplace_back(std::make_tuple(key, key, defaultValues.value(key, QString{})));
+ }
+ if (props.value("IsDefault", false).toBool()) {
+ defaultIndex = ui.backendList->count();
+ }
+ }
+ else {
+ const auto& list = props["SetupData"].toList();
+ for (int i = 0; i + 2 < list.size(); i += 3) {
+ fields.emplace_back(std::make_tuple(list[i].toString(), list[i + 1].toString(), list[i + 2]));
+ }
+ props.remove("SetupData");
+ }
+ props.remove("SetupKeys");
+ props.remove("SetupDefaults");
+ // Legacy cores (prior to 0.13) don't send the BackendId property
+ if (!props.contains("BackendId"))
+ props["BackendId"] = props["DisplayName"];
+ _backendProperties.emplace_back(std::move(props));
+ _backendFields.emplace_back(std::move(fields));
+
+ // Create widgets
+ ui.backendList->addItem(_backendProperties.back()["DisplayName"].toString(), _backendProperties.back()["BackendId"].toString());
+ ui.descriptionStack->addWidget(createDescriptionBox(_backendProperties.back()["Description"].toString()));
+ ui.storageSettingsStack->addWidget(createFieldBox(tr("Storage Settings"), _backendFields.back()));
+ }
+
+ // Do some trickery to make the page large enough
+ setSizePolicy({QSizePolicy::Fixed, QSizePolicy::Fixed});
+
+ QSizePolicy sp{QSizePolicy::MinimumExpanding, QSizePolicy::Fixed};
+ sp.setRetainSizeWhenHidden(true);
+ ui.descriptionStack->setSizePolicy(sp);
+ ui.storageSettingsStack->setSizePolicy(sp);
+
+ ui.descriptionStack->adjustSize();
+ ui.storageSettingsStack->adjustSize();
+
+ ui.backendList->setCurrentIndex(defaultIndex);
+}