Qt: move firmware settings to the advanced tab

This commit is contained in:
Megamouse 2019-12-14 12:14:51 +01:00
parent 97fb08935e
commit 725761f282
3 changed files with 362 additions and 327 deletions

View File

@ -1,5 +1,12 @@
{
"advanced": {
"libraries": {
"manual": "Allows the user to manually choose the LLE libraries to load.\nIf unsure, don't use this option. Nothing will work if you use this.",
"both": "Load libsysmodule.sprx and chosen list of libraries. Option for backward compatibility.\nIf unsure, don't use this option.",
"liblv2both": "Loads liblv2.sprx and chosen list of libraries.\nIf unsure, don't use this option.",
"liblv2list": "Loads liblv2.sprx and nothing but selected libraries.\nDon't use this option.",
"liblv2": "This closely emulates how games can load and unload system module files on a real PlayStation 3.\nSome games require this.\nThis is the preferred option."
},
"debugConsoleMode": "Increases the amount of usable system memory to match a DECR console and more.\nCauses some software to behave differently than on retail hardware.",
"readColor": "Initializes render target memory using vm memory.",
"readDepth": "Initializes render target memory using vm memory.",
@ -36,13 +43,6 @@
"ASMJIT": "This is the fast option with very good compatibility.\nIf unsure, use this option.",
"LLVM": "This is the fastest option with very good compatibility.\nRecompiles the game's SPU LLVM cache before running which adds extra start-up time.\nIf you experience issues, use the ASMJIT Recompiler."
},
"libraries": {
"manual": "Allows the user to manually choose the LLE libraries to load.\nIf unsure, don't use this option. Nothing will work if you use this.",
"both": "Load libsysmodule.sprx and chosen list of libraries. Option for backward compatibility.\nIf unsure, don't use this option.",
"liblv2both": "Loads liblv2.sprx and chosen list of libraries.\nIf unsure, don't use this option.",
"liblv2list": "Loads liblv2.sprx and nothing but selected libraries.\nDon't use this option.",
"liblv2": "This closely emulates how games can load and unload system module files on a real PlayStation 3.\nSome games require this.\nThis is the preferred option."
},
"checkboxes": {
"accurateXFloat": "Fixes bugs in various games at the cost of performance.\nThis setting is only applied when SPU LLVM is active.",
"spuCache": "Should normally stay enabled.\nDisable this if the cache becomes too large.\nDisabling it does not remove the existing cache.",

View File

@ -80,7 +80,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
QJsonObject json_cpu_spu = json_cpu.value("SPU").toObject();
QJsonObject json_cpu_cbs = json_cpu.value("checkboxes").toObject();
QJsonObject json_cpu_cbo = json_cpu.value("comboboxes").toObject();
QJsonObject json_cpu_lib = json_cpu.value("libraries").toObject();
QJsonObject json_gpu = json_obj.value("gpu").toObject();
QJsonObject json_gpu_cbo = json_gpu.value("comboboxes").toObject();
@ -92,7 +91,8 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
QJsonObject json_sys = json_obj.value("system").toObject();
QJsonObject json_net = json_obj.value("network").toObject();
QJsonObject json_advanced = json_obj.value("advanced").toObject();
QJsonObject json_advanced = json_obj.value("advanced").toObject();
QJsonObject json_advanced_libs = json_advanced.value("libraries").toObject();
QJsonObject json_emu = json_obj.value("emulator").toObject();
QJsonObject json_emu_misc = json_emu.value("misc").toObject();
@ -309,151 +309,6 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
ui->spu_llvm->setEnabled(false);
#endif
// lib options tool tips
SubscribeTooltip(ui->lib_manu, json_cpu_lib["manual"].toString());
SubscribeTooltip(ui->lib_both, json_cpu_lib["both"].toString());
SubscribeTooltip(ui->lib_lv2, json_cpu_lib["liblv2"].toString());
SubscribeTooltip(ui->lib_lv2b, json_cpu_lib["liblv2both"].toString());
SubscribeTooltip(ui->lib_lv2l, json_cpu_lib["liblv2list"].toString());
// creating this in ui file keeps scrambling the order...
QButtonGroup *libModeBG = new QButtonGroup(this);
libModeBG->addButton(ui->lib_manu, static_cast<int>(lib_loading_type::manual));
libModeBG->addButton(ui->lib_both, static_cast<int>(lib_loading_type::hybrid));
libModeBG->addButton(ui->lib_lv2, static_cast<int>(lib_loading_type::liblv2only));
libModeBG->addButton(ui->lib_lv2b, static_cast<int>(lib_loading_type::liblv2both));
libModeBG->addButton(ui->lib_lv2l, static_cast<int>(lib_loading_type::liblv2list));
{// Handle lib loading options
QString selectedLib = qstr(xemu_settings->GetSetting(emu_settings::LibLoadOptions));
QStringList libmode_list = xemu_settings->GetSettingOptions(emu_settings::LibLoadOptions);
for (int i = 0; i < libmode_list.count(); i++)
{
libModeBG->button(i)->setText(libmode_list[i]);
if (libmode_list[i] == selectedLib)
{
libModeBG->button(i)->setChecked(true);
}
connect(libModeBG->button(i), &QAbstractButton::clicked, [=]()
{
xemu_settings->SetSetting(emu_settings::LibLoadOptions, sstr(libmode_list[i]));
});
}
}
// Sort string vector alphabetically
static const auto sort_string_vector = [](std::vector<std::string>& vec)
{
std::sort(vec.begin(), vec.end(), [](const std::string &str1, const std::string &str2) { return str1 < str2; });
};
std::vector<std::string> loadedLibs = xemu_settings->GetLoadedLibraries();
sort_string_vector(loadedLibs);
for (const auto& lib : loadedLibs)
{
QListWidgetItem* item = new QListWidgetItem(qstr(lib), ui->lleList);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // set checkable flag
item->setCheckState(Qt::Checked); // AND initialize check state
ui->lleList->addItem(item);
}
const std::string lle_dir = g_cfg.vfs.get_dev_flash() + "sys/external/";
std::unordered_set<std::string> set(loadedLibs.begin(), loadedLibs.end());
std::vector<std::string> lle_module_list_unselected;
for (const auto& prxf : fs::dir(lle_dir))
{
// List found unselected modules
if (prxf.is_directory || (prxf.name.substr(std::max<size_t>(size_t(3), prxf.name.length()) - 4)) != "sprx")
{
continue;
}
if (verify_npdrm_self_headers(fs::file(lle_dir + prxf.name)) && !set.count(prxf.name))
{
lle_module_list_unselected.push_back(prxf.name);
}
}
sort_string_vector(lle_module_list_unselected);
for (const auto& lib : lle_module_list_unselected)
{
QListWidgetItem* item = new QListWidgetItem(qstr(lib), ui->lleList);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // set checkable flag
item->setCheckState(Qt::Unchecked); // AND initialize check state
ui->lleList->addItem(item);
}
ui->searchBox->setPlaceholderText(tr("Search libraries"));
auto l_OnLibButtonClicked = [=](int ind)
{
if (ind != static_cast<int>(lib_loading_type::liblv2only))
{
ui->searchBox->setEnabled(true);
ui->lleList->setEnabled(true);
}
else
{
ui->searchBox->setEnabled(false);
ui->lleList->setEnabled(false);
}
};
auto l_OnSearchBoxTextChanged = [=](QString text)
{
QString searchTerm = text.toLower();
std::vector<QListWidgetItem*> items;
// duplicate current items, we need clones to preserve checkstates
for (int i = 0; i < ui->lleList->count(); i++)
{
items.push_back(ui->lleList->item(i)->clone());
}
// sort items: checked items first then alphabetical order
std::sort(items.begin(), items.end(), [](QListWidgetItem *i1, QListWidgetItem *i2)
{
return (i1->checkState() != i2->checkState()) ? (i1->checkState() > i2->checkState()) : (i1->text() < i2->text());
});
// refill library list
ui->lleList->clear();
for (uint i = 0; i < items.size(); i++)
{
ui->lleList->addItem(items[i]);
// only show items filtered for search text
ui->lleList->setRowHidden(i, !items[i]->text().contains(searchTerm));
}
};
// Events
connect(libModeBG, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), l_OnLibButtonClicked);
connect(ui->searchBox, &QLineEdit::textChanged, l_OnSearchBoxTextChanged);
// enable multiselection (there must be a better way)
connect(ui->lleList, &QListWidget::itemChanged, [&](QListWidgetItem* item)
{
for (auto cb : ui->lleList->selectedItems())
{
cb->setCheckState(item->checkState());
}
});
int buttid = libModeBG->checkedId();
if (buttid != -1)
{
l_OnLibButtonClicked(buttid);
}
// _____ _____ _ _ _______ _
// / ____| __ \| | | | |__ __| | |
// | | __| |__) | | | | | | __ _| |__
@ -1108,6 +963,151 @@ settings_dialog::settings_dialog(std::shared_ptr<gui_settings> guiSettings, std:
SubscribeTooltip(ui->clockScale, json_advanced["clocksScale"].toString());
}
// lib options tool tips
SubscribeTooltip(ui->lib_manu, json_advanced_libs["manual"].toString());
SubscribeTooltip(ui->lib_both, json_advanced_libs["both"].toString());
SubscribeTooltip(ui->lib_lv2, json_advanced_libs["liblv2"].toString());
SubscribeTooltip(ui->lib_lv2b, json_advanced_libs["liblv2both"].toString());
SubscribeTooltip(ui->lib_lv2l, json_advanced_libs["liblv2list"].toString());
// creating this in ui file keeps scrambling the order...
QButtonGroup *libModeBG = new QButtonGroup(this);
libModeBG->addButton(ui->lib_manu, static_cast<int>(lib_loading_type::manual));
libModeBG->addButton(ui->lib_both, static_cast<int>(lib_loading_type::hybrid));
libModeBG->addButton(ui->lib_lv2, static_cast<int>(lib_loading_type::liblv2only));
libModeBG->addButton(ui->lib_lv2b, static_cast<int>(lib_loading_type::liblv2both));
libModeBG->addButton(ui->lib_lv2l, static_cast<int>(lib_loading_type::liblv2list));
{// Handle lib loading options
QString selectedLib = qstr(xemu_settings->GetSetting(emu_settings::LibLoadOptions));
QStringList libmode_list = xemu_settings->GetSettingOptions(emu_settings::LibLoadOptions);
for (int i = 0; i < libmode_list.count(); i++)
{
libModeBG->button(i)->setText(libmode_list[i]);
if (libmode_list[i] == selectedLib)
{
libModeBG->button(i)->setChecked(true);
}
connect(libModeBG->button(i), &QAbstractButton::clicked, [=]()
{
xemu_settings->SetSetting(emu_settings::LibLoadOptions, sstr(libmode_list[i]));
});
}
}
// Sort string vector alphabetically
static const auto sort_string_vector = [](std::vector<std::string>& vec)
{
std::sort(vec.begin(), vec.end(), [](const std::string &str1, const std::string &str2) { return str1 < str2; });
};
std::vector<std::string> loadedLibs = xemu_settings->GetLoadedLibraries();
sort_string_vector(loadedLibs);
for (const auto& lib : loadedLibs)
{
QListWidgetItem* item = new QListWidgetItem(qstr(lib), ui->lleList);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // set checkable flag
item->setCheckState(Qt::Checked); // AND initialize check state
ui->lleList->addItem(item);
}
const std::string lle_dir = g_cfg.vfs.get_dev_flash() + "sys/external/";
std::unordered_set<std::string> set(loadedLibs.begin(), loadedLibs.end());
std::vector<std::string> lle_module_list_unselected;
for (const auto& prxf : fs::dir(lle_dir))
{
// List found unselected modules
if (prxf.is_directory || (prxf.name.substr(std::max<size_t>(size_t(3), prxf.name.length()) - 4)) != "sprx")
{
continue;
}
if (verify_npdrm_self_headers(fs::file(lle_dir + prxf.name)) && !set.count(prxf.name))
{
lle_module_list_unselected.push_back(prxf.name);
}
}
sort_string_vector(lle_module_list_unselected);
for (const auto& lib : lle_module_list_unselected)
{
QListWidgetItem* item = new QListWidgetItem(qstr(lib), ui->lleList);
item->setFlags(item->flags() | Qt::ItemIsUserCheckable); // set checkable flag
item->setCheckState(Qt::Unchecked); // AND initialize check state
ui->lleList->addItem(item);
}
ui->searchBox->setPlaceholderText(tr("Search libraries"));
auto l_OnLibButtonClicked = [=](int ind)
{
if (ind != static_cast<int>(lib_loading_type::liblv2only))
{
ui->searchBox->setEnabled(true);
ui->lleList->setEnabled(true);
}
else
{
ui->searchBox->setEnabled(false);
ui->lleList->setEnabled(false);
}
};
auto l_OnSearchBoxTextChanged = [=](QString text)
{
QString searchTerm = text.toLower();
std::vector<QListWidgetItem*> items;
// duplicate current items, we need clones to preserve checkstates
for (int i = 0; i < ui->lleList->count(); i++)
{
items.push_back(ui->lleList->item(i)->clone());
}
// sort items: checked items first then alphabetical order
std::sort(items.begin(), items.end(), [](QListWidgetItem *i1, QListWidgetItem *i2)
{
return (i1->checkState() != i2->checkState()) ? (i1->checkState() > i2->checkState()) : (i1->text() < i2->text());
});
// refill library list
ui->lleList->clear();
for (uint i = 0; i < items.size(); i++)
{
ui->lleList->addItem(items[i]);
// only show items filtered for search text
ui->lleList->setRowHidden(i, !items[i]->text().contains(searchTerm));
}
};
// Events
connect(libModeBG, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), l_OnLibButtonClicked);
connect(ui->searchBox, &QLineEdit::textChanged, l_OnSearchBoxTextChanged);
// enable multiselection (there must be a better way)
connect(ui->lleList, &QListWidget::itemChanged, [&](QListWidgetItem* item)
{
for (auto cb : ui->lleList->selectedItems())
{
cb->setCheckState(item->checkState());
}
});
int buttid = libModeBG->checkedId();
if (buttid != -1)
{
l_OnLibButtonClicked(buttid);
}
// ______ _ _ _______ _
// | ____| | | | | |__ __| | |
// | |__ _ __ ___ _ _| | __ _| |_ ___ _ __ | | __ _| |__

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>752</width>
<height>584</height>
<width>753</width>
<height>597</height>
</rect>
</property>
<property name="sizePolicy">
@ -42,11 +42,11 @@
<attribute name="title">
<string>CPU</string>
</attribute>
<layout class="QVBoxLayout" name="coreTabLayout" stretch="1,0,0">
<layout class="QVBoxLayout" name="coreTabLayout">
<item>
<layout class="QHBoxLayout" name="coreTabItemLayout" stretch="1,1,1">
<item>
<layout class="QVBoxLayout" name="coreTabLeftLayout" stretch="1,1,0">
<layout class="QVBoxLayout" name="coreTabLeftLayout">
<item>
<widget class="QGroupBox" name="ppu">
<property name="title">
@ -115,107 +115,25 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_spu_threads">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<spacer name="verticalSpacer_24">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="title">
<string>Preferred SPU Threads</string>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_51">
<item>
<widget class="QComboBox" name="preferredSPUThreads"/>
</item>
</layout>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="coreTabMiddleLayout" stretch="1,1,0">
<item>
<widget class="QGroupBox" name="lib_settings">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Firmware Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="lib_manu">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Manually load selected libraries</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_both">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load automatic and manual selection</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx only</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2b">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx and manual selection</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2l">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx and strict selection</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<layout class="QVBoxLayout" name="coreTabMiddleLayout">
<item>
<widget class="QGroupBox" name="checkboxes">
<property name="title">
@ -261,68 +179,25 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_spuBlockSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<spacer name="verticalSpacer_25">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="title">
<string>SPU Block Size</string>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QComboBox" name="spuBlockSize"/>
</item>
</layout>
</widget>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="coreTabRightLayout" stretch="1,0">
<item>
<widget class="QGroupBox" name="gb_libs">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Firmware Libraries</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QListWidget" name="lleList">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="searchBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<layout class="QVBoxLayout" name="coreTabRightLayout" stretch="0,0,0,0">
<item>
<widget class="QGroupBox" name="gb_tsx">
<property name="sizePolicy">
@ -341,6 +216,58 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_spuBlockSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>SPU Block Size</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QComboBox" name="spuBlockSize"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="gb_spu_threads">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Preferred SPU Threads</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_51">
<item>
<widget class="QComboBox" name="preferredSPUThreads"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_26">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
@ -1640,6 +1567,86 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="lib_settings">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Firmware Settings</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="lib_manu">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Manually load selected libraries</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_both">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load automatic and manual selection</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx only</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2b">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx and manual selection</string>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="lib_lv2l">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Load liblv2.sprx and strict selection</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_23">
<property name="orientation">
@ -1655,6 +1662,51 @@
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="VerticalLayout_87">
<item>
<widget class="QGroupBox" name="gb_libs">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Firmware Libraries</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<widget class="QListWidget" name="lleList">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::ExtendedSelection</enum>
</property>
<property name="viewMode">
<enum>QListView::ListMode</enum>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="searchBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="VerticalLayout_88">
<item>
@ -1700,23 +1752,6 @@
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_22">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="VerticalLayout_87">
<item>
<widget class="QGroupBox" name="gb_vblank">
<property name="sizePolicy">
@ -1804,7 +1839,7 @@
</widget>
</item>
<item>
<spacer name="verticalSpacer_21">
<spacer name="verticalSpacer_22">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>