Initial commit

This commit is contained in:
Gericom
2025-11-22 17:21:45 +01:00
commit 5d6f67c612
517 changed files with 63025 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
#include "common.h"
#include "../FileInfoManager.h"
#include "core/task/TaskQueue.h"
#include "../views/BannerListItemView.h"
#include "../Theme/IRomBrowserViewFactory.h"
#include "BannerListFileRecyclerAdapter.h"
void BannerListFileRecyclerAdapter::GetViewSize(int& width, int& height) const
{
width = 203;
height = 44;
}
View* BannerListFileRecyclerAdapter::CreateView() const
{
return _romBrowserViewFactory->CreateBannerListItemView(_vblankTextureLoader);
}
void BannerListFileRecyclerAdapter::DestroyView(View* view) const
{
delete static_cast<BannerListItemView*>(view);
}
void BannerListFileRecyclerAdapter::BindView(View* view, int index) const
{
auto listItemView = static_cast<BannerListItemView*>(view);
listItemView->SetGraphics(_bannerListItemViewGraphics);
FileRecyclerAdapter::BindView(view, index);
}
TaskResult<void> BannerListFileRecyclerAdapter::BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto listItemView = static_cast<BannerListItemView*>(view);
const auto& fileInfo = _fileInfoManager->GetItem(index);
bool fileNameAsTitle = true;
if (internalFileInfo)
{
const char16_t* gameTitle = internalFileInfo->GetGameTitle();
if (gameTitle)
{
listItemView->SetGameTitle(gameTitle);
fileNameAsTitle = false;
}
}
listItemView->SetFileName(fileInfo.GetFileName(), fileNameAsTitle);
auto icon = internalFileInfo ? internalFileInfo->CreateGameIcon() : nullptr;
if (!icon)
{
icon = fileInfo.GetFileType()->CreateFileIcon("", _themeFileIconFactory);
}
if (icon != nullptr)
{
if (cancelRequested)
{
icon.reset();
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
icon->SetAnimFrame(_iconFrameCounter);
listItemView->SetIcon(std::move(icon));
listItemView->UploadIconGraphics();
if (cancelRequested)
{
listItemView->SetIcon(nullptr);
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
}
return TaskResult<void>::Completed();
}
void BannerListFileRecyclerAdapter::ReleaseView(View* view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto listItemView = static_cast<BannerListItemView*>(view);
listItemView->SetIcon(nullptr);
listItemView->SetGameTitle(u"");
_fileInfoManager->ReleaseFileInfo(index);
}
void BannerListFileRecyclerAdapter::InitVram(const VramContext& vramContext)
{
_bannerListItemViewGraphics = _romBrowserViewFactory->UploadBannerListItemViewGraphics(vramContext);
}

View File

@@ -0,0 +1,34 @@
#pragma once
#include "../FileRecyclerAdapter.h"
#include "../views/BannerListItemView.h"
class TaskQueueBase;
class IRomBrowserViewFactory;
class BannerListFileRecyclerAdapter : public FileRecyclerAdapter
{
public:
BannerListFileRecyclerAdapter(FileInfoManager* fileInfoManager,
TaskQueueBase* taskQueue, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory,
VBlankTextureLoader* vblankTextureLoader)
: FileRecyclerAdapter(fileInfoManager, taskQueue, themeFileIconFactory)
, _romBrowserViewFactory(romBrowserViewFactory)
, _vblankTextureLoader(vblankTextureLoader) { }
void GetViewSize(int& width, int& height) const override;
View* CreateView() const override;
void DestroyView(View* view) const override;
void BindView(View* view, int index) const override;
void ReleaseView(View* view, int index) const override;
void InitVram(const VramContext& vramContext) override;
private:
const IRomBrowserViewFactory* _romBrowserViewFactory;
BannerListItemView::VramToken _bannerListItemViewGraphics;
VBlankTextureLoader* _vblankTextureLoader;
TaskResult<void> BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -0,0 +1,59 @@
#include "common.h"
#include "../FileInfoManager.h"
#include "core/task/TaskQueue.h"
#include "../views/CoverView.h"
#include "../Theme/IRomBrowserViewFactory.h"
#include "../FileType/UnknownFileCover.h"
#include "romBrowser/ICoverRepository.h"
#include "CoverFlowFileRecyclerAdapter.h"
void CoverFlowFileRecyclerAdapter::GetViewSize(int& width, int& height) const
{
width = 44;
height = 44;
}
View* CoverFlowFileRecyclerAdapter::CreateView() const
{
return new CoverView(_vblankTextureLoader);
}
void CoverFlowFileRecyclerAdapter::DestroyView(View* view) const
{
auto coverView = static_cast<CoverView*>(view);
delete coverView;
}
TaskResult<void> CoverFlowFileRecyclerAdapter::BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto coverView = static_cast<CoverView*>(view);
auto cover = _fileInfoManager->GetFileCover(index);
if (cancelRequested)
{
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
coverView->SetCover(std::move(cover));
coverView->UploadCoverGraphics();
if (cancelRequested)
{
coverView->ClearCover();
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
return TaskResult<void>::Completed();
}
void CoverFlowFileRecyclerAdapter::ReleaseView(View* view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto coverView = static_cast<CoverView*>(view);
coverView->ClearCover();
_fileInfoManager->ReleaseFileInfo(index);
}
void CoverFlowFileRecyclerAdapter::InitVram(const VramContext& vramContext)
{
// _iconGridItemViewGraphics = _romBrowserViewFactory->UploadIconGridItemViewGraphics(vramManager);
}

View File

@@ -0,0 +1,35 @@
#pragma once
#include "../FileRecyclerAdapter.h"
class IRomBrowserViewFactory;
class VBlankTextureLoader;
class ICoverRepository;
class CoverFlowFileRecyclerAdapter : public FileRecyclerAdapter
{
public:
CoverFlowFileRecyclerAdapter(FileInfoManager* fileInfoManager,
TaskQueueBase* taskQueue, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory,
VBlankTextureLoader* vblankTextureLoader,
const ICoverRepository* coverRepository)
: FileRecyclerAdapter(fileInfoManager, taskQueue, themeFileIconFactory)
, _romBrowserViewFactory(romBrowserViewFactory)
, _vblankTextureLoader(vblankTextureLoader)
, _coverRepository(coverRepository) { }
void GetViewSize(int& width, int& height) const override;
View* CreateView() const override;
void DestroyView(View* view) const override;
void ReleaseView(View* view, int index) const override;
void InitVram(const VramContext& vramContext) override;
private:
const IRomBrowserViewFactory* _romBrowserViewFactory;
VBlankTextureLoader* _vblankTextureLoader;
const ICoverRepository* _coverRepository;
TaskResult<void> BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -0,0 +1,73 @@
#include "common.h"
#include "../FileInfoManager.h"
#include "core/task/TaskQueue.h"
#include "../views/IconGridItemView.h"
#include "../Theme/IRomBrowserViewFactory.h"
#include "IconGridFileRecyclerAdapter.h"
void IconGridFileRecyclerAdapter::GetViewSize(int& width, int& height) const
{
width = 44;
height = 44;
}
View* IconGridFileRecyclerAdapter::CreateView() const
{
return _romBrowserViewFactory->CreateIconGridItemView();
}
void IconGridFileRecyclerAdapter::DestroyView(View* view) const
{
delete static_cast<IconGridItemView*>(view);
}
void IconGridFileRecyclerAdapter::BindView(View* view, int index) const
{
auto iconGridItemView = static_cast<IconGridItemView*>(view);
iconGridItemView->SetGraphics(_iconGridItemViewGraphics);
FileRecyclerAdapter::BindView(view, index);
}
TaskResult<void> IconGridFileRecyclerAdapter::BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto iconGridItemView = static_cast<IconGridItemView*>(view);
auto icon = internalFileInfo ? internalFileInfo->CreateGameIcon() : nullptr;
if (!icon)
{
const auto& fileInfo = _fileInfoManager->GetItem(index);
icon = fileInfo.GetFileType()->CreateFileIcon(fileInfo.GetFileName(), _themeFileIconFactory);
}
if (icon != nullptr)
{
if (cancelRequested)
{
icon.reset();
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
icon->SetAnimFrame(_iconFrameCounter);
iconGridItemView->SetIcon(std::move(icon));
iconGridItemView->UploadIconGraphics();
if (cancelRequested)
{
iconGridItemView->SetIcon(nullptr);
_fileInfoManager->ReleaseFileInfo(index);
return TaskResult<void>::Canceled();
}
}
return TaskResult<void>::Completed();
}
void IconGridFileRecyclerAdapter::ReleaseView(View* view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto iconGridItemView = static_cast<IconGridItemView*>(view);
iconGridItemView->SetIcon(nullptr);
_fileInfoManager->ReleaseFileInfo(index);
}
void IconGridFileRecyclerAdapter::InitVram(const VramContext& vramContext)
{
_iconGridItemViewGraphics = _romBrowserViewFactory->UploadIconGridItemViewGraphics(vramContext);
}

View File

@@ -0,0 +1,30 @@
#pragma once
#include "../FileRecyclerAdapter.h"
#include "../views/IconGridItemView.h"
class IRomBrowserViewFactory;
class IconGridFileRecyclerAdapter : public FileRecyclerAdapter
{
public:
IconGridFileRecyclerAdapter(FileInfoManager* fileInfoManager,
TaskQueueBase* taskQueue, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory)
: FileRecyclerAdapter(fileInfoManager, taskQueue, themeFileIconFactory)
, _romBrowserViewFactory(romBrowserViewFactory) { }
void GetViewSize(int& width, int& height) const override;
View* CreateView() const override;
void DestroyView(View* view) const override;
void BindView(View* view, int index) const override;
void ReleaseView(View* view, int index) const override;
void InitVram(const VramContext& vramContext) override;
private:
const IRomBrowserViewFactory* _romBrowserViewFactory;
IconGridItemView::VramToken _iconGridItemViewGraphics;
TaskResult<void> BindView(View* view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -0,0 +1,4 @@
#include "common.h"
#include "RomBrowserBannerListDisplayMode.h"
const RomBrowserBannerListDisplayMode RomBrowserBannerListDisplayMode::sInstance;

View File

@@ -0,0 +1,39 @@
#pragma once
#include "gui/views/RecyclerView.h"
#include "RomBrowserDisplayMode.h"
#include "BannerListFileRecyclerAdapter.h"
class RomBrowserBannerListDisplayMode : public RomBrowserDisplayMode
{
public:
static const RomBrowserBannerListDisplayMode sInstance;
bool IsVertical() const override { return true; }
std::unique_ptr<AppBarView> CreateAppBarView(const IRomBrowserViewFactory* romBrowserViewFactory,
int startButtonCount, int endButtonCount) const override
{
return romBrowserViewFactory->CreateAppBarView(0, 0,
AppBarView::Orientation::Vertical, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalList);
recyclerView->SetPadding(0, 3);
recyclerView->SetItemSpacing(0, 3);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new BannerListFileRecyclerAdapter(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(), themeFileIconFactory,
romBrowserViewFactory, vblankTextureLoader);
}
private:
constexpr RomBrowserBannerListDisplayMode() { }
};

View File

@@ -0,0 +1,23 @@
#pragma once
#include <memory>
#include "../views/AppBarView.h"
#include "gui/views/RecyclerViewBase.h"
#include "../FileRecyclerAdapter.h"
#include "../viewModels/RomBrowserViewModel.h"
#include "../Theme/IRomBrowserViewFactory.h"
class VBlankTextureLoader;
class ICoverRepository;
class RomBrowserDisplayMode
{
public:
virtual bool IsVertical() const = 0;
virtual bool ShowCoverOnTopScreen() const { return true; }
virtual std::unique_ptr<AppBarView> CreateAppBarView(const IRomBrowserViewFactory* romBrowserViewFactory,
int startButtonCount, int endButtonCount) const = 0;
virtual std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const = 0;
virtual FileRecyclerAdapter* CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const = 0;
};

View File

@@ -0,0 +1,34 @@
#include "common.h"
#include "RomBrowserHorizontalIconGridDisplayMode.h"
#include "RomBrowserVerticalIconGridDisplayMode.h"
#include "RomBrowserBannerListDisplayMode.h"
#include "RomBrowserHorizontalCoverFlowDisplayMode.h"
#include "RomBrowserDisplayModeFactory.h"
const RomBrowserDisplayMode* RomBrowserDisplayModeFactory::GetRomBrowserDisplayMode(
RomBrowserLayout romBrowserDisplayMode) const
{
switch (romBrowserDisplayMode)
{
case RomBrowserLayout::HorizontalIconGrid:
{
return &RomBrowserHorizontalIconGridDisplayMode::sInstance;
}
case RomBrowserLayout::VerticalIconGrid:
{
return &RomBrowserVerticalIconGridDisplayMode::sInstance;
}
case RomBrowserLayout::BannerList:
{
return &RomBrowserBannerListDisplayMode::sInstance;
}
case RomBrowserLayout::CoverFlow:
{
return &RomBrowserHorizontalCoverFlowDisplayMode::sInstance;
}
default:
{
return nullptr;
}
}
}

View File

@@ -0,0 +1,10 @@
#pragma once
#include "services/settings/RomBrowserLayout.h"
#include "RomBrowserDisplayMode.h"
class RomBrowserDisplayModeFactory
{
public:
const RomBrowserDisplayMode* GetRomBrowserDisplayMode(
RomBrowserLayout romBrowserDisplayMode) const;
};

View File

@@ -0,0 +1,4 @@
#include "common.h"
#include "RomBrowserHorizontalCoverFlowDisplayMode.h"
const RomBrowserHorizontalCoverFlowDisplayMode RomBrowserHorizontalCoverFlowDisplayMode::sInstance;

View File

@@ -0,0 +1,34 @@
#pragma once
#include "RomBrowserDisplayMode.h"
class RomBrowserHorizontalCoverFlowDisplayMode : public RomBrowserDisplayMode
{
public:
static const RomBrowserHorizontalCoverFlowDisplayMode sInstance;
bool IsVertical() const override { return false; }
bool ShowCoverOnTopScreen() const override { return false; }
std::unique_ptr<AppBarView> CreateAppBarView(const IRomBrowserViewFactory* romBrowserViewFactory,
int startButtonCount, int endButtonCount) const override
{
return romBrowserViewFactory->CreateAppBarView(0, 0,
AppBarView::Orientation::Horizontal, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
return romBrowserViewFactory->CreateCoverFlowRecyclerView();
}
FileRecyclerAdapter* CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return romBrowserViewFactory->CreateCoverFlowRecyclerAdapter(
viewModel, themeFileIconFactory, vblankTextureLoader);
}
private:
constexpr RomBrowserHorizontalCoverFlowDisplayMode() { }
};

View File

@@ -0,0 +1,4 @@
#include "common.h"
#include "RomBrowserHorizontalIconGridDisplayMode.h"
const RomBrowserHorizontalIconGridDisplayMode RomBrowserHorizontalIconGridDisplayMode::sInstance;

View File

@@ -0,0 +1,39 @@
#pragma once
#include "gui/views/RecyclerView.h"
#include "RomBrowserDisplayMode.h"
#include "IconGridFileRecyclerAdapter.h"
class RomBrowserHorizontalIconGridDisplayMode : public RomBrowserDisplayMode
{
public:
static const RomBrowserHorizontalIconGridDisplayMode sInstance;
bool IsVertical() const override { return false; }
std::unique_ptr<AppBarView> CreateAppBarView(const IRomBrowserViewFactory* romBrowserViewFactory,
int startButtonCount, int endButtonCount) const override
{
return romBrowserViewFactory->CreateAppBarView(0, 0,
AppBarView::Orientation::Horizontal, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(0, 42, 256, 192 - 42, RecyclerView::Mode::HorizontalGrid);
recyclerView->SetPadding(10, 0);
recyclerView->SetItemSpacing(4, 4);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new IconGridFileRecyclerAdapter(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, romBrowserViewFactory);
}
private:
constexpr RomBrowserHorizontalIconGridDisplayMode() { }
};

View File

@@ -0,0 +1,4 @@
#include "common.h"
#include "RomBrowserVerticalIconGridDisplayMode.h"
const RomBrowserVerticalIconGridDisplayMode RomBrowserVerticalIconGridDisplayMode::sInstance;

View File

@@ -0,0 +1,39 @@
#pragma once
#include "gui/views/RecyclerView.h"
#include "RomBrowserDisplayMode.h"
#include "IconGridFileRecyclerAdapter.h"
class RomBrowserVerticalIconGridDisplayMode : public RomBrowserDisplayMode
{
public:
static const RomBrowserVerticalIconGridDisplayMode sInstance;
bool IsVertical() const override { return true; }
std::unique_ptr<AppBarView> CreateAppBarView(const IRomBrowserViewFactory* romBrowserViewFactory,
int startButtonCount, int endButtonCount) const override
{
return romBrowserViewFactory->CreateAppBarView(0, 0,
AppBarView::Orientation::Vertical, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalGrid);
recyclerView->SetPadding(0, 3);
recyclerView->SetItemSpacing(9, 3);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new IconGridFileRecyclerAdapter(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, romBrowserViewFactory);
}
private:
constexpr RomBrowserVerticalIconGridDisplayMode() { }
};