mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-06 07:12:28 +01:00
Enhance Infinity Manager Figure Creator Dialog (#17529)
Some checks failed
Generate Translation Template / Generate Translation Template (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux-aarch64.sh, gcc, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Has been cancelled
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (51ae32f468089a8169aaf1567de355ff4a3e0842, rpcs3/rpcs3-binaries-mac, .ci/build-mac.sh, Intel) (push) Has been cancelled
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (8e21bdbc40711a3fccd18fbf17b742348b0f4281, rpcs3/rpcs3-binaries-mac-arm64, .ci/build-mac-arm64.sh, Apple Silicon) (push) Has been cancelled
Build RPCS3 / RPCS3 Windows (push) Has been cancelled
Build RPCS3 / RPCS3 Windows Clang (win64, clang, clang64) (push) Has been cancelled
Build RPCS3 / RPCS3 FreeBSD (push) Has been cancelled
Some checks failed
Generate Translation Template / Generate Translation Template (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux-aarch64.sh, gcc, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Has been cancelled
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Has been cancelled
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (51ae32f468089a8169aaf1567de355ff4a3e0842, rpcs3/rpcs3-binaries-mac, .ci/build-mac.sh, Intel) (push) Has been cancelled
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (8e21bdbc40711a3fccd18fbf17b742348b0f4281, rpcs3/rpcs3-binaries-mac-arm64, .ci/build-mac-arm64.sh, Apple Silicon) (push) Has been cancelled
Build RPCS3 / RPCS3 Windows (push) Has been cancelled
Build RPCS3 / RPCS3 Windows Clang (win64, clang, clang64) (push) Has been cancelled
Build RPCS3 / RPCS3 FreeBSD (push) Has been cancelled
## 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:
parent
359163c442
commit
6fe6c4e0f6
|
|
@ -14,6 +14,7 @@
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
#include <QCompleter>
|
#include <QCompleter>
|
||||||
|
#include <QButtonGroup>
|
||||||
|
|
||||||
infinity_dialog* infinity_dialog::inst = nullptr;
|
infinity_dialog* infinity_dialog::inst = nullptr;
|
||||||
std::array<std::optional<u32>, 9> infinity_dialog::figure_slots = {};
|
std::array<std::optional<u32>, 9> infinity_dialog::figure_slots = {};
|
||||||
|
|
@ -407,46 +408,94 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||||
{
|
{
|
||||||
setWindowTitle(tr("Figure Creator"));
|
setWindowTitle(tr("Figure Creator"));
|
||||||
setObjectName("figure_creator");
|
setObjectName("figure_creator");
|
||||||
setMinimumSize(QSize(500, 150));
|
setMinimumSize(QSize(500, 200));
|
||||||
|
|
||||||
QVBoxLayout* vbox_panel = new QVBoxLayout();
|
QVBoxLayout* vbox_panel = new QVBoxLayout();
|
||||||
|
|
||||||
QComboBox* combo_figlist = new QComboBox();
|
// Add series filter buttons
|
||||||
QStringList filterlist;
|
QHBoxLayout* hbox_filters = new QHBoxLayout();
|
||||||
u32 first_entry = 0;
|
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"));
|
||||||
|
|
||||||
for (const auto& [figure, entry] : list_figures)
|
// 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
|
||||||
{
|
{
|
||||||
// Only display entry if it is a piece appropriate for the slot
|
combo_figlist->clear();
|
||||||
if ((slot == 0 &&
|
QStringList filterlist;
|
||||||
((figure > 0x1E8480 && figure < 0x2DC6BF) || (figure > 0x3D0900 && figure < 0x4C4B3F))) ||
|
u32 first_entry = 0;
|
||||||
((slot == 1 || slot == 2) && (figure > 0x3D0900 && figure < 0x4C4B3F)) ||
|
|
||||||
((slot == 3 || slot == 6) && figure < 0x1E847F) ||
|
for (const auto& [figure, entry] : list_figures)
|
||||||
((slot == 4 || slot == 5 || slot == 7 || slot == 8) &&
|
|
||||||
(figure > 0x2DC6C0 && figure < 0x3D08FF)))
|
|
||||||
{
|
{
|
||||||
const auto& [num, figure_name] = entry;
|
const auto& [num, figure_name] = entry;
|
||||||
const u32 qnum = (figure << 8) | num;
|
|
||||||
QString name = QString::fromStdString(figure_name);
|
// Apply series filter (0 = all, 1-3 = specific series)
|
||||||
combo_figlist->addItem(name, QVariant(qnum));
|
if (series_filter != 0 && num != series_filter)
|
||||||
filterlist << std::move(name);
|
continue;
|
||||||
if (first_entry == 0)
|
|
||||||
|
// Only display entry if it is a piece appropriate for the slot
|
||||||
|
if ((slot == 0 &&
|
||||||
|
((figure > 0x1E8480 && figure < 0x2DC6BF) || (figure > 0x3D0900 && figure < 0x4C4B3F))) ||
|
||||||
|
((slot == 1 || slot == 2) && (figure > 0x3D0900 && figure < 0x4C4B3F)) ||
|
||||||
|
((slot == 3 || slot == 6) && figure < 0x1E847F) ||
|
||||||
|
((slot == 4 || slot == 5 || slot == 7 || slot == 8) &&
|
||||||
|
(figure > 0x2DC6C0 && figure < 0x3D08FF)))
|
||||||
{
|
{
|
||||||
first_entry = figure;
|
const u32 qnum = (figure << 8) | num;
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFFFFFF));
|
combo_figlist->addItem(tr("--Unknown--"), QVariant(0xFFFFFFFF));
|
||||||
combo_figlist->setEditable(true);
|
combo_figlist->setEditable(true);
|
||||||
combo_figlist->setInsertPolicy(QComboBox::NoInsert);
|
combo_figlist->setInsertPolicy(QComboBox::NoInsert);
|
||||||
combo_figlist->model()->sort(0, Qt::AscendingOrder);
|
combo_figlist->model()->sort(0, Qt::AscendingOrder);
|
||||||
|
|
||||||
QCompleter* co_compl = new QCompleter(filterlist, this);
|
// Update completer with new filter list
|
||||||
co_compl->setCaseSensitivity(Qt::CaseInsensitive);
|
QCompleter* co_compl = new QCompleter(filterlist, this);
|
||||||
co_compl->setCompletionMode(QCompleter::PopupCompletion);
|
co_compl->setCaseSensitivity(Qt::CaseInsensitive);
|
||||||
co_compl->setFilterMode(Qt::MatchContains);
|
co_compl->setCompletionMode(QCompleter::PopupCompletion);
|
||||||
combo_figlist->setCompleter(co_compl);
|
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);
|
vbox_panel->addWidget(combo_figlist);
|
||||||
|
|
||||||
|
|
@ -480,65 +529,72 @@ figure_creator_dialog::figure_creator_dialog(QWidget* parent, u8 slot)
|
||||||
|
|
||||||
setLayout(vbox_panel);
|
setLayout(vbox_panel);
|
||||||
|
|
||||||
connect(combo_figlist, QOverload<int>::of(&QComboBox::currentIndexChanged), [=](int index)
|
// Connect filter buttons using QButtonGroup
|
||||||
{
|
QButtonGroup* filter_group = new QButtonGroup(this);
|
||||||
const u32 fig_info = combo_figlist->itemData(index).toUInt();
|
filter_group->addButton(btn_all, 0); // ID 0 for "All"
|
||||||
if (fig_info != 0xFFFFFFFF)
|
filter_group->addButton(btn_series1, 1); // ID 1 for series 1
|
||||||
{
|
filter_group->addButton(btn_series2, 2); // ID 2 for series 2
|
||||||
const u32 fig_num = fig_info >> 8;
|
filter_group->addButton(btn_series3, 3); // ID 3 for series 3
|
||||||
const u8 series = fig_info & 0xFF;
|
|
||||||
|
|
||||||
edit_number->setText(QString::number(fig_num));
|
connect(filter_group, QOverload<int>::of(&QButtonGroup::idClicked), [=](int id)
|
||||||
edit_series->setText(QString::number(series));
|
{
|
||||||
}
|
populate_combo(id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(combo_figlist, QOverload<int>::of(&QComboBox::currentIndexChanged), [=](int index)
|
||||||
|
{
|
||||||
|
const u32 fig_info = combo_figlist->itemData(index).toUInt();
|
||||||
|
if (fig_info != 0xFFFFFFFF)
|
||||||
|
{
|
||||||
|
const u32 fig_num = fig_info >> 8;
|
||||||
|
const u8 series = fig_info & 0xFF;
|
||||||
|
|
||||||
|
edit_number->setText(QString::number(fig_num));
|
||||||
|
edit_series->setText(QString::number(series));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
connect(btn_create, &QAbstractButton::clicked, this, [=, this]()
|
connect(btn_create, &QAbstractButton::clicked, this, [=, this]()
|
||||||
|
{
|
||||||
|
bool ok_num = false, ok_series = false;
|
||||||
|
const u32 fig_num = edit_number->text().toULong(&ok_num);
|
||||||
|
if (!ok_num)
|
||||||
{
|
{
|
||||||
bool ok_num = false, ok_series = false;
|
QMessageBox::warning(this, tr("Error converting value"), tr("Figure number entered is invalid!"), QMessageBox::Ok);
|
||||||
const u32 fig_num = edit_number->text().toULong(&ok_num);
|
return;
|
||||||
if (!ok_num)
|
}
|
||||||
{
|
const u8 series = edit_series->text().toUShort(&ok_series);
|
||||||
QMessageBox::warning(this, tr("Error converting value"), tr("Figure number entered is invalid!"), QMessageBox::Ok);
|
if (!ok_series || series > 3 || series < 1)
|
||||||
return;
|
{
|
||||||
}
|
QMessageBox::warning(this, tr("Error converting value"), tr("Series number entered is invalid!"), QMessageBox::Ok);
|
||||||
const u8 series = edit_series->text().toUShort(&ok_series);
|
return;
|
||||||
if (!ok_series || series > 3 || series < 1)
|
}
|
||||||
{
|
const auto found_figure = list_figures.find(fig_num);
|
||||||
QMessageBox::warning(this, tr("Error converting value"), tr("Series number entered is invalid!"), QMessageBox::Ok);
|
if (found_figure != list_figures.cend())
|
||||||
return;
|
{
|
||||||
}
|
s_last_figure_path += QString::fromStdString(found_figure->second.second + ".bin");
|
||||||
const auto found_figure = list_figures.find(fig_num);
|
}
|
||||||
if (found_figure != list_figures.cend())
|
else
|
||||||
{
|
{
|
||||||
s_last_figure_path += QString::fromStdString(found_figure->second.second + ".bin");
|
s_last_figure_path += QString("Unknown(%1 %2).bin").arg(fig_num).arg(series);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
s_last_figure_path += QString("Unknown(%1 %2).bin").arg(fig_num).arg(series);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_file_path = QFileDialog::getSaveFileName(this, tr("Create Figure File"), s_last_figure_path, tr("Infinity Figure (*.bin);;"));
|
m_file_path = QFileDialog::getSaveFileName(this, tr("Create Figure File"), s_last_figure_path, tr("Infinity Figure (*.bin);;"));
|
||||||
if (m_file_path.isEmpty())
|
if (m_file_path.isEmpty())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!create_blank_figure(fig_num, series))
|
if (!create_blank_figure(fig_num, series))
|
||||||
{
|
{
|
||||||
QMessageBox::warning(this, tr("Failed to create figure file!"), tr("Failed to create figure file:\n%1").arg(m_file_path), QMessageBox::Ok);
|
QMessageBox::warning(this, tr("Failed to create figure file!"), tr("Failed to create figure file:\n%1").arg(m_file_path), QMessageBox::Ok);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
s_last_figure_path = QFileInfo(m_file_path).absolutePath() + "/";
|
s_last_figure_path = QFileInfo(m_file_path).absolutePath() + "/";
|
||||||
accept();
|
accept();
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(btn_cancel, &QAbstractButton::clicked, this, &QDialog::reject);
|
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)
|
bool figure_creator_dialog::create_blank_figure(u32 character, u8 series)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue