#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(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(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; }