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

@@ -43,7 +43,7 @@ App::App(IAppSettingsService& appSettingsService, IBgmService& bgmService)
, _subVramContext(nullptr, &_subObjVram, nullptr, nullptr)
, _appSettingsService(appSettingsService)
, _bgmService(bgmService)
, _inputProvider(&_inputSource)
, _inputProvider(&_keyInputSource, &_touchInputSource)
, _inputRepeater(&_inputProvider,
InputKey::DpadLeft | InputKey::DpadRight | InputKey::DpadUp | InputKey::DpadDown | InputKey::L | InputKey::R,
25, 8)
@@ -134,7 +134,7 @@ void App::Run()
StoreVramState(_vramStateBeforeMakeBottomScreenView);
_romBrowserBottomScreenView = std::make_unique<RomBrowserBottomScreenView>(
_romBrowserBottomScreenView = RomBrowserBottomScreenView::CreateShared(
&_romBrowserBottomScreenViewModel,
RomBrowserDisplayModeFactory().GetRomBrowserDisplayMode(
_romBrowserController.GetRomBrowserDisplaySettings().layout),
@@ -301,8 +301,8 @@ void App::HandleShowGameInfoTrigger()
// gameInfoDialog->SetGraphics(_chipViewVram);
// _dialogPresenter.ShowDialog(std::move(gameInfoDialog));
auto cheatsViewModel = std::make_unique<CheatsViewModel>(_romBrowserController.GetTriggerFileInfo(), &_romBrowserController);
auto cheatsDialog = std::make_unique<CheatsBottomSheetView>(
auto cheatsViewModel = SharedPtr<CheatsViewModel>::MakeShared(_romBrowserController.GetTriggerFileInfo(), &_romBrowserController);
auto cheatsDialog = CheatsBottomSheetView::CreateShared(
std::move(cheatsViewModel), &_theme->GetMaterialColorScheme(), _theme->GetFontRepository(), &_focusManager);
_dialogPresenter.ShowDialog(std::move(cheatsDialog));
}
@@ -316,7 +316,7 @@ void App::HandleHideGameInfoTrigger()
void App::HandleShowDisplaySettingsTrigger()
{
auto displaySettingsDialog = std::make_unique<DisplaySettingsBottomSheetView>(
auto displaySettingsDialog = DisplaySettingsBottomSheetView::CreateShared(
&_displaySettingsBottomSheetViewModel, &_theme->GetMaterialColorScheme(), _theme->GetFontRepository());
displaySettingsDialog->SetGraphics(_iconButtonViewVram);
_dialogPresenter.ShowDialog(std::move(displaySettingsDialog));
@@ -337,11 +337,11 @@ void App::HandleNavigateTrigger()
void App::HandleFolderLoadDoneTrigger()
{
_romBrowserTopScreenView.reset();
_romBrowserTopScreenView.Reset();
RestoreVramState(_vramStateAfterMakeBottomScreenView);
auto displayMode = RomBrowserDisplayModeFactory().GetRomBrowserDisplayMode(
_romBrowserController.GetRomBrowserDisplaySettings().layout);
_romBrowserTopScreenView = std::make_unique<RomBrowserTopScreenView>(
_romBrowserTopScreenView = RomBrowserTopScreenView::CreateShared(
_romBrowserController.GetRomBrowserViewModel(),
displayMode,
_materialThemeFileIconFactory.get(),
@@ -358,7 +358,7 @@ void App::HandleChangeDisplayModeTrigger(RomBrowserState newState)
RestoreVramState(_vramStateBeforeMakeBottomScreenView);
auto displayMode = RomBrowserDisplayModeFactory().GetRomBrowserDisplayMode(
_romBrowserController.GetRomBrowserDisplaySettings().layout);
_romBrowserBottomScreenView = std::make_unique<RomBrowserBottomScreenView>(
_romBrowserBottomScreenView = RomBrowserBottomScreenView::CreateShared(
&_romBrowserBottomScreenViewModel,
displayMode,
_materialThemeFileIconFactory.get(),
@@ -366,7 +366,7 @@ void App::HandleChangeDisplayModeTrigger(RomBrowserState newState)
&_vblankTextureLoader);
_romBrowserBottomScreenView->InitVram(_mainVramContext);
StoreVramState(_vramStateAfterMakeBottomScreenView);
_romBrowserTopScreenView = std::make_unique<RomBrowserTopScreenView>(
_romBrowserTopScreenView = RomBrowserTopScreenView::CreateShared(
_romBrowserController.GetRomBrowserViewModel(),
displayMode,
_materialThemeFileIconFactory.get(),
@@ -405,7 +405,7 @@ void App::Update()
bool isRomBrowserVisible = IsRomBrowserVisible();
if (isRomBrowserVisible && !_exit && curState != RomBrowserState::Launching)
{
_focusManager.Update(_inputRepeater);
HandleInput();
}
if (_topBackground)
@@ -523,3 +523,49 @@ void App::RestoreVramState(const VramState& vramState)
_texturePaletteVram.SetState(vramState._texPlttVramState);
_subObjVram.SetState(vramState._subObjVramState);
}
void App::HandleInput()
{
_focusManager.Update(_inputRepeater);
Point touchPoint;
if (_inputRepeater.Triggered(InputKey::Touch) &&
_inputRepeater.GetCurrentTouchPoint(touchPoint))
{
// pen down
if (_dialogPresenter.IsBottomSheetVisible())
{
_dialogPresenter.HandlePenDown(touchPoint, _focusManager);
}
else
{
_romBrowserBottomScreenView->HandlePenDown(touchPoint, _focusManager);
}
_lastTouchPoint = touchPoint;
}
else if (_inputRepeater.Released(InputKey::Touch))
{
// pen up
if (_dialogPresenter.IsBottomSheetVisible())
{
_dialogPresenter.HandlePenUp(_lastTouchPoint, _focusManager);
}
else
{
_romBrowserBottomScreenView->HandlePenUp(_lastTouchPoint, _focusManager);
}
}
else if (_inputRepeater.Current(InputKey::Touch)
&& _inputRepeater.GetCurrentTouchPoint(touchPoint))
{
// pen move
if (_dialogPresenter.IsBottomSheetVisible())
{
_dialogPresenter.HandlePenMove(touchPoint, _focusManager);
}
else
{
_romBrowserBottomScreenView->HandlePenMove(touchPoint, _focusManager);
}
_lastTouchPoint = touchPoint;
}
}