Qt: Don't refresh entire list on adding/editing cheat
This commit is contained in:
parent
cb6ef03775
commit
133639122d
|
@ -165,9 +165,27 @@ QTreeWidgetItem* CheatManagerDialog::getItemForCheatIndex(u32 index) const
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 getCheatIndexFromItem(QTreeWidgetItem* item)
|
QTreeWidgetItem* CheatManagerDialog::getItemForCheatGroup(const std::string& group) const
|
||||||
{
|
{
|
||||||
return item->data(0, Qt::UserRole).toUInt();
|
const QString group_qstr(QString::fromStdString(group));
|
||||||
|
const int count = m_ui.cheatList->topLevelItemCount();
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
QTreeWidgetItem* item = m_ui.cheatList->topLevelItem(i);
|
||||||
|
if (item->text(0) == group_qstr)
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int getCheatIndexFromItem(QTreeWidgetItem* item)
|
||||||
|
{
|
||||||
|
QVariant item_data(item->data(0, Qt::UserRole));
|
||||||
|
if (!item_data.isValid())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return static_cast<int>(item_data.toUInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
int CheatManagerDialog::getSelectedCheatIndex() const
|
int CheatManagerDialog::getSelectedCheatIndex() const
|
||||||
|
@ -221,20 +239,7 @@ void CheatManagerDialog::updateCheatList()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
QTreeWidgetItem* item = new QTreeWidgetItem(group);
|
QTreeWidgetItem* item = new QTreeWidgetItem(group);
|
||||||
item->setData(0, Qt::UserRole, QVariant(static_cast<uint>(i)));
|
fillItemForCheatCode(item, i, code);
|
||||||
if (code.IsManuallyActivated())
|
|
||||||
{
|
|
||||||
item->setFlags(item->flags() & ~(Qt::ItemIsUserCheckable));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
|
||||||
item->setCheckState(0, code.enabled ? Qt::Checked : Qt::Unchecked);
|
|
||||||
}
|
|
||||||
item->setText(0, QString::fromStdString(code.description));
|
|
||||||
item->setText(1, qApp->translate("Cheats", CheatCode::GetTypeDisplayName(code.type)));
|
|
||||||
item->setText(2, qApp->translate("Cheats", CheatCode::GetActivationDisplayName(code.activation)));
|
|
||||||
item->setText(3, QString::number(static_cast<uint>(code.instructions.size())));
|
|
||||||
|
|
||||||
all_enabled &= code.enabled;
|
all_enabled &= code.enabled;
|
||||||
}
|
}
|
||||||
|
@ -250,6 +255,24 @@ void CheatManagerDialog::updateCheatList()
|
||||||
m_ui.cheatListExport->setEnabled(list->GetCodeCount() > 0);
|
m_ui.cheatListExport->setEnabled(list->GetCodeCount() > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheatManagerDialog::fillItemForCheatCode(QTreeWidgetItem* item, u32 index, const CheatCode& code)
|
||||||
|
{
|
||||||
|
item->setData(0, Qt::UserRole, QVariant(static_cast<uint>(index)));
|
||||||
|
if (code.IsManuallyActivated())
|
||||||
|
{
|
||||||
|
item->setFlags(item->flags() & ~(Qt::ItemIsUserCheckable));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
|
||||||
|
item->setCheckState(0, code.enabled ? Qt::Checked : Qt::Unchecked);
|
||||||
|
}
|
||||||
|
item->setText(0, QString::fromStdString(code.description));
|
||||||
|
item->setText(1, qApp->translate("Cheats", CheatCode::GetTypeDisplayName(code.type)));
|
||||||
|
item->setText(2, qApp->translate("Cheats", CheatCode::GetActivationDisplayName(code.activation)));
|
||||||
|
item->setText(3, QString::number(static_cast<uint>(code.instructions.size())));
|
||||||
|
}
|
||||||
|
|
||||||
void CheatManagerDialog::saveCheatList()
|
void CheatManagerDialog::saveCheatList()
|
||||||
{
|
{
|
||||||
QtHostInterface::GetInstance()->executeOnEmulationThread([]() { QtHostInterface::GetInstance()->SaveCheatList(); });
|
QtHostInterface::GetInstance()->executeOnEmulationThread([]() { QtHostInterface::GetInstance()->SaveCheatList(); });
|
||||||
|
@ -257,18 +280,19 @@ void CheatManagerDialog::saveCheatList()
|
||||||
|
|
||||||
void CheatManagerDialog::cheatListCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous)
|
void CheatManagerDialog::cheatListCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous)
|
||||||
{
|
{
|
||||||
const bool has_current = (current != nullptr);
|
const int cheat_index = current ? getCheatIndexFromItem(current) : -1;
|
||||||
|
const bool has_current = (cheat_index >= 0);
|
||||||
m_ui.cheatListEdit->setEnabled(has_current);
|
m_ui.cheatListEdit->setEnabled(has_current);
|
||||||
m_ui.cheatListRemove->setEnabled(has_current);
|
m_ui.cheatListRemove->setEnabled(has_current);
|
||||||
m_ui.cheatListActivate->setEnabled(has_current);
|
m_ui.cheatListActivate->setEnabled(has_current);
|
||||||
|
|
||||||
if (!current)
|
if (!has_current)
|
||||||
{
|
{
|
||||||
m_ui.cheatListActivate->setText(tr("Activate"));
|
m_ui.cheatListActivate->setText(tr("Activate"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const bool manual_activation = getCheatList()->GetCode(getCheatIndexFromItem(current)).IsManuallyActivated();
|
const bool manual_activation = getCheatList()->GetCode(static_cast<u32>(cheat_index)).IsManuallyActivated();
|
||||||
m_ui.cheatListActivate->setText(manual_activation ? tr("Activate") : tr("Toggle"));
|
m_ui.cheatListActivate->setText(manual_activation ? tr("Activate") : tr("Toggle"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -278,8 +302,9 @@ void CheatManagerDialog::cheatListItemActivated(QTreeWidgetItem* item)
|
||||||
if (!item)
|
if (!item)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const u32 index = getCheatIndexFromItem(item);
|
const int index = getCheatIndexFromItem(item);
|
||||||
activateCheat(index);
|
if (index >= 0)
|
||||||
|
activateCheat(static_cast<u32>(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheatManagerDialog::cheatListItemChanged(QTreeWidgetItem* item, int column)
|
void CheatManagerDialog::cheatListItemChanged(QTreeWidgetItem* item, int column)
|
||||||
|
@ -287,12 +312,15 @@ void CheatManagerDialog::cheatListItemChanged(QTreeWidgetItem* item, int column)
|
||||||
if (!item || column != 0)
|
if (!item || column != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const u32 index = getCheatIndexFromItem(item);
|
const int index = getCheatIndexFromItem(item);
|
||||||
CheatList* list = getCheatList();
|
if (index < 0)
|
||||||
if (index >= list->GetCodeCount())
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CheatCode& cc = list->GetCode(index);
|
CheatList* list = getCheatList();
|
||||||
|
if (static_cast<u32>(index) >= list->GetCodeCount())
|
||||||
|
return;
|
||||||
|
|
||||||
|
CheatCode& cc = list->GetCode(static_cast<u32>(index));
|
||||||
if (cc.IsManuallyActivated())
|
if (cc.IsManuallyActivated())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -301,7 +329,7 @@ void CheatManagerDialog::cheatListItemChanged(QTreeWidgetItem* item, int column)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
QtHostInterface::GetInstance()->executeOnEmulationThread([index, new_enabled]() {
|
QtHostInterface::GetInstance()->executeOnEmulationThread([index, new_enabled]() {
|
||||||
System::GetCheatList()->SetCodeEnabled(index, new_enabled);
|
System::GetCheatList()->SetCodeEnabled(static_cast<u32>(index), new_enabled);
|
||||||
QtHostInterface::GetInstance()->SaveCheatList();
|
QtHostInterface::GetInstance()->SaveCheatList();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -346,13 +374,19 @@ void CheatManagerDialog::addCodeClicked()
|
||||||
CheatCodeEditorDialog editor(list, &new_code, this);
|
CheatCodeEditorDialog editor(list, &new_code, this);
|
||||||
if (editor.exec() > 0)
|
if (editor.exec() > 0)
|
||||||
{
|
{
|
||||||
|
QTreeWidgetItem* group_item = getItemForCheatGroup(new_code.group);
|
||||||
|
if (!group_item)
|
||||||
|
group_item = m_ui.cheatList->topLevelItem(0);
|
||||||
|
|
||||||
|
QTreeWidgetItem* item = new QTreeWidgetItem(group_item);
|
||||||
|
fillItemForCheatCode(item, list->GetCodeCount(), new_code);
|
||||||
|
|
||||||
QtHostInterface::GetInstance()->executeOnEmulationThread(
|
QtHostInterface::GetInstance()->executeOnEmulationThread(
|
||||||
[this, &new_code]() {
|
[this, &new_code]() {
|
||||||
System::GetCheatList()->AddCode(std::move(new_code));
|
System::GetCheatList()->AddCode(std::move(new_code));
|
||||||
QtHostInterface::GetInstance()->SaveCheatList();
|
QtHostInterface::GetInstance()->SaveCheatList();
|
||||||
},
|
},
|
||||||
true);
|
true);
|
||||||
updateCheatList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,13 +404,32 @@ void CheatManagerDialog::editCodeClicked()
|
||||||
CheatCodeEditorDialog editor(list, &new_code, this);
|
CheatCodeEditorDialog editor(list, &new_code, this);
|
||||||
if (editor.exec() > 0)
|
if (editor.exec() > 0)
|
||||||
{
|
{
|
||||||
|
QTreeWidgetItem* item = getItemForCheatIndex(static_cast<u32>(index));
|
||||||
|
if (item)
|
||||||
|
{
|
||||||
|
if (new_code.group != list->GetCode(static_cast<u32>(index)).group)
|
||||||
|
{
|
||||||
|
item = item->parent()->takeChild(item->parent()->indexOfChild(item));
|
||||||
|
QTreeWidgetItem* group_item = getItemForCheatGroup(new_code.group);
|
||||||
|
if (!group_item)
|
||||||
|
group_item = m_ui.cheatList->topLevelItem(0);
|
||||||
|
group_item->addChild(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
fillItemForCheatCode(item, static_cast<u32>(index), new_code);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// shouldn't happen...
|
||||||
|
updateCheatList();
|
||||||
|
}
|
||||||
|
|
||||||
QtHostInterface::GetInstance()->executeOnEmulationThread(
|
QtHostInterface::GetInstance()->executeOnEmulationThread(
|
||||||
[index, &new_code]() {
|
[index, &new_code]() {
|
||||||
System::GetCheatList()->SetCode(static_cast<u32>(index), std::move(new_code));
|
System::GetCheatList()->SetCode(static_cast<u32>(index), std::move(new_code));
|
||||||
QtHostInterface::GetInstance()->SaveCheatList();
|
QtHostInterface::GetInstance()->SaveCheatList();
|
||||||
},
|
},
|
||||||
true);
|
true);
|
||||||
updateCheatList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,10 @@ private:
|
||||||
void updateResultsValues();
|
void updateResultsValues();
|
||||||
void updateWatch();
|
void updateWatch();
|
||||||
void updateWatchValues();
|
void updateWatchValues();
|
||||||
|
void fillItemForCheatCode(QTreeWidgetItem* item, u32 index, const CheatCode& code);
|
||||||
|
|
||||||
QTreeWidgetItem* getItemForCheatIndex(u32 index) const;
|
QTreeWidgetItem* getItemForCheatIndex(u32 index) const;
|
||||||
|
QTreeWidgetItem* getItemForCheatGroup(const std::string& group) const;
|
||||||
int getSelectedCheatIndex() const;
|
int getSelectedCheatIndex() const;
|
||||||
int getSelectedResultIndex() const;
|
int getSelectedResultIndex() const;
|
||||||
int getSelectedWatchIndex() const;
|
int getSelectedWatchIndex() const;
|
||||||
|
|
Loading…
Reference in New Issue