Add touch input support, add fast scrolling support for coverflow display mode, fix use after free bug in banner list mode

This commit is contained in:
Gericom
2026-04-04 19:24:39 +02:00
parent 21a8790ebc
commit 97762b14d3
119 changed files with 2251 additions and 762 deletions

View File

@@ -24,7 +24,7 @@ CheatsViewModel::CheatsViewModel(const FileInfo& romFileInfo, IRomBrowserControl
});
}
void CheatsViewModel::ActivateSelectedItem()
void CheatsViewModel::ActivateItem(int index)
{
if (_state != State::DisplayCheats)
{
@@ -36,19 +36,19 @@ void CheatsViewModel::ActivateSelectedItem()
u32 numberOfSubEntries = 0;
auto subEntries = cheatCategory->GetSubEntries(numberOfSubEntries);
if (numberOfSubEntries == 0)
if (numberOfSubEntries == 0 || index < 0 || index >= (int)numberOfSubEntries)
{
// There is nothing to activate
return;
}
auto& entry = subEntries[_selectedItem];
auto& entry = subEntries[index];
if (entry.IsCheatCategory())
{
// Category activated
if (_categoryStackLevel + 1 != _categoryStack.size())
{
_categoryStack[++_categoryStackLevel] = { &entry, (u32)_selectedItem };
_categoryStack[++_categoryStackLevel] = { &entry, (u32)index };
_selectedItem = 0;
}
}

View File

@@ -25,8 +25,8 @@ public:
CheatsViewModel(const FileInfo& romFileInfo, IRomBrowserController* romBrowserController);
/// @brief Activates the selected cheat or category.
void ActivateSelectedItem();
/// @brief Activates the cheat or category at the specified \p index.
void ActivateItem(int index);
/// @brief Navigates up in the cheat hierachy, or closes the cheats panel when at the root.
/// @return \c true when navigation happened in the cheats tree, or \c false when the cheats panel was closed.
@@ -54,9 +54,9 @@ public:
/// @param selectedItem The index of the selected item to set.
void SetSelectedItem(int selectedItem) { _selectedItem = selectedItem; }
/// @brief Returns whether the category name should be displayed.
/// @return \c true when the category name should be displayed, or \c false otherwise.
bool ShouldShowCategoryName() const
/// @brief Returns whether the current displayed category is a sub-category.
/// @return \c true when the current displayed category is a sub-category, or \c false otherwise.
bool IsInSubCategory() const
{
return _categoryStackLevel > 0;
}

View File

@@ -0,0 +1,33 @@
#include "common.h"
#include "romBrowser/IRomBrowserController.h"
#include "RomBrowserViewModel.h"
#include "romBrowser/FileType/Nds/NdsFileType.h"
#include "RomBrowserItemViewModel.h"
void RomBrowserItemViewModel::Activate()
{
if (_index >= 0)
{
const auto& item = _romBrowserController->GetRomBrowserViewModel()->GetFileInfoManager().GetItem(_index);
if (item.GetFileType()->GetClassification() == FileTypeClassification::Folder)
{
_romBrowserController->NavigateToPath(item.GetFileName());
}
else
{
_romBrowserController->LaunchFile(item);
}
}
}
void RomBrowserItemViewModel::ShowGameInfo()
{
if (_index >= 0)
{
const auto& item = _romBrowserController->GetRomBrowserViewModel()->GetFileInfoManager().GetItem(_index);
if (item.GetFileType() == &NdsFileType::sInstance)
{
_romBrowserController->ShowGameInfo(item);
}
}
}

View File

@@ -0,0 +1,43 @@
#pragma once
#include "core/task/TaskQueue.h"
class IRomBrowserController;
class RomBrowserItemViewModel
{
public:
explicit RomBrowserItemViewModel(IRomBrowserController* romBrowserController)
: _romBrowserController(romBrowserController) { }
void Activate();
void ShowGameInfo();
void SetIndex(int index)
{
_index = index;
}
void SetQueueTask(QueueTask<void> queueTask)
{
_queueTask = std::move(queueTask);
}
void CancelQueueTask()
{
_queueTask.CancelTask();
}
void DisposeQueueTaskWhenComplete()
{
if (_queueTask.GetTask().IsCompleted())
{
_queueTask.Dispose();
}
}
private:
int _index = -1;
QueueTask<void> _queueTask;
IRomBrowserController* _romBrowserController;
};

View File

@@ -40,29 +40,7 @@ RomBrowserViewModel::RomBrowserViewModel(IRomBrowserController* romBrowserContro
_selectedItem = _fileInfoManager->GetItemIndex(initialSelectedFileName);
}
void RomBrowserViewModel::ItemActivated()
{
const auto& item = _fileInfoManager->GetItem(_selectedItem);
if (item.GetFileType()->GetClassification() == FileTypeClassification::Folder)
{
_romBrowserController->NavigateToPath(item.GetFileName());
}
else
{
_romBrowserController->LaunchFile(item);
}
}
void RomBrowserViewModel::NavigateUp()
{
_romBrowserController->NavigateUp();
}
void RomBrowserViewModel::ShowGameInfo()
{
const auto& item = _fileInfoManager->GetItem(_selectedItem);
if (item.GetFileType() == &NdsFileType::sInstance)
{
_romBrowserController->ShowGameInfo(item);
}
}

View File

@@ -13,6 +13,7 @@ class RomBrowserViewModel
public:
RomBrowserViewModel(IRomBrowserController* romBrowserController, const char* initialSelectedFileName = nullptr);
IRomBrowserController* GetRomBrowserController() const { return _romBrowserController; }
FileInfoManager& GetFileInfoManager() const { return *_fileInfoManager; }
TaskQueueBase* GetIoTaskQueue() const { return _romBrowserController->GetIoTaskQueue(); }
TaskQueueBase* GetBgTaskQueue() const { return _romBrowserController->GetBgTaskQueue(); }
@@ -24,9 +25,7 @@ public:
constexpr u32 GetIconFrameCounter() const { return _iconFrameCounter; }
void SetIconFrameCounter(u32 iconFrameCounter) { _iconFrameCounter = iconFrameCounter; }
void ItemActivated();
void NavigateUp();
void ShowGameInfo();
private:
IRomBrowserController* _romBrowserController;