Enhance Infinity Manager Figure Creator Dialog (#17529)
## Summary This will enhance and add filters for the Figure Creator dialog of Infinity manager, adding selectable filters for the character dropdown and displays the series number after the figure/power disc. ## Changes - Added filter buttons for Disney Infinity 1.0, 2.0, 3.0, and "All" - Character names now display series information (e.g., "Buzz Lightyear (1.0)") - Dynamic dropdown population based on selected filter - Maintains all existing functionality and slot validation ## Benefits - Easier character discovery in large character lists - Better organization by game series
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <QPushButton>
|
||||
#include <QStringList>
|
||||
#include <QCompleter>
|
||||
#include <QButtonGroup>
|
||||
|
||||
infinity_dialog* infinity_dialog::inst = nullptr;
|
||||
std::array<std::optional<u32>, 9> infinity_dialog::figure_slots = {};
|
||||
@@ -407,16 +408,51 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||
{
|
||||
setWindowTitle(tr("Figure Creator"));
|
||||
setObjectName("figure_creator");
|
||||
setMinimumSize(QSize(500, 150));
|
||||
setMinimumSize(QSize(500, 200));
|
||||
|
||||
QVBoxLayout* vbox_panel = new QVBoxLayout();
|
||||
|
||||
// Add series filter buttons
|
||||
QHBoxLayout* hbox_filters = new QHBoxLayout();
|
||||
QLabel* filter_label = new QLabel(tr("Filter by Series:"));
|
||||
QPushButton* btn_all = new QPushButton(tr("All"));
|
||||
QPushButton* btn_series1 = new QPushButton(tr("1.0"));
|
||||
QPushButton* btn_series2 = new QPushButton(tr("2.0"));
|
||||
QPushButton* btn_series3 = new QPushButton(tr("3.0"));
|
||||
|
||||
// Style the active filter button
|
||||
btn_all->setCheckable(true);
|
||||
btn_series1->setCheckable(true);
|
||||
btn_series2->setCheckable(true);
|
||||
btn_series3->setCheckable(true);
|
||||
btn_all->setChecked(true); // Default to "All"
|
||||
|
||||
hbox_filters->addWidget(filter_label);
|
||||
hbox_filters->addWidget(btn_all);
|
||||
hbox_filters->addWidget(btn_series1);
|
||||
hbox_filters->addWidget(btn_series2);
|
||||
hbox_filters->addWidget(btn_series3);
|
||||
hbox_filters->addStretch();
|
||||
|
||||
vbox_panel->addLayout(hbox_filters);
|
||||
|
||||
QComboBox* combo_figlist = new QComboBox();
|
||||
|
||||
// Lambda to populate the combo box based on series filter
|
||||
auto populate_combo = [=](int series_filter) -> u32
|
||||
{
|
||||
combo_figlist->clear();
|
||||
QStringList filterlist;
|
||||
u32 first_entry = 0;
|
||||
|
||||
for (const auto& [figure, entry] : list_figures)
|
||||
{
|
||||
const auto& [num, figure_name] = entry;
|
||||
|
||||
// Apply series filter (0 = all, 1-3 = specific series)
|
||||
if (series_filter != 0 && num != series_filter)
|
||||
continue;
|
||||
|
||||
// Only display entry if it is a piece appropriate for the slot
|
||||
if ((slot == 0 &&
|
||||
((figure > 0x1E8480 && figure < 0x2DC6BF) || (figure > 0x3D0900 && figure < 0x4C4B3F))) ||
|
||||
@@ -425,11 +461,12 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||
((slot == 4 || slot == 5 || slot == 7 || slot == 8) &&
|
||||
(figure > 0x2DC6C0 && figure < 0x3D08FF)))
|
||||
{
|
||||
const auto& [num, figure_name] = entry;
|
||||
const u32 qnum = (figure << 8) | num;
|
||||
QString name = QString::fromStdString(figure_name);
|
||||
combo_figlist->addItem(name, QVariant(qnum));
|
||||
filterlist << std::move(name);
|
||||
const QString name = QString::fromStdString(figure_name);
|
||||
// Add series indicator to the name for clarity
|
||||
QString display_name = QString("%1 (%2.0)").arg(name).arg(num);
|
||||
combo_figlist->addItem(display_name, QVariant(qnum));
|
||||
filterlist << std::move(display_name);
|
||||
if (first_entry == 0)
|
||||
{
|
||||
first_entry = figure;
|
||||
@@ -442,12 +479,24 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||
combo_figlist->setInsertPolicy(QComboBox::NoInsert);
|
||||
combo_figlist->model()->sort(0, Qt::AscendingOrder);
|
||||
|
||||
// Update completer with new filter list
|
||||
QCompleter* co_compl = new QCompleter(filterlist, this);
|
||||
co_compl->setCaseSensitivity(Qt::CaseInsensitive);
|
||||
co_compl->setCompletionMode(QCompleter::PopupCompletion);
|
||||
co_compl->setFilterMode(Qt::MatchContains);
|
||||
combo_figlist->setCompleter(co_compl);
|
||||
|
||||
connect(co_compl, QOverload<const QString&>::of(&QCompleter::activated), [=](const QString& text)
|
||||
{
|
||||
combo_figlist->setCurrentIndex(combo_figlist->findText(text));
|
||||
});
|
||||
|
||||
return first_entry;
|
||||
};
|
||||
|
||||
// Initially populate with all figures
|
||||
u32 first_entry = populate_combo(0);
|
||||
|
||||
vbox_panel->addWidget(combo_figlist);
|
||||
|
||||
QFrame* line = new QFrame();
|
||||
@@ -480,6 +529,18 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||
|
||||
setLayout(vbox_panel);
|
||||
|
||||
// Connect filter buttons using QButtonGroup
|
||||
QButtonGroup* filter_group = new QButtonGroup(this);
|
||||
filter_group->addButton(btn_all, 0); // ID 0 for "All"
|
||||
filter_group->addButton(btn_series1, 1); // ID 1 for series 1
|
||||
filter_group->addButton(btn_series2, 2); // ID 2 for series 2
|
||||
filter_group->addButton(btn_series3, 3); // ID 3 for series 3
|
||||
|
||||
connect(filter_group, QOverload<int>::of(&QButtonGroup::idClicked), [=](int id)
|
||||
{
|
||||
populate_combo(id);
|
||||
});
|
||||
|
||||
connect(combo_figlist, QOverload<int>::of(&QComboBox::currentIndexChanged), [=](int index)
|
||||
{
|
||||
const u32 fig_info = combo_figlist->itemData(index).toUInt();
|
||||
@@ -534,11 +595,6 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||
});
|
||||
|
||||
connect(btn_cancel, &QAbstractButton::clicked, this, &QDialog::reject);
|
||||
|
||||
connect(co_compl, QOverload<const QString&>::of(&QCompleter::activated), [=](const QString& text)
|
||||
{
|
||||
combo_figlist->setCurrentIndex(combo_figlist->findText(text));
|
||||
});
|
||||
}
|
||||
|
||||
bool figure_creator_dialog::create_blank_figure(u32 character, u8 series)
|
||||
|
||||
Reference in New Issue
Block a user