Add new shared pointer and make use of it

This commit is contained in:
Gericom
2026-03-28 12:03:06 +01:00
parent bec797ffe7
commit 21a8790ebc
66 changed files with 1098 additions and 523 deletions

View File

@@ -11,27 +11,22 @@ void BannerListFileRecyclerAdapter::GetViewSize(int& width, int& height) const
height = 44;
}
View* BannerListFileRecyclerAdapter::CreateView() const
SharedPtr<View> BannerListFileRecyclerAdapter::CreateView() const
{
return _romBrowserViewFactory->CreateBannerListItemView(_vblankTextureLoader);
}
void BannerListFileRecyclerAdapter::DestroyView(View* view) const
void BannerListFileRecyclerAdapter::BindView(SharedPtr<View> view, int index) const
{
delete static_cast<BannerListItemView*>(view);
}
void BannerListFileRecyclerAdapter::BindView(View* view, int index) const
{
auto listItemView = static_cast<BannerListItemView*>(view);
auto listItemView = static_cast<BannerListItemView*>(view.GetPointer());
listItemView->SetGraphics(_bannerListItemViewGraphics);
FileRecyclerAdapter::BindView(view, index);
}
TaskResult<void> BannerListFileRecyclerAdapter::BindView(View* view, int index,
TaskResult<void> BannerListFileRecyclerAdapter::BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto listItemView = static_cast<BannerListItemView*>(view);
auto listItemView = static_cast<BannerListItemView*>(view.GetPointer());
const auto& fileInfo = _fileInfoManager->GetItem(index);
bool fileNameAsTitle = true;
if (internalFileInfo)
@@ -70,10 +65,10 @@ TaskResult<void> BannerListFileRecyclerAdapter::BindView(View* view, int index,
return TaskResult<void>::Completed();
}
void BannerListFileRecyclerAdapter::ReleaseView(View* view, int index) const
void BannerListFileRecyclerAdapter::ReleaseView(SharedPtr<View> view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto listItemView = static_cast<BannerListItemView*>(view);
auto listItemView = static_cast<BannerListItemView*>(view.GetPointer());
listItemView->SetIcon(nullptr);
listItemView->SetGameTitle(u"");
_fileInfoManager->ReleaseFileInfo(index);

View File

@@ -17,10 +17,9 @@ public:
, _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;
SharedPtr<View> CreateView() const override;
void BindView(SharedPtr<View> view, int index) const override;
void ReleaseView(SharedPtr<View> view, int index) const override;
void InitVram(const VramContext& vramContext) override;
@@ -29,6 +28,6 @@ private:
BannerListItemView::VramToken _bannerListItemViewGraphics;
VBlankTextureLoader* _vblankTextureLoader;
TaskResult<void> BindView(View* view, int index,
TaskResult<void> BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -13,21 +13,15 @@ void CoverFlowFileRecyclerAdapter::GetViewSize(int& width, int& height) const
height = 44;
}
View* CoverFlowFileRecyclerAdapter::CreateView() const
SharedPtr<View> CoverFlowFileRecyclerAdapter::CreateView() const
{
return new CoverView(_vblankTextureLoader);
return SharedPtr<CoverView>::MakeShared(_vblankTextureLoader);
}
void CoverFlowFileRecyclerAdapter::DestroyView(View* view) const
{
auto coverView = static_cast<CoverView*>(view);
delete coverView;
}
TaskResult<void> CoverFlowFileRecyclerAdapter::BindView(View* view, int index,
TaskResult<void> CoverFlowFileRecyclerAdapter::BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto coverView = static_cast<CoverView*>(view);
auto coverView = static_cast<CoverView*>(view.GetPointer());
auto cover = _fileInfoManager->GetFileCover(index);
if (cancelRequested)
{
@@ -45,10 +39,10 @@ TaskResult<void> CoverFlowFileRecyclerAdapter::BindView(View* view, int index,
return TaskResult<void>::Completed();
}
void CoverFlowFileRecyclerAdapter::ReleaseView(View* view, int index) const
void CoverFlowFileRecyclerAdapter::ReleaseView(SharedPtr<View> view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto coverView = static_cast<CoverView*>(view);
auto coverView = static_cast<CoverView*>(view.GetPointer());
coverView->ClearCover();
_fileInfoManager->ReleaseFileInfo(index);
}

View File

@@ -19,9 +19,8 @@ public:
, _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;
SharedPtr<View> CreateView() const override;
void ReleaseView(SharedPtr<View> view, int index) const override;
void InitVram(const VramContext& vramContext) override;
@@ -30,6 +29,6 @@ private:
VBlankTextureLoader* _vblankTextureLoader;
const ICoverRepository* _coverRepository;
TaskResult<void> BindView(View* view, int index,
TaskResult<void> BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -11,27 +11,22 @@ void IconGridFileRecyclerAdapter::GetViewSize(int& width, int& height) const
height = 44;
}
View* IconGridFileRecyclerAdapter::CreateView() const
SharedPtr<View> IconGridFileRecyclerAdapter::CreateView() const
{
return _romBrowserViewFactory->CreateIconGridItemView();
}
void IconGridFileRecyclerAdapter::DestroyView(View* view) const
void IconGridFileRecyclerAdapter::BindView(SharedPtr<View> view, int index) const
{
delete static_cast<IconGridItemView*>(view);
}
void IconGridFileRecyclerAdapter::BindView(View* view, int index) const
{
auto iconGridItemView = static_cast<IconGridItemView*>(view);
auto iconGridItemView = static_cast<IconGridItemView*>(view.GetPointer());
iconGridItemView->SetGraphics(_iconGridItemViewGraphics);
FileRecyclerAdapter::BindView(view, index);
}
TaskResult<void> IconGridFileRecyclerAdapter::BindView(View* view, int index,
TaskResult<void> IconGridFileRecyclerAdapter::BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto iconGridItemView = static_cast<IconGridItemView*>(view);
auto iconGridItemView = static_cast<IconGridItemView*>(view.GetPointer());
auto icon = internalFileInfo ? internalFileInfo->CreateGameIcon() : nullptr;
if (!icon)
{
@@ -59,10 +54,10 @@ TaskResult<void> IconGridFileRecyclerAdapter::BindView(View* view, int index,
return TaskResult<void>::Completed();
}
void IconGridFileRecyclerAdapter::ReleaseView(View* view, int index) const
void IconGridFileRecyclerAdapter::ReleaseView(SharedPtr<View> view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto iconGridItemView = static_cast<IconGridItemView*>(view);
auto iconGridItemView = static_cast<IconGridItemView*>(view.GetPointer());
iconGridItemView->SetIcon(nullptr);
_fileInfoManager->ReleaseFileInfo(index);
}

View File

@@ -14,10 +14,9 @@ public:
, _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;
SharedPtr<View> CreateView() const override;
void BindView(SharedPtr<View> view, int index) const override;
void ReleaseView(SharedPtr<View> view, int index) const override;
void InitVram(const VramContext& vramContext) override;
@@ -25,6 +24,6 @@ private:
const IRomBrowserViewFactory* _romBrowserViewFactory;
IconGridItemView::VramToken _iconGridItemViewGraphics;
TaskResult<void> BindView(View* view, int index,
TaskResult<void> BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -17,19 +17,19 @@ public:
AppBarView::Orientation::Vertical, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
SharedPtr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalList);
auto recyclerView = RecyclerView::CreateShared(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalList);
recyclerView->SetPadding(0, 3);
recyclerView->SetItemSpacing(0, 3);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new BannerListFileRecyclerAdapter(
return SharedPtr<BannerListFileRecyclerAdapter>::MakeShared(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(), themeFileIconFactory,
romBrowserViewFactory, vblankTextureLoader);
}

View File

@@ -16,8 +16,8 @@ public:
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(
virtual SharedPtr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const = 0;
virtual SharedPtr<FileRecyclerAdapter> CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const = 0;
};

View File

@@ -16,12 +16,12 @@ public:
AppBarView::Orientation::Horizontal, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
SharedPtr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
return romBrowserViewFactory->CreateCoverFlowRecyclerView();
}
FileRecyclerAdapter* CreateRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{

View File

@@ -17,19 +17,19 @@ public:
AppBarView::Orientation::Horizontal, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
SharedPtr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(0, 42, 256, 192 - 42, RecyclerView::Mode::HorizontalGrid);
auto recyclerView = RecyclerView::CreateShared(0, 42, 256, 192 - 42, RecyclerView::Mode::HorizontalGrid);
recyclerView->SetPadding(10, 0);
recyclerView->SetItemSpacing(4, 4);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new IconGridFileRecyclerAdapter(
return SharedPtr<IconGridFileRecyclerAdapter>::MakeShared(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, romBrowserViewFactory);
}

View File

@@ -17,19 +17,19 @@ public:
AppBarView::Orientation::Vertical, startButtonCount, endButtonCount);
}
std::unique_ptr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
SharedPtr<RecyclerViewBase> CreateRecyclerView(const IRomBrowserViewFactory* romBrowserViewFactory) const override
{
auto recyclerView = std::make_unique<RecyclerView>(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalGrid);
auto recyclerView = RecyclerView::CreateShared(42, 0, 256 - 42, 192, RecyclerView::Mode::VerticalGrid);
recyclerView->SetPadding(0, 3);
recyclerView->SetItemSpacing(9, 3);
return recyclerView;
}
FileRecyclerAdapter* CreateRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory, VBlankTextureLoader* vblankTextureLoader) const override
{
return new IconGridFileRecyclerAdapter(
return SharedPtr<IconGridFileRecyclerAdapter>::MakeShared(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, romBrowserViewFactory);
}

View File

@@ -15,6 +15,34 @@ FileInfoManager::~FileInfoManager()
}
}
void FileInfoManager::LoadFileInfo(int index)
{
auto internalFileInfo = _extraFileInfo[index].internalFileInfo;
if (!internalFileInfo)
{
internalFileInfo = _items[index]->CreateInternalFileInfo();
}
if (!_extraFileInfo[index].fileCover.Lock())
{
_extraFileInfo[index].fileCover = SharedPtr(_coverRepository.GetCoverForFile(*_items[index], internalFileInfo));
}
_extraFileInfo[index].internalFileInfo = internalFileInfo;
}
void FileInfoManager::ReleaseFileInfo(int index)
{
auto internalFileInfo = _extraFileInfo[index].internalFileInfo;
if (internalFileInfo)
{
_extraFileInfo[index].internalFileInfo = nullptr;
delete internalFileInfo;
}
_extraFileInfo[index].fileCover.Reset();
}
int FileInfoManager::GetItemIndex(const char* fileName)
{
if (fileName == nullptr)
@@ -23,10 +51,10 @@ int FileInfoManager::GetItemIndex(const char* fileName)
}
for (u32 i = 0; i < _itemCount; i++)
{
if (strcmp(fileName, _items[i]->GetFileName()) == 0)
{
return i;
}
if (strcmp(fileName, _items[i]->GetFileName()) == 0)
{
return i;
}
}
return -1;
}

View File

@@ -4,7 +4,7 @@
#include "FileInfo.h"
#include "FileType/FileCover.h"
#include "ICoverRepository.h"
#include "core/SharedPtr.h"
#include "core/AtomicSharedPtr.h"
#include "FileType/InternalFileInfo.h"
class FileInfoManager
@@ -20,36 +20,12 @@ public:
SharedPtr<FileCover> GetFileCover(int index)
{
return _extraFileInfo[index].fileCover;
return _extraFileInfo[index].fileCover.Lock();
}
void LoadFileInfo(int index)
{
auto internalFileInfo = GetInternalFileInfo(index);
if (!internalFileInfo)
{
internalFileInfo = _items[index]->CreateInternalFileInfo();
}
void LoadFileInfo(int index);
if (!_extraFileInfo[index].fileCover.IsValid())
{
_extraFileInfo[index].fileCover = SharedPtr(_coverRepository.GetCoverForFile(*_items[index], internalFileInfo));
}
_extraFileInfo[index].internalFileInfo = internalFileInfo;
}
void ReleaseFileInfo(int index)
{
auto internalFileInfo = GetInternalFileInfo(index);
if (internalFileInfo)
{
delete internalFileInfo;
_extraFileInfo[index].internalFileInfo = nullptr;
}
_extraFileInfo[index].fileCover.Reset();
}
void ReleaseFileInfo(int index);
int GetItemIndex(const char* fileName);
@@ -60,7 +36,7 @@ private:
struct ExtraFileInfo
{
const InternalFileInfo* internalFileInfo;
SharedPtr<FileCover> fileCover;
AtomicSharedPtr<FileCover> fileCover;
};
std::unique_ptr<const FileInfo*[]> _items;

View File

@@ -8,7 +8,7 @@ u32 FileRecyclerAdapter::GetItemCount() const
return _fileInfoManager->GetItemCount();
}
void FileRecyclerAdapter::BindView(View* view, int index) const
void FileRecyclerAdapter::BindView(SharedPtr<View> view, int index) const
{
LOG_DEBUG("Binding %d\n", index);
_taskQueue->Enqueue([=, this] (const vu8& cancelRequested)

View File

@@ -12,7 +12,7 @@ class FileRecyclerAdapter : public RecyclerAdapter
{
public:
u32 GetItemCount() const override;
void BindView(View* view, int index) const override;
void BindView(SharedPtr<View> view, int index) const override;
void SetIconFrameCounter(u32 iconFrameCounter)
{
@@ -32,6 +32,6 @@ protected:
: _fileInfoManager(fileInfoManager), _taskQueue(taskQueue)
, _iconFrameCounter(0), _themeFileIconFactory(themeFileIconFactory) { }
virtual TaskResult<void> BindView(View* view, int index,
virtual TaskResult<void> BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const = 0;
};

View File

@@ -182,7 +182,7 @@ void RomBrowserController::HandleFolderLoadDoneTrigger()
LOG_DEBUG("RomBrowserStateTrigger::FolderLoadDone\n");
_romBrowserViewModel.Reset();
_sdFolder = std::move(_newSdFolder);
_romBrowserViewModel = SharedPtr(new RomBrowserViewModel(this, _navigateFileName));
_romBrowserViewModel = SharedPtr<RomBrowserViewModel>::MakeShared(this, _navigateFileName);
}
void RomBrowserController::HandleLaunchTrigger()
@@ -200,7 +200,7 @@ void RomBrowserController::HandleLaunchTrigger()
void RomBrowserController::HandleChangeDisplayModeTrigger()
{
LOG_DEBUG("RomBrowserStateTrigger::ChangeDisplayMode\n");
_romBrowserViewModel = SharedPtr(new RomBrowserViewModel(this));
_romBrowserViewModel = SharedPtr<RomBrowserViewModel>::MakeShared(this);
}
void RomBrowserController::UpdateLastUsedFilepath()

View File

@@ -1,5 +1,6 @@
#pragma once
#include <memory>
#include "core/SharedPtr.h"
#include "../views/IconGridItemView.h"
#include "../views/BannerListItemView.h"
#include "../views/AppBarView.h"
@@ -17,11 +18,11 @@ class IRomBrowserViewFactory
public:
virtual ~IRomBrowserViewFactory() = 0;
virtual IconGridItemView* CreateIconGridItemView() const = 0;
virtual SharedPtr<IconGridItemView> CreateIconGridItemView() const = 0;
virtual IconGridItemView::VramToken UploadIconGridItemViewGraphics(
const VramContext& vramContext) const { return IconGridItemView::VramToken(0); }
virtual BannerListItemView* CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const = 0;
virtual SharedPtr<BannerListItemView> CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const = 0;
virtual BannerListItemView::VramToken UploadBannerListItemViewGraphics(
const VramContext& vramContext) const { return BannerListItemView::VramToken(0); }
@@ -30,9 +31,9 @@ public:
virtual std::unique_ptr<BannerView> CreateFileInfoView() const = 0;
virtual std::unique_ptr<RecyclerViewBase> CreateCoverFlowRecyclerView() const = 0;
virtual SharedPtr<RecyclerViewBase> CreateCoverFlowRecyclerView() const = 0;
virtual FileRecyclerAdapter* CreateCoverFlowRecyclerAdapter(
virtual SharedPtr<FileRecyclerAdapter> CreateCoverFlowRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
VBlankTextureLoader* vblankTextureLoader) const = 0;

View File

@@ -7,10 +7,17 @@ class MaterialColorScheme;
class CarouselRecyclerView : public CoverFlowRecyclerViewBase
{
struct Private { explicit Private() = default; };
public:
explicit CarouselRecyclerView(const MaterialColorScheme* materialColorScheme)
CarouselRecyclerView(Private, const MaterialColorScheme* materialColorScheme)
: _materialColorScheme(materialColorScheme) { }
static SharedPtr<CarouselRecyclerView> CreateShared(const MaterialColorScheme* materialColorScheme)
{
return SharedPtr<CarouselRecyclerView>::MakeShared(Private(), materialColorScheme);
}
static void UploadGraphics(const VramContext& vramContext);
void Update() override;

View File

@@ -9,12 +9,12 @@ MaterialAppBarView::MaterialAppBarView(int x, int y, Orientation orientation,
{
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
_buttons[i] = new IconButton2DView(
_buttons[i] = SharedPtr<IconButton2DView>::MakeShared(
IconButtonView::Type::Standard,
IconButtonView::State::NoToggle,
md::sys::color::inverseOnSurface,
materialColorScheme);
AddChildTail(_buttons[i]);
AddChildTail(_buttons[i].GetPointer());
}
}
@@ -26,7 +26,7 @@ void MaterialAppBarView::InitVram(const VramContext& vramContext)
auto iconButtonVramToken = IconButton2DView::UploadGraphics(*objVramManager);
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
static_cast<IconButton2DView*>(_buttons[i])->SetGraphics(iconButtonVramToken);
static_cast<IconButton2DView*>(_buttons[i].GetPointer())->SetGraphics(iconButtonVramToken);
}
}
}

View File

@@ -13,21 +13,15 @@ void MaterialCoverFlowFileRecyclerAdapter::GetViewSize(int& width, int& height)
height = COVER_HEIGHT;
}
View* MaterialCoverFlowFileRecyclerAdapter::CreateView() const
SharedPtr<View> MaterialCoverFlowFileRecyclerAdapter::CreateView() const
{
return new MaterialCoverView(_vblankTextureLoader);
return SharedPtr<MaterialCoverView>::MakeShared(_vblankTextureLoader);
}
void MaterialCoverFlowFileRecyclerAdapter::DestroyView(View* view) const
{
auto coverView = static_cast<MaterialCoverView*>(view);
delete coverView;
}
TaskResult<void> MaterialCoverFlowFileRecyclerAdapter::BindView(View* view, int index,
TaskResult<void> MaterialCoverFlowFileRecyclerAdapter::BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const
{
auto coverView = static_cast<MaterialCoverView*>(view);
auto coverView = static_cast<MaterialCoverView*>(view.GetPointer());
auto cover = _fileInfoManager->GetFileCover(index);
if (cancelRequested)
{
@@ -45,10 +39,10 @@ TaskResult<void> MaterialCoverFlowFileRecyclerAdapter::BindView(View* view, int
return TaskResult<void>::Completed();
}
void MaterialCoverFlowFileRecyclerAdapter::ReleaseView(View* view, int index) const
void MaterialCoverFlowFileRecyclerAdapter::ReleaseView(SharedPtr<View> view, int index) const
{
LOG_DEBUG("Releasing %d\n", index);
auto coverView = static_cast<MaterialCoverView*>(view);
auto coverView = static_cast<MaterialCoverView*>(view.GetPointer());
coverView->ClearCover();
_fileInfoManager->ReleaseFileInfo(index);
}

View File

@@ -19,15 +19,14 @@ public:
, _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;
SharedPtr<View> CreateView() const override;
void ReleaseView(SharedPtr<View> view, int index) const override;
private:
const IRomBrowserViewFactory* _romBrowserViewFactory;
VBlankTextureLoader* _vblankTextureLoader;
const ICoverRepository* _coverRepository;
TaskResult<void> BindView(View* view, int index,
TaskResult<void> BindView(SharedPtr<View> view, int index,
const InternalFileInfo* internalFileInfo, const vu8& cancelRequested) const override;
};

View File

@@ -19,7 +19,7 @@ void MaterialCoverView::InitVram(const VramContext& vramContext)
void MaterialCoverView::Draw(GraphicsContext& graphicsContext)
{
if (_cover.IsValid() && _textureLoadRequest.GetState() == VBlankTextureLoadRequestState::LoadComplete)
if (_cover.Lock() && _textureLoadRequest.GetState() == VBlankTextureLoadRequestState::LoadComplete)
{
Gx::TexImageParam(_texVramOffset >> 3, false, true, false, true, GX_TEXSIZE_128,
GX_TEXSIZE_128, GX_TEXFMT_PLTT256, false, GX_TEXGEN_NONE);
@@ -46,11 +46,11 @@ void MaterialCoverView::Draw(GraphicsContext& graphicsContext)
void MaterialCoverView::UploadCoverGraphics()
{
if (_cover.IsValid())
if (auto cover = _cover.Lock())
{
_cover->SetTexVramOffset(_texVramOffset, _plttVramOffset);
cover->SetTexVramOffset(_texVramOffset, _plttVramOffset);
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_textureLoadRequest = _cover->CreateTextureLoadRequest();
_textureLoadRequest = cover->CreateTextureLoadRequest();
_vblankTextureLoader->RequestLoad(_textureLoadRequest);
}
}

View File

@@ -1,6 +1,5 @@
#pragma once
#include <memory>
#include "core/SharedPtr.h"
#include "core/AtomicSharedPtr.h"
#include "gui/views/View.h"
#include "romBrowser/FileType/FileCover.h"
#include "gui/VBlankTextureLoader.h"
@@ -27,19 +26,13 @@ public:
void SetCover(SharedPtr<FileCover> cover)
{
if (_cover.IsValid())
{
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
}
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_cover = std::move(cover);
}
void ClearCover()
{
if (_cover.IsValid())
{
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
}
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_cover.Reset();
}
@@ -47,7 +40,7 @@ public:
private:
VBlankTextureLoader* _vblankTextureLoader;
SharedPtr<FileCover> _cover;
AtomicSharedPtr<FileCover> _cover;
VBlankTextureLoadRequest _textureLoadRequest;
u32 _texVramOffset = 0;
u32 _plttVramOffset = 0;

View File

@@ -18,9 +18,9 @@ public:
const IFontRepository* fontRepository)
: _materialColorScheme(materialColorScheme), _fontRepository(fontRepository) { }
IconGridItemView* CreateIconGridItemView() const override
SharedPtr<IconGridItemView> CreateIconGridItemView() const override
{
return new MaterialIconGridItemView(_materialColorScheme);
return SharedPtr<MaterialIconGridItemView>::MakeShared(_materialColorScheme);
}
IconGridItemView::VramToken UploadIconGridItemViewGraphics(
@@ -29,9 +29,9 @@ public:
return MaterialIconGridItemView::UploadGraphics(vramContext);
}
BannerListItemView* CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const override
SharedPtr<BannerListItemView> CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const override
{
return new MaterialBannerListItemView(_materialColorScheme, _fontRepository);
return SharedPtr<MaterialBannerListItemView>::MakeShared(_materialColorScheme, _fontRepository);
}
BannerListItemView::VramToken UploadBannerListItemViewGraphics(
@@ -51,16 +51,16 @@ public:
return std::make_unique<MaterialFileInfoCardView>(_materialColorScheme, _fontRepository);
}
std::unique_ptr<RecyclerViewBase> CreateCoverFlowRecyclerView() const override
SharedPtr<RecyclerViewBase> CreateCoverFlowRecyclerView() const override
{
return std::make_unique<CarouselRecyclerView>(_materialColorScheme);
return CarouselRecyclerView::CreateShared(_materialColorScheme);
}
FileRecyclerAdapter* CreateCoverFlowRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateCoverFlowRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
VBlankTextureLoader* vblankTextureLoader) const override
{
return new MaterialCoverFlowFileRecyclerAdapter(
return SharedPtr<MaterialCoverFlowFileRecyclerAdapter>::MakeShared(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, this, vblankTextureLoader, &viewModel->GetCoverRepository());
}

View File

@@ -4,8 +4,6 @@
#include "romBrowser/views/IconButton3DView.h"
#include "CustomAppBarView.h"
#define BLOCK_VTX_PACK(x, y, z) (((x)&0x3FF) | ((((y) >> 3) & 0x3FF) << 10) | ((z) << 20))
CustomAppBarView::CustomAppBarView(int x, int y, Orientation orientation,
int startButtonCount, int endButtonCount, const MaterialColorScheme* materialColorScheme,
u32 scrimTexVramOffset, u32 scrimPlttVramOffset)
@@ -14,12 +12,12 @@ CustomAppBarView::CustomAppBarView(int x, int y, Orientation orientation,
{
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
_buttons[i] = new IconButton3DView(
_buttons[i] = SharedPtr<IconButton3DView>::MakeShared(
IconButtonView::Type::Tonal,
IconButtonView::State::NoToggle,
md::sys::color::inverseOnSurface,
materialColorScheme);
AddChildTail(_buttons[i]);
AddChildTail(_buttons[i].GetPointer());
}
}

View File

@@ -21,15 +21,15 @@ public:
const IFontRepository* fontRepository)
: _customThemeInfo(customThemeInfo), _materialColorScheme(materialColorScheme), _fontRepository(fontRepository) { }
IconGridItemView* CreateIconGridItemView() const override
SharedPtr<IconGridItemView> CreateIconGridItemView() const override
{
return new CustomIconGridItemView(_customThemeInfo, _gridCellTexVramOffset, _gridCellPlttVramOffset,
return SharedPtr<CustomIconGridItemView>::MakeShared(_customThemeInfo, _gridCellTexVramOffset, _gridCellPlttVramOffset,
_gridCellSelectedTexVramOffset, _gridCellSelectedPlttVramOffset);
}
BannerListItemView* CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const override
SharedPtr<BannerListItemView> CreateBannerListItemView(VBlankTextureLoader* vblankTextureLoader) const override
{
return new CustomBannerListItemView(_customThemeInfo, _materialColorScheme, _fontRepository,
return SharedPtr<CustomBannerListItemView>::MakeShared(_customThemeInfo, _materialColorScheme, _fontRepository,
_bannerListCellTexVramOffset, _bannerListCellPlttVramOffset,
_bannerListCellSelectedTexVramOffset, _bannerListCellSelectedPlttVramOffset, vblankTextureLoader);
}
@@ -51,16 +51,16 @@ public:
return std::make_unique<CustomFileInfoView>(_customThemeInfo, _fontRepository);
}
std::unique_ptr<RecyclerViewBase> CreateCoverFlowRecyclerView() const override
SharedPtr<RecyclerViewBase> CreateCoverFlowRecyclerView() const override
{
return std::make_unique<CoverFlowRecyclerView>();
return CoverFlowRecyclerView::CreateShared();
}
FileRecyclerAdapter* CreateCoverFlowRecyclerAdapter(
SharedPtr<FileRecyclerAdapter> CreateCoverFlowRecyclerAdapter(
RomBrowserViewModel* viewModel, const IThemeFileIconFactory* themeFileIconFactory,
VBlankTextureLoader* vblankTextureLoader) const override
{
return new CoverFlowFileRecyclerAdapter(
return SharedPtr<CoverFlowFileRecyclerAdapter>::MakeShared(
&viewModel->GetFileInfoManager(), viewModel->GetIoTaskQueue(),
themeFileIconFactory, this, vblankTextureLoader, &viewModel->GetCoverRepository());
}

View File

@@ -6,21 +6,12 @@
AppBarView::AppBarView(int x, int y, Orientation orientation,
int startButtonCount, int endButtonCount, const MaterialColorScheme* materialColorScheme)
: _orientation(orientation)
, _buttons(std::make_unique<IconButtonView*[]>(startButtonCount + endButtonCount))
, _buttons(std::make_unique<SharedPtr<IconButtonView>[]>(startButtonCount + endButtonCount))
, _startButtonCount(startButtonCount), _endButtonCount(endButtonCount)
{
SetPosition(x, y);
}
AppBarView::~AppBarView()
{
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
delete _buttons[i];
_buttons[i] = nullptr;
}
}
Rectangle AppBarView::GetBounds() const
{
if (_orientation == Orientation::Horizontal)
@@ -39,9 +30,9 @@ void AppBarView::Update()
ViewContainer::Update();
}
View* AppBarView::MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source)
SharedPtr<View> AppBarView::MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source)
{
int idx = FindButtonIndex(currentFocus);
int idx = FindButtonIndex(currentFocus.GetPointer());
if (idx >= 0)
{
if (_orientation == Orientation::Horizontal)
@@ -71,21 +62,28 @@ View* AppBarView::MoveFocus(View* currentFocus, FocusMoveDirection direction, Vi
else if ((_orientation == Orientation::Horizontal && (direction == FocusMoveDirection::Up || direction == FocusMoveDirection::Down)) ||
(_orientation == Orientation::Vertical && (direction == FocusMoveDirection::Left || direction == FocusMoveDirection::Right)))
{
if (currentFocus == nullptr)
if (!currentFocus)
return _buttons[0];
Point curFocusPoint = currentFocus->GetBounds().GetCenter();
s64 bestDistance = std::numeric_limits<s64>::max();
View* nearestButton = nullptr;
int nearestButton = -1;
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
s64 distance = curFocusPoint.DistanceSquaredTo(_buttons[i]->GetBounds().GetCenter());
if (distance < bestDistance)
{
bestDistance = distance;
nearestButton = _buttons[i];
nearestButton = i;
}
}
return nearestButton;
if (nearestButton >= 0)
{
return _buttons[nearestButton];
}
else
{
return nullptr;
}
}
else
return View::MoveFocus(currentFocus, direction, this);
@@ -126,7 +124,7 @@ int AppBarView::FindButtonIndex(const View* view)
{
for (int i = 0; i < _startButtonCount + _endButtonCount; i++)
{
if (_buttons[i] == view)
if (_buttons[i].GetPointer() == view)
{
return i;
}

View File

@@ -14,8 +14,6 @@ public:
Vertical
};
virtual ~AppBarView();
void SetButtonIcon(int button, u32 vramOffset)
{
_buttons[button]->SetIconVramOffset(vramOffset);
@@ -28,14 +26,14 @@ public:
Rectangle GetBounds() const override;
void Update() override;
View* MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source) override;
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
void Focus(FocusManager& focusManager, int button);
constexpr Orientation GetOrientation() const { return _orientation; }
protected:
Orientation _orientation;
std::unique_ptr<IconButtonView*[]> _buttons;
std::unique_ptr<SharedPtr<IconButtonView>[]> _buttons;
int _startButtonCount;
int _endButtonCount;

View File

@@ -5,7 +5,16 @@
class CoverFlowRecyclerView : public CoverFlowRecyclerViewBase
{
struct Private { explicit Private() = default; };
public:
explicit CoverFlowRecyclerView(Private) { }
static SharedPtr<CoverFlowRecyclerView> CreateShared()
{
return SharedPtr<CoverFlowRecyclerView>::MakeShared(Private());
}
void Update() override;
void Draw(GraphicsContext& graphicsContext) override;

View File

@@ -1,6 +1,14 @@
#include "common.h"
#include "CoverFlowRecyclerViewBase.h"
CoverFlowRecyclerViewBase::~CoverFlowRecyclerViewBase()
{
for (u32 i = _viewPoolFreeCount; i < _viewPool.size(); i++)
{
_adapter->ReleaseView(_viewPool[i].view, _viewPool[i].itemIdx);
}
}
void CoverFlowRecyclerViewBase::InitVram(const VramContext& vramContext)
{
for (u32 i = 0; i < _viewPool.size(); i++)
@@ -9,17 +17,18 @@ void CoverFlowRecyclerViewBase::InitVram(const VramContext& vramContext)
}
}
void CoverFlowRecyclerViewBase::SetAdapter(const RecyclerAdapter* adapter, int initialSelectedIndex)
void CoverFlowRecyclerViewBase::SetAdapter(SharedPtr<const RecyclerAdapter> adapter, int initialSelectedIndex)
{
if (_adapter)
{
_selectedItem = nullptr;
for (u32 i = 0; i < _viewPool.size(); i++)
for (u32 i = _viewPoolFreeCount; i < _viewPool.size(); i++)
{
_adapter->DestroyView(_viewPool[i].view);
_adapter->ReleaseView(_viewPool[i].view, _viewPool[i].itemIdx);
_viewPool[i].view.Reset();
}
}
_adapter = adapter;
_adapter = std::move(adapter);
// _adapter->GetViewSize(_itemWidth, _itemHeight);
_itemCount = _adapter->GetItemCount();
@@ -41,14 +50,14 @@ void CoverFlowRecyclerViewBase::SetAdapter(const RecyclerAdapter* adapter, int i
}
}
View* CoverFlowRecyclerViewBase::MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source)
SharedPtr<View> CoverFlowRecyclerViewBase::MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source)
{
if (!_selectedItem || currentFocus != _selectedItem->view)
if (!_selectedItem || currentFocus.GetPointer() != _selectedItem->view.GetPointer())
{
// incoming focus
if (direction == FocusMoveDirection::Down)
{
return _selectedItem ? _selectedItem->view : this;
return _selectedItem ? _selectedItem->view : SharedFromThis();
}
else
{
@@ -78,7 +87,7 @@ View* CoverFlowRecyclerViewBase::MoveFocus(View* currentFocus, FocusMoveDirectio
return View::MoveFocus(currentFocus, direction, this);
}
return _selectedItem ? _selectedItem->view : this;
return _selectedItem ? _selectedItem->view : SharedFromThis();
}
CoverFlowRecyclerViewBase::ViewPoolEntry* CoverFlowRecyclerViewBase::GetViewPoolEntryByItemIndex(int itemIdx)

View File

@@ -1,13 +1,16 @@
#pragma once
#include <array>
#include "core/EnableSharedFromThis.h"
#include "gui/views/RecyclerViewBase.h"
class CoverFlowRecyclerViewBase : public RecyclerViewBase
class CoverFlowRecyclerViewBase : public RecyclerViewBase, public EnableSharedFromThis<CoverFlowRecyclerViewBase>
{
public:
~CoverFlowRecyclerViewBase() override;
void InitVram(const VramContext& vramContext) override;
void SetAdapter(const RecyclerAdapter* adapter, int initialSelectedIndex = 0) override;
View* MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source) override;
void SetAdapter(SharedPtr<const RecyclerAdapter> adapter, int initialSelectedIndex = 0) override;
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
Rectangle GetBounds() const override
{
@@ -16,7 +19,14 @@ public:
void Focus(FocusManager& focusManager) override
{
focusManager.Focus(_selectedItem ? _selectedItem->view : this);
if (_selectedItem == nullptr)
{
focusManager.Focus(SharedFromThis());
}
else
{
focusManager.Focus(_selectedItem->view);
}
}
int GetSelectedItem() const override
@@ -27,7 +37,7 @@ public:
protected:
struct ViewPoolEntry
{
View* view;
SharedPtr<View> view;
int itemIdx = -1;
};

View File

@@ -19,7 +19,7 @@ void CoverView::InitVram(const VramContext& vramContext)
void CoverView::Draw(GraphicsContext& graphicsContext)
{
if (_cover.IsValid() && _textureLoadRequest.GetState() == VBlankTextureLoadRequestState::LoadComplete)
if (_cover.Lock() && _textureLoadRequest.GetState() == VBlankTextureLoadRequestState::LoadComplete)
{
Gx::TexImageParam(_texVramOffset >> 3, false, true, false, true, GX_TEXSIZE_128,
GX_TEXSIZE_128, GX_TEXFMT_PLTT256, false, GX_TEXGEN_NONE);
@@ -85,11 +85,11 @@ void CoverView::Draw(GraphicsContext& graphicsContext)
void CoverView::UploadCoverGraphics()
{
if (_cover.IsValid())
if (auto cover = _cover.Lock())
{
_cover->SetTexVramOffset(_texVramOffset, _plttVramOffset);
cover->SetTexVramOffset(_texVramOffset, _plttVramOffset);
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_textureLoadRequest = _cover->CreateTextureLoadRequest();
_textureLoadRequest = cover->CreateTextureLoadRequest();
_vblankTextureLoader->RequestLoad(_textureLoadRequest);
}
}

View File

@@ -1,6 +1,6 @@
#pragma once
#include <memory>
#include "core/SharedPtr.h"
#include "core/AtomicSharedPtr.h"
#include "gui/views/View.h"
#include "../FileType/FileCover.h"
#include "gui/VBlankTextureLoader.h"
@@ -29,19 +29,13 @@ public:
void SetCover(SharedPtr<FileCover> cover)
{
if (_cover.IsValid())
{
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
}
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_cover = std::move(cover);
}
void ClearCover()
{
if (_cover.IsValid())
{
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
}
_vblankTextureLoader->CancelLoad(_textureLoadRequest);
_cover.Reset();
}
@@ -49,7 +43,7 @@ public:
private:
VBlankTextureLoader* _vblankTextureLoader;
SharedPtr<FileCover> _cover;
AtomicSharedPtr<FileCover> _cover;
VBlankTextureLoadRequest _textureLoadRequest;
u32 _texVramOffset = 0;
u32 _plttVramOffset = 0;

View File

@@ -70,13 +70,13 @@ DisplaySettingsBottomSheetView::DisplaySettingsBottomSheetView(
for (auto& layoutOption : _layoutOptions)
{
layoutOption = CreateLayoutOptionIconButton();
AddChildTail(&layoutOption);
AddChildTail(layoutOption.GetPointer());
}
for (auto& sortOption : _sortOptions)
{
sortOption = CreateSortOptionIconButton();
AddChildTail(&sortOption);
AddChildTail(sortOption.GetPointer());
}
// for (auto& filterOption : _filterOptions)
@@ -88,38 +88,48 @@ DisplaySettingsBottomSheetView::DisplaySettingsBottomSheetView(
// _filterOptions[0].SetState(IconButtonView::State::ToggleSelected);
}
IconButton2DView DisplaySettingsBottomSheetView::CreateLayoutOptionIconButton()
SharedPtr<IconButton2DView> DisplaySettingsBottomSheetView::CreateLayoutOptionIconButton()
{
IconButton2DView layoutOption
{
auto layoutOption = SharedPtr<IconButton2DView>::MakeShared(
IconButtonView::Type::Tonal,
IconButtonView::State::ToggleUnselected,
md::sys::color::surfaceContainerLow,
_materialColorScheme
};
layoutOption.SetAction([] (IconButtonView* sender, void* arg)
);
layoutOption->SetAction([] (IconButtonView* sender, void* arg)
{
auto self = reinterpret_cast<DisplaySettingsBottomSheetView*>(arg);
u32 idx = ((IconButton2DView*)sender) - &self->_layoutOptions[0];
self->_viewModel->SetRomBrowserDisplayMode(sRomBrowserDisplayModes[idx]);
for (u32 i = 0; i < self->_layoutOptions.size(); i++)
{
if (self->_layoutOptions[i].GetPointer() == sender)
{
self->_viewModel->SetRomBrowserDisplayMode(sRomBrowserDisplayModes[i]);
break;
}
}
}, this);
return layoutOption;
}
IconButton2DView DisplaySettingsBottomSheetView::CreateSortOptionIconButton()
SharedPtr<IconButton2DView> DisplaySettingsBottomSheetView::CreateSortOptionIconButton()
{
IconButton2DView sortOption
{
auto sortOption = SharedPtr<IconButton2DView>::MakeShared(
IconButtonView::Type::Tonal,
IconButtonView::State::ToggleUnselected,
md::sys::color::surfaceContainerLow,
_materialColorScheme
};
sortOption.SetAction([] (IconButtonView* sender, void* arg)
);
sortOption->SetAction([] (IconButtonView* sender, void* arg)
{
auto self = reinterpret_cast<DisplaySettingsBottomSheetView*>(arg);
u32 idx = ((IconButton2DView*)sender) - &self->_sortOptions[0];
self->_viewModel->SetRomBrowserSortMode(sRomBrowserSortModes[idx]);
for (u32 i = 0; i < self->_sortOptions.size(); i++)
{
if (self->_sortOptions[i].GetPointer() == sender)
{
self->_viewModel->SetRomBrowserSortMode(sRomBrowserSortModes[i]);
break;
}
}
}, this);
return sortOption;
}
@@ -144,14 +154,14 @@ void DisplaySettingsBottomSheetView::InitVram(const VramContext& vramContext)
if (objVramManager)
{
// layout options
_layoutOptions[0].SetIconVramOffset(LoadIcon(*objVramManager, hGridIconTiles, hGridIconTilesLen));
_layoutOptions[1].SetIconVramOffset(LoadIcon(*objVramManager, vGridIconTiles, vGridIconTilesLen));
_layoutOptions[2].SetIconVramOffset(LoadIcon(*objVramManager, bannerListIconTiles, bannerListIconTilesLen));
_layoutOptions[3].SetIconVramOffset(LoadIcon(*objVramManager, coverflowIconTiles, coverflowIconTilesLen));
_layoutOptions[0]->SetIconVramOffset(LoadIcon(*objVramManager, hGridIconTiles, hGridIconTilesLen));
_layoutOptions[1]->SetIconVramOffset(LoadIcon(*objVramManager, vGridIconTiles, vGridIconTilesLen));
_layoutOptions[2]->SetIconVramOffset(LoadIcon(*objVramManager, bannerListIconTiles, bannerListIconTilesLen));
_layoutOptions[3]->SetIconVramOffset(LoadIcon(*objVramManager, coverflowIconTiles, coverflowIconTilesLen));
// sort options
_sortOptions[0].SetIconVramOffset(LoadIcon(*objVramManager, sortNameAscendingIconTiles, sortNameAscendingIconTilesLen));
_sortOptions[1].SetIconVramOffset(LoadIcon(*objVramManager, sortNameDescendingIconTiles, sortNameDescendingIconTilesLen));
_sortOptions[0]->SetIconVramOffset(LoadIcon(*objVramManager, sortNameAscendingIconTiles, sortNameAscendingIconTilesLen));
_sortOptions[1]->SetIconVramOffset(LoadIcon(*objVramManager, sortNameDescendingIconTiles, sortNameDescendingIconTilesLen));
// _sortOptions[2].SetIconVramOffset(LoadIcon(objVramManager, recentIconTiles, recentIconTilesLen));
// filter options
@@ -180,8 +190,8 @@ void DisplaySettingsBottomSheetView::Update()
u32 idx = 0;
for (auto& layoutOption : _layoutOptions)
{
layoutOption.SetPosition(x, _position.y + 38);
layoutOption.SetState(sRomBrowserDisplayModes[idx] == selectedDisplayMode
layoutOption->SetPosition(x, _position.y + 38);
layoutOption->SetState(sRomBrowserDisplayModes[idx] == selectedDisplayMode
? IconButtonView::State::ToggleSelected
: IconButtonView::State::ToggleUnselected);
x += 32;
@@ -192,8 +202,8 @@ void DisplaySettingsBottomSheetView::Update()
idx = 0;
for (auto& sortOption : _sortOptions)
{
sortOption.SetPosition(x, _position.y + 70);
sortOption.SetState(sRomBrowserSortModes[idx] == selectedSortMode
sortOption->SetPosition(x, _position.y + 70);
sortOption->SetState(sRomBrowserSortModes[idx] == selectedSortMode
? IconButtonView::State::ToggleSelected
: IconButtonView::State::ToggleUnselected);
x += 32;
@@ -237,25 +247,25 @@ bool DisplaySettingsBottomSheetView::HandleInput(
return false;
}
View* DisplaySettingsBottomSheetView::MoveFocus(View* currentFocus,
SharedPtr<View> DisplaySettingsBottomSheetView::MoveFocus(const SharedPtr<View>& currentFocus,
FocusMoveDirection direction, View* source)
{
int idx = 0;
for (auto& layoutOption : _layoutOptions)
{
if (currentFocus == &layoutOption)
if (currentFocus.GetPointer() == layoutOption.GetPointer())
{
if (direction == FocusMoveDirection::Left)
{
if (--idx < 0)
idx += _layoutOptions.size();
return &_layoutOptions[idx];
return _layoutOptions[idx];
}
else if (direction == FocusMoveDirection::Right)
{
if (++idx >= (int)_layoutOptions.size())
idx = 0;
return &_layoutOptions[idx];
return _layoutOptions[idx];
}
// else if (direction == FocusMoveDirection::Up)
// {
@@ -267,7 +277,7 @@ View* DisplaySettingsBottomSheetView::MoveFocus(View* currentFocus,
{
if (idx >= (int)_sortOptions.size())
idx = _sortOptions.size() - 1;
return &_sortOptions[idx];
return _sortOptions[idx];
}
}
idx++;
@@ -275,25 +285,25 @@ View* DisplaySettingsBottomSheetView::MoveFocus(View* currentFocus,
idx = 0;
for (auto& sortOption : _sortOptions)
{
if (currentFocus == &sortOption)
if (currentFocus.GetPointer() == sortOption.GetPointer())
{
if (direction == FocusMoveDirection::Left)
{
if (--idx < 0)
idx += _sortOptions.size();
return &_sortOptions[idx];
return _sortOptions[idx];
}
else if (direction == FocusMoveDirection::Right)
{
if (++idx >= (int)_sortOptions.size())
idx = 0;
return &_sortOptions[idx];
return _sortOptions[idx];
}
else //if (direction == FocusMoveDirection::Up)
{
if (idx >= (int)_layoutOptions.size())
idx = _layoutOptions.size() - 1;
return &_layoutOptions[idx];
return _layoutOptions[idx];
}
// else //if (direction == FocusMoveDirection::Down)
// {
@@ -343,9 +353,13 @@ void DisplaySettingsBottomSheetView::SetGraphics(
const IconButton2DView::VramToken& iconButtonVramToken)
{
for (auto& layoutOption : _layoutOptions)
layoutOption.SetGraphics(iconButtonVramToken);
{
layoutOption->SetGraphics(iconButtonVramToken);
}
for (auto& sortOption : _sortOptions)
sortOption.SetGraphics(iconButtonVramToken);
{
sortOption->SetGraphics(iconButtonVramToken);
}
// for (auto& filterOption : _filterOptions)
// filterOption.SetGraphics(iconButtonVramToken);
}

View File

@@ -19,14 +19,14 @@ public:
void Update() override;
void Draw(GraphicsContext& graphicsContext) override;
bool HandleInput(const InputProvider& inputProvider, FocusManager& focusManager) override;
View* MoveFocus(View* currentFocus,
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus,
FocusMoveDirection direction, View* source) override;
void SetGraphics(const IconButton2DView::VramToken& iconButtonVramToken);
void Focus(FocusManager& focusManager) override
{
focusManager.Focus(&_layoutOptions[0]);
focusManager.Focus(_layoutOptions[0]);
}
private:
@@ -37,14 +37,14 @@ private:
Label2DView _sortingLabel;
// LabelView _filtersLabel;
std::array<IconButton2DView, 4> _layoutOptions;
std::array<IconButton2DView, /*3*/2> _sortOptions;
std::array<SharedPtr<IconButton2DView>, 4> _layoutOptions;
std::array<SharedPtr<IconButton2DView>, /*3*/2> _sortOptions;
// std::array<IconButton2DView, 5> _filterOptions;
const MaterialColorScheme* _materialColorScheme;
IconButton2DView CreateLayoutOptionIconButton();
IconButton2DView CreateSortOptionIconButton();
SharedPtr<IconButton2DView> CreateLayoutOptionIconButton();
SharedPtr<IconButton2DView> CreateSortOptionIconButton();
// IconButton2DView CreateFilterOptionIconButton();
void UpdateLabels();

View File

@@ -13,15 +13,15 @@ NdsGameDetailsBottomSheetView::NdsGameDetailsBottomSheetView(
IRomBrowserController* romBrowserController, const MaterialColorScheme* materialColorScheme,
const IFontRepository* fontRepository)
: _romBrowserController(romBrowserController)
, _cheatsChip(md::sys::color::surfaceContainerLow, materialColorScheme, fontRepository)
, _favoriteChip(md::sys::color::surfaceContainerLow, materialColorScheme, fontRepository)
, _cheatsChip(SharedPtr<ChipView>::MakeShared(md::sys::color::surfaceContainerLow, materialColorScheme, fontRepository))
, _favoriteChip(SharedPtr<ChipView>::MakeShared(md::sys::color::surfaceContainerLow, materialColorScheme, fontRepository))
{
_cheatsChip.SetText(u"Cheats");
_cheatsChip.SetSelected(false);
AddChildTail(&_cheatsChip);
_favoriteChip.SetText(u"Favorite");
_favoriteChip.SetSelected(true);
AddChildTail(&_favoriteChip);
_cheatsChip->SetText(u"Cheats");
_cheatsChip->SetSelected(false);
AddChildTail(_cheatsChip.GetPointer());
_favoriteChip->SetText(u"Favorite");
_favoriteChip->SetSelected(true);
AddChildTail(_favoriteChip.GetPointer());
}
void NdsGameDetailsBottomSheetView::InitVram(const VramContext& vramContext)
@@ -37,15 +37,15 @@ void NdsGameDetailsBottomSheetView::InitVram(const VramContext& vramContext)
_smallHeartIconFilledVramOffset = objVramManager->Alloc(smallHeartIconFilledTilesLen);
dma_ntrCopy32(3, smallHeartIconFilledTiles, objVramManager->GetVramAddress(_smallHeartIconFilledVramOffset), smallHeartIconFilledTilesLen);
_favoriteChip.SetIcon(true, _smallHeartIconFilledVramOffset);
_favoriteChip->SetIcon(true, _smallHeartIconFilledVramOffset);
}
}
void NdsGameDetailsBottomSheetView::Update()
{
BottomSheetView::Update();
_cheatsChip.SetPosition(92, _position.y + 21);
_favoriteChip.SetPosition(162, _position.y + 21);
_cheatsChip->SetPosition(92, _position.y + 21);
_favoriteChip->SetPosition(162, _position.y + 21);
}
void NdsGameDetailsBottomSheetView::Draw(GraphicsContext& graphicsContext)
@@ -59,13 +59,13 @@ void NdsGameDetailsBottomSheetView::Draw(GraphicsContext& graphicsContext)
graphicsContext.ResetClipArea();
}
View* NdsGameDetailsBottomSheetView::MoveFocus(View* currentFocus,
SharedPtr<View> NdsGameDetailsBottomSheetView::MoveFocus(const SharedPtr<View>& currentFocus,
FocusMoveDirection direction, View* source)
{
if (currentFocus == &_cheatsChip && direction == FocusMoveDirection::Right)
return &_favoriteChip;
else if (currentFocus == &_favoriteChip && direction == FocusMoveDirection::Left)
return &_cheatsChip;
if (currentFocus.GetPointer() == _cheatsChip.GetPointer() && direction == FocusMoveDirection::Right)
return _favoriteChip;
else if (currentFocus.GetPointer() == _favoriteChip.GetPointer() && direction == FocusMoveDirection::Left)
return _cheatsChip;
return nullptr;
}

View File

@@ -16,8 +16,8 @@ public:
void SetGraphics(const ChipView::VramToken& chipVramToken)
{
_cheatsChip.SetGraphics(chipVramToken);
_favoriteChip.SetGraphics(chipVramToken);
_cheatsChip->SetGraphics(chipVramToken);
_favoriteChip->SetGraphics(chipVramToken);
}
void InitVram(const VramContext& vramContext) override;
@@ -27,10 +27,10 @@ public:
void Focus(FocusManager& focusManager) override
{
focusManager.Focus(&_cheatsChip);
focusManager.Focus(_cheatsChip);
}
View* MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source) override;
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
bool HandleInput(const InputProvider& inputProvider, FocusManager& focusManager) override;
@@ -38,6 +38,6 @@ private:
IRomBrowserController* _romBrowserController;
u32 _smallHeartIconVramOffset;
u32 _smallHeartIconFilledVramOffset;
ChipView _cheatsChip;
ChipView _favoriteChip;
SharedPtr<ChipView> _cheatsChip;
SharedPtr<ChipView> _favoriteChip;
};

View File

@@ -114,9 +114,9 @@ void RomBrowserAppBarView::VBlank()
_appBarView->VBlank();
}
View* RomBrowserAppBarView::MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source)
SharedPtr<View> RomBrowserAppBarView::MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source)
{
if (currentFocus == nullptr)
if (!currentFocus)
{
return nullptr;
}

View File

@@ -23,7 +23,7 @@ public:
return Rectangle(0, 0, 256, 192);
}
View* MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source) override;
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
void Focus(FocusManager& focusManager)
{

View File

@@ -54,9 +54,9 @@ void RomBrowserBottomScreenView::VBlank()
_romBrowserView->VBlank();
}
View* RomBrowserBottomScreenView::MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source)
SharedPtr<View> RomBrowserBottomScreenView::MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source)
{
if (currentFocus == nullptr)
if (!currentFocus)
{
return nullptr;
}

View File

@@ -6,7 +6,6 @@
#include "../DisplayMode/RomBrowserDisplayMode.h"
#include "RomBrowserView.h"
#include "RomBrowserAppBarView.h"
#include "core/SharedPtr.h"
#include "../viewModels/RomBrowserBottomScreenViewModel.h"
class IRomBrowserViewFactory;
@@ -32,7 +31,7 @@ public:
return Rectangle(0, 0, 256, 192);
}
View* MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source) override;
SharedPtr<View> MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
void Focus(FocusManager& focusManager)
{

View File

@@ -12,11 +12,11 @@
#include "RomBrowserTopScreenView.h"
RomBrowserTopScreenView::RomBrowserTopScreenView(
const SharedPtr<RomBrowserViewModel>& viewModel,
SharedPtr<RomBrowserViewModel> viewModel,
const RomBrowserDisplayMode* displayMode,
const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory)
: _viewModel(viewModel)
: _viewModel(std::move(viewModel))
, _themeFileIconFactory(themeFileIconFactory)
, _fileInfoView(romBrowserViewFactory->CreateFileInfoView())
, _showCover(displayMode->ShowCoverOnTopScreen())

View File

@@ -12,7 +12,7 @@ class IRomBrowserViewFactory;
class RomBrowserTopScreenView : public ViewContainer
{
public:
RomBrowserTopScreenView(const SharedPtr<RomBrowserViewModel>& viewModel,
RomBrowserTopScreenView(SharedPtr<RomBrowserViewModel> viewModel,
const RomBrowserDisplayMode* displayMode,
const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory);

View File

@@ -5,12 +5,12 @@
#include "RomBrowserView.h"
RomBrowserView::RomBrowserView(
const SharedPtr<RomBrowserViewModel>& viewModel,
SharedPtr<RomBrowserViewModel> viewModel,
const RomBrowserDisplayMode& displayMode,
const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory,
VBlankTextureLoader* vblankTextureLoader)
: _viewModel(viewModel), _isVertical(displayMode.IsVertical())
: _viewModel(std::move(viewModel)), _isVertical(displayMode.IsVertical())
{
_fileGridView = displayMode.CreateRecyclerView(romBrowserViewFactory);
_fileGridView->SetParent(this);
@@ -18,12 +18,6 @@ RomBrowserView::RomBrowserView(
_viewModel.GetPointer(), themeFileIconFactory, romBrowserViewFactory, vblankTextureLoader);
}
RomBrowserView::~RomBrowserView()
{
_fileGridView.reset();
delete _fileRecyclerAdapter;
}
void RomBrowserView::InitVram(const VramContext& vramContext)
{
_fileRecyclerAdapter->InitVram(vramContext); // first initialize the shared vram for the items
@@ -48,9 +42,9 @@ void RomBrowserView::VBlank()
_fileGridView->VBlank();
}
View* RomBrowserView::MoveFocus(View* currentFocus, FocusMoveDirection direction, View* source)
SharedPtr<View> RomBrowserView::MoveFocus(const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source)
{
if (currentFocus == nullptr)
if (!currentFocus)
{
return nullptr;
}
@@ -72,7 +66,7 @@ View* RomBrowserView::MoveFocus(View* currentFocus, FocusMoveDirection direction
}
return nullptr;
}
else if (source == _fileGridView.get())
else if (source == _fileGridView.GetPointer())
{
return View::MoveFocus(currentFocus, direction, source);
}
@@ -83,7 +77,7 @@ bool RomBrowserView::HandleInput(const InputProvider& inputProvider, FocusManage
{
if (inputProvider.Triggered(InputKey::A))
{
if (focusManager.IsFocusInside(_fileGridView.get()))
if (focusManager.IsFocusInside(_fileGridView.GetPointer()))
{
_viewModel->ItemActivated();
return true;
@@ -91,7 +85,7 @@ bool RomBrowserView::HandleInput(const InputProvider& inputProvider, FocusManage
}
else if (inputProvider.Triggered(InputKey::Y))
{
if (focusManager.IsFocusInside(_fileGridView.get()))
if (focusManager.IsFocusInside(_fileGridView.GetPointer()))
{
_viewModel->ShowGameInfo();
return true;

View File

@@ -13,14 +13,12 @@ class RomBrowserView : public View
{
public:
RomBrowserView(
const SharedPtr<RomBrowserViewModel>& viewModel,
SharedPtr<RomBrowserViewModel> viewModel,
const RomBrowserDisplayMode& displayMode,
const IThemeFileIconFactory* themeFileIconFactory,
const IRomBrowserViewFactory* romBrowserViewFactory,
VBlankTextureLoader* vblankTextureLoader);
~RomBrowserView();
void InitVram(const VramContext& vramContext) override;
void Update() override;
void Draw(GraphicsContext& graphicsContext) override;
@@ -40,14 +38,14 @@ public:
return true;
}
View* MoveFocus(
View* currentFocus, FocusMoveDirection direction, View* source) override;
SharedPtr<View> MoveFocus(
const SharedPtr<View>& currentFocus, FocusMoveDirection direction, View* source) override;
bool HandleInput(const InputProvider& inputProvider, FocusManager& focusManager) override;
private:
SharedPtr<RomBrowserViewModel> _viewModel;
std::unique_ptr<RecyclerViewBase> _fileGridView;
FileRecyclerAdapter* _fileRecyclerAdapter;
SharedPtr<RecyclerViewBase> _fileGridView;
SharedPtr<FileRecyclerAdapter> _fileRecyclerAdapter;
bool _isVertical;
};

View File

@@ -25,25 +25,20 @@ public:
height = 24;
}
View* CreateView() const override
SharedPtr<View> CreateView() const override
{
return new CheatListItemView(_vramOffsets, _materialColorScheme, _fontRepository);
return SharedPtr<CheatListItemView>::MakeShared(_vramOffsets, _materialColorScheme, _fontRepository);
}
void DestroyView(View* view) const override
void BindView(SharedPtr<View> view, int index) const override
{
delete (CheatListItemView*)view;
}
void BindView(View* view, int index) const override
{
auto listItemView = static_cast<CheatListItemView*>(view);
auto listItemView = static_cast<CheatListItemView*>(view.GetPointer());
u32 numberOfSubEntries = 0;
auto subEntries = _cheatCategory->GetSubEntries(numberOfSubEntries);
listItemView->SetEntry(&subEntries[index]);
}
void ReleaseView(View* view, int index) const override
void ReleaseView(SharedPtr<View> view, int index) const override
{
// Nothing to do
}

View File

@@ -37,7 +37,7 @@ CheatsBottomSheetView::CheatsBottomSheetView(std::unique_ptr<CheatsViewModel> vi
, _titleLabel(64, 16, 25, fontRepository->GetFont(FontType::Medium11))
, _secondaryLabel(177, 16, 64, fontRepository->GetFont(FontType::Regular10))
, _descriptionLabel(224, 16, 256, fontRepository->GetFont(FontType::Medium7_5))
, _cheatListRecycler(std::make_unique<RecyclerView>(
, _cheatListRecycler(RecyclerView::CreateShared(
LIST_X, LIST_Y, LIST_WIDTH, LIST_HEIGHT, RecyclerView::Mode::VerticalList))
, _materialColorScheme(materialColorScheme)
, _fontRepository(fontRepository)
@@ -51,7 +51,7 @@ CheatsBottomSheetView::CheatsBottomSheetView(std::unique_ptr<CheatsViewModel> vi
AddChildTail(&_titleLabel);
AddChildTail(&_secondaryLabel);
AddChildTail(&_descriptionLabel);
AddChildTail(_cheatListRecycler.get());
AddChildTail(_cheatListRecycler.GetPointer());
}
void CheatsBottomSheetView::InitVram(const VramContext& vramContext)
@@ -96,9 +96,9 @@ void CheatsBottomSheetView::Update()
_cheatListRecycler->SetPosition(LIST_X, _position.y + LIST_Y);
if (_viewModel->GetState() == CheatsViewModel::State::DisplayCheats)
{
if (_cheatsAdapter == nullptr && _objVramManager != nullptr)
if (!_cheatsAdapter && _objVramManager != nullptr)
{
_cheatsAdapter = new CheatsAdapter(
_cheatsAdapter = SharedPtr<CheatsAdapter>::MakeShared(
_viewModel->GetCurrentCheatCategory(), _materialColorScheme, _fontRepository, _vramOffsets);
_cheatListRecycler->SetAdapter(_cheatsAdapter);
@@ -199,7 +199,7 @@ bool CheatsBottomSheetView::HandleInput(const InputProvider& inputProvider, Focu
{
if (inputProvider.Triggered(InputKey::A))
{
if (focusManager.IsFocusInside(_cheatListRecycler.get()))
if (focusManager.IsFocusInside(_cheatListRecycler.GetPointer()))
{
auto oldCategory = _viewModel->GetCurrentCheatCategory();
_viewModel->ActivateSelectedItem();
@@ -240,11 +240,9 @@ void CheatsBottomSheetView::UpdateCheatList()
// Need to unfocus first, otherwise the focus manager still contains a pointer to a view that is going to be destroyed
_focusManager->Unfocus();
auto oldAdapter = _cheatsAdapter;
_cheatsAdapter = new CheatsAdapter(
_cheatsAdapter = SharedPtr<CheatsAdapter>::MakeShared(
_viewModel->GetCurrentCheatCategory(), _materialColorScheme, _fontRepository, _vramOffsets);
_cheatListRecycler->SetAdapter(_cheatsAdapter, _viewModel->GetSelectedItem());
delete oldAdapter;
// Ugly hack
((DescendingStackVramManager*)_objVramManager)->SetState(_savedVramState);

View File

@@ -1,5 +1,6 @@
#pragma once
#include <memory>
#include "core/SharedPtr.h"
#include "romBrowser/views/BottomSheetView.h"
#include "gui/views/Label2DView.h"
#include "gui/views/RecyclerView.h"
@@ -19,15 +20,6 @@ public:
const MaterialColorScheme* materialColorScheme, const IFontRepository* fontRepository,
FocusManager* focusManager);
~CheatsBottomSheetView() override
{
_cheatListRecycler.reset();
if (_cheatsAdapter != nullptr)
{
delete _cheatsAdapter;
}
}
void InitVram(const VramContext& vramContext) override;
void Update() override;
void Draw(GraphicsContext& graphicsContext) override;
@@ -43,8 +35,8 @@ private:
Label2DView _titleLabel;
Label2DView _secondaryLabel;
Label2DView _descriptionLabel;
std::unique_ptr<RecyclerView> _cheatListRecycler;
CheatsAdapter* _cheatsAdapter = nullptr;
SharedPtr<RecyclerView> _cheatListRecycler;
SharedPtr<CheatsAdapter> _cheatsAdapter;
const MaterialColorScheme* _materialColorScheme;
const IFontRepository* _fontRepository;
IVramManager* _objVramManager = nullptr;