mirror of
https://github.com/LNH-team/pico-launcher.git
synced 2026-06-02 00:56:55 +02:00
Initial commit
This commit is contained in:
359
arm9/source/romBrowser/views/DisplaySettingsBottomSheetView.cpp
Normal file
359
arm9/source/romBrowser/views/DisplaySettingsBottomSheetView.cpp
Normal file
@@ -0,0 +1,359 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user