forked from suyu/suyu
game_list: Fix folder reordering
The bug(s) happened because we swapped the contents on values.game_dirs, but the pointer each item had to their respective game_dir wasn't updated. This made it so that the item had the wrong game_dir associated with it after a "move up" or "move down" operation. It can be observed by choosing "open directory location" after such operation. Changed from raw pointer to an index because it's equivalent but a bit clearer, but the change is not essential. Co-Authored-By: Vitor K <29167336+vitor-k@users.noreply.github.com>
This commit is contained in:
parent
e8401964b4
commit
bf9f737c60
2 changed files with 32 additions and 28 deletions
|
@ -173,8 +173,8 @@ void GameList::OnItemExpanded(const QModelIndex& item) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* game_dir = item.data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
UISettings::values.game_dirs[item.data(GameListDir::GameDirRole).toInt()].expanded =
|
||||||
game_dir->expanded = tree_view->isExpanded(item);
|
tree_view->isExpanded(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event in order to filter the gamelist after editing the searchfield
|
// Event in order to filter the gamelist after editing the searchfield
|
||||||
|
@ -262,9 +262,9 @@ void GameList::OnUpdateThemedIcons() {
|
||||||
Qt::DecorationRole);
|
Qt::DecorationRole);
|
||||||
break;
|
break;
|
||||||
case GameListItemType::CustomDir: {
|
case GameListItemType::CustomDir: {
|
||||||
const UISettings::GameDir* game_dir =
|
const UISettings::GameDir& game_dir =
|
||||||
child->data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
UISettings::values.game_dirs[child->data(GameListDir::GameDirRole).toInt()];
|
||||||
const QString icon_name = QFileInfo::exists(game_dir->path)
|
const QString icon_name = QFileInfo::exists(game_dir.path)
|
||||||
? QStringLiteral("folder")
|
? QStringLiteral("folder")
|
||||||
: QStringLiteral("bad_folder");
|
: QStringLiteral("bad_folder");
|
||||||
child->setData(
|
child->setData(
|
||||||
|
@ -366,7 +366,7 @@ void GameList::AddDirEntry(GameListDir* entry_items) {
|
||||||
item_model->invisibleRootItem()->appendRow(entry_items);
|
item_model->invisibleRootItem()->appendRow(entry_items);
|
||||||
tree_view->setExpanded(
|
tree_view->setExpanded(
|
||||||
entry_items->index(),
|
entry_items->index(),
|
||||||
entry_items->data(GameListDir::GameDirRole).value<UISettings::GameDir*>()->expanded);
|
UISettings::values.game_dirs[entry_items->data(GameListDir::GameDirRole).toInt()].expanded);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameList::AddEntry(const QList<QStandardItem*>& entry_items, GameListDir* parent) {
|
void GameList::AddEntry(const QList<QStandardItem*>& entry_items, GameListDir* parent) {
|
||||||
|
@ -549,7 +549,7 @@ void GameList::AddGamePopup(QMenu& context_menu, u64 program_id, const std::stri
|
||||||
|
|
||||||
void GameList::AddCustomDirPopup(QMenu& context_menu, QModelIndex selected) {
|
void GameList::AddCustomDirPopup(QMenu& context_menu, QModelIndex selected) {
|
||||||
UISettings::GameDir& game_dir =
|
UISettings::GameDir& game_dir =
|
||||||
*selected.data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
UISettings::values.game_dirs[selected.data(GameListDir::GameDirRole).toInt()];
|
||||||
|
|
||||||
QAction* deep_scan = context_menu.addAction(tr("Scan Subfolders"));
|
QAction* deep_scan = context_menu.addAction(tr("Scan Subfolders"));
|
||||||
QAction* delete_dir = context_menu.addAction(tr("Remove Game Directory"));
|
QAction* delete_dir = context_menu.addAction(tr("Remove Game Directory"));
|
||||||
|
@ -568,8 +568,7 @@ void GameList::AddCustomDirPopup(QMenu& context_menu, QModelIndex selected) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameList::AddPermDirPopup(QMenu& context_menu, QModelIndex selected) {
|
void GameList::AddPermDirPopup(QMenu& context_menu, QModelIndex selected) {
|
||||||
UISettings::GameDir& game_dir =
|
const int game_dir_index = selected.data(GameListDir::GameDirRole).toInt();
|
||||||
*selected.data(GameListDir::GameDirRole).value<UISettings::GameDir*>();
|
|
||||||
|
|
||||||
QAction* move_up = context_menu.addAction(tr("\u25B2 Move Up"));
|
QAction* move_up = context_menu.addAction(tr("\u25B2 Move Up"));
|
||||||
QAction* move_down = context_menu.addAction(tr("\u25bc Move Down"));
|
QAction* move_down = context_menu.addAction(tr("\u25bc Move Down"));
|
||||||
|
@ -580,34 +579,39 @@ void GameList::AddPermDirPopup(QMenu& context_menu, QModelIndex selected) {
|
||||||
move_up->setEnabled(row > 0);
|
move_up->setEnabled(row > 0);
|
||||||
move_down->setEnabled(row < item_model->rowCount() - 2);
|
move_down->setEnabled(row < item_model->rowCount() - 2);
|
||||||
|
|
||||||
connect(move_up, &QAction::triggered, [this, selected, row, &game_dir] {
|
connect(move_up, &QAction::triggered, [this, selected, row, game_dir_index] {
|
||||||
// find the indices of the items in settings and swap them
|
const int other_index = selected.sibling(row - 1, 0).data(GameListDir::GameDirRole).toInt();
|
||||||
std::swap(UISettings::values.game_dirs[UISettings::values.game_dirs.indexOf(game_dir)],
|
// swap the items in the settings
|
||||||
UISettings::values.game_dirs[UISettings::values.game_dirs.indexOf(
|
std::swap(UISettings::values.game_dirs[game_dir_index],
|
||||||
*selected.sibling(row - 1, 0)
|
UISettings::values.game_dirs[other_index]);
|
||||||
.data(GameListDir::GameDirRole)
|
// swap the indexes held by the QVariants
|
||||||
.value<UISettings::GameDir*>())]);
|
item_model->setData(selected, QVariant(other_index), GameListDir::GameDirRole);
|
||||||
|
item_model->setData(selected.sibling(row - 1, 0), QVariant(game_dir_index),
|
||||||
|
GameListDir::GameDirRole);
|
||||||
// move the treeview items
|
// move the treeview items
|
||||||
QList<QStandardItem*> item = item_model->takeRow(row);
|
QList<QStandardItem*> item = item_model->takeRow(row);
|
||||||
item_model->invisibleRootItem()->insertRow(row - 1, item);
|
item_model->invisibleRootItem()->insertRow(row - 1, item);
|
||||||
tree_view->setExpanded(selected, game_dir.expanded);
|
tree_view->setExpanded(selected, UISettings::values.game_dirs[game_dir_index].expanded);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(move_down, &QAction::triggered, [this, selected, row, &game_dir] {
|
connect(move_down, &QAction::triggered, [this, selected, row, game_dir_index] {
|
||||||
// find the indices of the items in settings and swap them
|
const int other_index = selected.sibling(row + 1, 0).data(GameListDir::GameDirRole).toInt();
|
||||||
std::swap(UISettings::values.game_dirs[UISettings::values.game_dirs.indexOf(game_dir)],
|
// swap the items in the settings
|
||||||
UISettings::values.game_dirs[UISettings::values.game_dirs.indexOf(
|
std::swap(UISettings::values.game_dirs[game_dir_index],
|
||||||
*selected.sibling(row + 1, 0)
|
UISettings::values.game_dirs[other_index]);
|
||||||
.data(GameListDir::GameDirRole)
|
// swap the indexes held by the QVariants
|
||||||
.value<UISettings::GameDir*>())]);
|
item_model->setData(selected, QVariant(other_index), GameListDir::GameDirRole);
|
||||||
|
item_model->setData(selected.sibling(row + 1, 0), QVariant(game_dir_index),
|
||||||
|
GameListDir::GameDirRole);
|
||||||
// move the treeview items
|
// move the treeview items
|
||||||
const QList<QStandardItem*> item = item_model->takeRow(row);
|
const QList<QStandardItem*> item = item_model->takeRow(row);
|
||||||
item_model->invisibleRootItem()->insertRow(row + 1, item);
|
item_model->invisibleRootItem()->insertRow(row + 1, item);
|
||||||
tree_view->setExpanded(selected, game_dir.expanded);
|
tree_view->setExpanded(selected, UISettings::values.game_dirs[game_dir_index].expanded);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(open_directory_location, &QAction::triggered,
|
connect(open_directory_location, &QAction::triggered, [this, game_dir_index] {
|
||||||
[this, game_dir] { emit OpenDirectory(game_dir.path); });
|
emit OpenDirectory(UISettings::values.game_dirs[game_dir_index].path);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameList::LoadCompatibilityList() {
|
void GameList::LoadCompatibilityList() {
|
||||||
|
|
|
@ -230,7 +230,7 @@ public:
|
||||||
setData(type(), TypeRole);
|
setData(type(), TypeRole);
|
||||||
|
|
||||||
UISettings::GameDir* game_dir = &directory;
|
UISettings::GameDir* game_dir = &directory;
|
||||||
setData(QVariant::fromValue(game_dir), GameDirRole);
|
setData(QVariant(UISettings::values.game_dirs.indexOf(directory)), GameDirRole);
|
||||||
|
|
||||||
const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64);
|
const int icon_size = std::min(static_cast<int>(UISettings::values.icon_size), 64);
|
||||||
switch (dir_type) {
|
switch (dir_type) {
|
||||||
|
|
Loading…
Reference in a new issue