Files
pico-launcher/arm9/source/romBrowser/views/DisplaySettingsBottomSheetView.cpp
2025-11-25 17:41:31 +01:00

359 lines
13 KiB
C++

#include "common.h"
#include "gui/GraphicsContext.h"
#include "gui/VramContext.h"
#include "gui/IVramManager.h"
#include "hGridIcon.h"
#include "vGridIcon.h"
#include "bannerListIcon.h"
#include "listIcon.h"
#include "sortNameAscendingIcon.h"
#include "sortNameDescendingIcon.h"
#include "recentIcon.h"
#include "gamesIcon.h"
#include "picturesIcon.h"
#include "musicIcon.h"
#include "moviesIcon.h"
#include "unknownIcon.h"
#include "coverflowIcon.h"
#include "../IRomBrowserController.h"
#include "gui/input/InputProvider.h"
#include "themes/material/MaterialColorScheme.h"
#include "themes/IFontRepository.h"
#include "DisplaySettingsBottomSheetView.h"
#define TITLE_LABEL_X 20
#define TITLE_LABEL_Y 16
#define LAYOUT_LABEL_X 20
#define LAYOUT_LABEL_Y 46
#define SORTING_LABEL_X 20
#define SORTING_LABEL_Y 78
#define FILTERS_LABEL_X 20
#define FILTERS_LABEL_Y 112
static RomBrowserLayout sRomBrowserDisplayModes[4] =
{
[0] = RomBrowserLayout::HorizontalIconGrid,
[1] = RomBrowserLayout::VerticalIconGrid,
[2] = RomBrowserLayout::BannerList,
[3] = RomBrowserLayout::CoverFlow
};
static RomBrowserSortMode sRomBrowserSortModes[4] =
{
[0] = RomBrowserSortMode::NameAscending,
[1] = RomBrowserSortMode::NameDescending,
[2] = RomBrowserSortMode::LastModified
};
DisplaySettingsBottomSheetView::DisplaySettingsBottomSheetView(
DisplaySettingsViewModel* viewModel, const MaterialColorScheme* materialColorScheme,
const IFontRepository* fontRepository)
: _viewModel(viewModel)
, _titleLabel(128, 16, 25, fontRepository->GetFont(FontType::Medium11))
, _layoutLabel(64, 16, 25, fontRepository->GetFont(FontType::Regular10))
, _sortingLabel(64, 16, 25, fontRepository->GetFont(FontType::Regular10))
, _materialColorScheme(materialColorScheme)
// , _filtersLabel(64, 16, 25, fontRepository->GetFont(FontType::Regular10))
{
_titleLabel.SetText(u"Display Settings");
AddChildTail(&_titleLabel);
_layoutLabel.SetText(u"Layout");
AddChildTail(&_layoutLabel);
_sortingLabel.SetText(u"Sorting");
AddChildTail(&_sortingLabel);
// _filtersLabel.SetText(u"Filters");
// AddChildTail(&_filtersLabel);
for (auto& layoutOption : _layoutOptions)
{
layoutOption = CreateLayoutOptionIconButton();
AddChildTail(&layoutOption);
}
for (auto& sortOption : _sortOptions)
{
sortOption = CreateSortOptionIconButton();
AddChildTail(&sortOption);
}
// for (auto& filterOption : _filterOptions)
// {
// filterOption = CreateFilterOptionIconButton();
// AddChildTail(&filterOption);
// }
// _filterOptions[0].SetState(IconButtonView::State::ToggleSelected);
}
IconButton2DView DisplaySettingsBottomSheetView::CreateLayoutOptionIconButton()
{
IconButton2DView layoutOption
{
IconButtonView::Type::Tonal,
IconButtonView::State::ToggleUnselected,
md::sys::color::surfaceContainerLow,
_materialColorScheme
};
layoutOption.SetAction([] (IconButtonView* sender, void* arg)
{
auto self = reinterpret_cast<DisplaySettingsBottomSheetView*>(arg);
u32 idx = ((IconButton2DView*)sender) - &self->_layoutOptions[0];
self->_viewModel->SetRomBrowserDisplayMode(sRomBrowserDisplayModes[idx]);
}, this);
return layoutOption;
}
IconButton2DView DisplaySettingsBottomSheetView::CreateSortOptionIconButton()
{
IconButton2DView sortOption
{
IconButtonView::Type::Tonal,
IconButtonView::State::ToggleUnselected,
md::sys::color::surfaceContainerLow,
_materialColorScheme
};
sortOption.SetAction([] (IconButtonView* sender, void* arg)
{
auto self = reinterpret_cast<DisplaySettingsBottomSheetView*>(arg);
u32 idx = ((IconButton2DView*)sender) - &self->_sortOptions[0];
self->_viewModel->SetRomBrowserSortMode(sRomBrowserSortModes[idx]);
}, this);
return sortOption;
}
// IconButtonView DisplaySettingsBottomSheetView::CreateFilterOptionIconButton()
// {
// IconButtonView filterOption
// {
// IconButtonView::Type::Tonal,
// IconButtonView::State::ToggleUnselected,
// md::sys::color::surfaceContainerLow,
// _materialColorScheme
// };
// return filterOption;
// }
void DisplaySettingsBottomSheetView::InitVram(const VramContext& vramContext)
{
BottomSheetView::InitVram(vramContext);
const auto objVramManager = vramContext.GetObjVramManager();
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));
// sort options
_sortOptions[0].SetIconVramOffset(LoadIcon(*objVramManager, sortNameAscendingIconTiles, sortNameAscendingIconTilesLen));
_sortOptions[1].SetIconVramOffset(LoadIcon(*objVramManager, sortNameDescendingIconTiles, sortNameDescendingIconTilesLen));
// _sortOptions[2].SetIconVramOffset(LoadIcon(objVramManager, recentIconTiles, recentIconTilesLen));
// filter options
// _filterOptions[0].SetIconVramOffset(LoadIcon(objVramManager, gamesIconTiles, gamesIconTilesLen));
// _filterOptions[1].SetIconVramOffset(LoadIcon(objVramManager, picturesIconTiles, picturesIconTilesLen));
// _filterOptions[2].SetIconVramOffset(LoadIcon(objVramManager, musicIconTiles, musicIconTilesLen));
// _filterOptions[3].SetIconVramOffset(LoadIcon(objVramManager, moviesIconTiles, moviesIconTilesLen));
// _filterOptions[4].SetIconVramOffset(LoadIcon(objVramManager, unknownIconTiles, unknownIconTilesLen));
}
}
void DisplaySettingsBottomSheetView::UpdateLabels()
{
_titleLabel.SetPosition(TITLE_LABEL_X, _position.y + TITLE_LABEL_Y);
_layoutLabel.SetPosition(LAYOUT_LABEL_X, _position.y + LAYOUT_LABEL_Y);
_sortingLabel.SetPosition(SORTING_LABEL_X, _position.y + SORTING_LABEL_Y);
// _filtersLabel.SetPosition(FILTERS_LABEL_X, _position.y + FILTERS_LABEL_Y);
}
void DisplaySettingsBottomSheetView::Update()
{
BottomSheetView::Update();
UpdateLabels();
auto selectedDisplayMode = _viewModel->GetRomBrowserDisplayMode();
int x = 70;
u32 idx = 0;
for (auto& layoutOption : _layoutOptions)
{
layoutOption.SetPosition(x, _position.y + 38);
layoutOption.SetState(sRomBrowserDisplayModes[idx] == selectedDisplayMode
? IconButtonView::State::ToggleSelected
: IconButtonView::State::ToggleUnselected);
x += 32;
idx++;
}
auto selectedSortMode = _viewModel->GetRomBrowserSortMode();
x = 70;
idx = 0;
for (auto& sortOption : _sortOptions)
{
sortOption.SetPosition(x, _position.y + 70);
sortOption.SetState(sRomBrowserSortModes[idx] == selectedSortMode
? IconButtonView::State::ToggleSelected
: IconButtonView::State::ToggleUnselected);
x += 32;
idx++;
}
// x = 70;
// for (auto& filterOption : _filterOptions)
// {
// filterOption.SetPosition(x, _position.y + 102);
// x += 32;
// }
}
void DisplaySettingsBottomSheetView::Draw(GraphicsContext& graphicsContext)
{
graphicsContext.SetClipArea(GetBounds());
u32 oldPrio = graphicsContext.SetPriority(1);
{
_titleLabel.SetBackgroundColor(_materialColorScheme->GetColor(md::sys::color::surfaceContainerLow));
_titleLabel.SetForegroundColor(_materialColorScheme->onSurface);
_layoutLabel.SetBackgroundColor(_materialColorScheme->GetColor(md::sys::color::surfaceContainerLow));
_layoutLabel.SetForegroundColor(_materialColorScheme->onSurfaceVariant);
_sortingLabel.SetBackgroundColor(_materialColorScheme->GetColor(md::sys::color::surfaceContainerLow));
_sortingLabel.SetForegroundColor(_materialColorScheme->onSurfaceVariant);
// _filtersLabel.SetBackgroundColor(_materialColorScheme->GetColor(md::sys::color::surfaceContainerLow));
// _filtersLabel.SetForegroundColor(_materialColorScheme->onSurfaceVariant);
BottomSheetView::Draw(graphicsContext);
}
graphicsContext.SetPriority(oldPrio);
graphicsContext.ResetClipArea();
}
bool DisplaySettingsBottomSheetView::HandleInput(
const InputProvider& inputProvider, FocusManager& focusManager)
{
if (inputProvider.Triggered(InputKey::B))
{
_viewModel->Close();
return true;
}
return false;
}
View* DisplaySettingsBottomSheetView::MoveFocus(View* currentFocus,
FocusMoveDirection direction, View* source)
{
int idx = 0;
for (auto& layoutOption : _layoutOptions)
{
if (currentFocus == &layoutOption)
{
if (direction == FocusMoveDirection::Left)
{
if (--idx < 0)
idx += _layoutOptions.size();
return &_layoutOptions[idx];
}
else if (direction == FocusMoveDirection::Right)
{
if (++idx >= (int)_layoutOptions.size())
idx = 0;
return &_layoutOptions[idx];
}
// else if (direction == FocusMoveDirection::Up)
// {
// if (idx >= (int)_filterOptions.size())
// idx = _filterOptions.size() - 1;
// return &_filterOptions[idx];
// }
else //if (direction == FocusMoveDirection::Down)
{
if (idx >= (int)_sortOptions.size())
idx = _sortOptions.size() - 1;
return &_sortOptions[idx];
}
}
idx++;
}
idx = 0;
for (auto& sortOption : _sortOptions)
{
if (currentFocus == &sortOption)
{
if (direction == FocusMoveDirection::Left)
{
if (--idx < 0)
idx += _sortOptions.size();
return &_sortOptions[idx];
}
else if (direction == FocusMoveDirection::Right)
{
if (++idx >= (int)_sortOptions.size())
idx = 0;
return &_sortOptions[idx];
}
else //if (direction == FocusMoveDirection::Up)
{
if (idx >= (int)_layoutOptions.size())
idx = _layoutOptions.size() - 1;
return &_layoutOptions[idx];
}
// else //if (direction == FocusMoveDirection::Down)
// {
// if (idx >= (int)_filterOptions.size())
// idx = _filterOptions.size() - 1;
// return &_filterOptions[idx];
// }
}
idx++;
}
// idx = 0;
// for (auto& filterOption : _filterOptions)
// {
// if (currentFocus == &filterOption)
// {
// if (direction == FocusMoveDirection::Left)
// {
// if (--idx < 0)
// idx += _filterOptions.size();
// return &_filterOptions[idx];
// }
// else if (direction == FocusMoveDirection::Right)
// {
// if (++idx >= (int)_filterOptions.size())
// idx = 0;
// return &_filterOptions[idx];
// }
// else if (direction == FocusMoveDirection::Up)
// {
// if (idx >= (int)_sortOptions.size())
// idx = _sortOptions.size() - 1;
// return &_sortOptions[idx];
// }
// else //if (direction == FocusMoveDirection::Down)
// {
// if (idx >= (int)_layoutOptions.size())
// idx = _layoutOptions.size() - 1;
// return &_layoutOptions[idx];
// }
// }
// idx++;
// }
return nullptr;
}
void DisplaySettingsBottomSheetView::SetGraphics(
const IconButton2DView::VramToken& iconButtonVramToken)
{
for (auto& layoutOption : _layoutOptions)
layoutOption.SetGraphics(iconButtonVramToken);
for (auto& sortOption : _sortOptions)
sortOption.SetGraphics(iconButtonVramToken);
// for (auto& filterOption : _filterOptions)
// filterOption.SetGraphics(iconButtonVramToken);
}
u32 DisplaySettingsBottomSheetView::LoadIcon(IVramManager& vramManager,
const unsigned int* tiles, u32 tilesLength) const
{
u32 vramOffset = vramManager.Alloc(tilesLength);
dma_ntrCopy32(3, tiles, vramManager.GetVramAddress(vramOffset), tilesLength);
return vramOffset;
}