- nca::ParseControl now gets the nacp base on the language. - xci returns a more descriptive error and logs info during install. - replace volatile with atmoic, label atmoic methods with volatile as per the standard. - s2s usb install skips verifying the content as its being installed from another switch. - fix game / save menu bug where it would only load the nacp if it has started yet, now it will force load even if its in progress. this fixes save file zips having empty names. - game menu saves the application type, to be later used for displaying if its a gamecard (inserted or not), launched etc.
105 lines
2.5 KiB
C++
105 lines
2.5 KiB
C++
#pragma once
|
|
|
|
#include "ui/menus/grid_menu_base.hpp"
|
|
#include "ui/list.hpp"
|
|
#include "title_info.hpp"
|
|
#include "fs.hpp"
|
|
#include "option.hpp"
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <span>
|
|
|
|
namespace sphaira::ui::menu::game {
|
|
|
|
struct Entry {
|
|
u64 app_id{};
|
|
u8 type{};
|
|
NacpLanguageEntry lang{};
|
|
int image{};
|
|
bool selected{};
|
|
title::NacpLoadStatus status{title::NacpLoadStatus::None};
|
|
|
|
auto GetName() const -> const char* {
|
|
return lang.name;
|
|
}
|
|
|
|
auto GetAuthor() const -> const char* {
|
|
return lang.author;
|
|
}
|
|
};
|
|
|
|
enum SortType {
|
|
SortType_Updated,
|
|
};
|
|
|
|
enum OrderType {
|
|
OrderType_Descending,
|
|
OrderType_Ascending,
|
|
};
|
|
|
|
using LayoutType = grid::LayoutType;
|
|
|
|
struct Menu final : grid::Menu {
|
|
Menu(u32 flags);
|
|
~Menu();
|
|
|
|
auto GetShortTitle() const -> const char* override { return "Games"; };
|
|
void Update(Controller* controller, TouchInfo* touch) override;
|
|
void Draw(NVGcontext* vg, Theme* theme) override;
|
|
void OnFocusGained() override;
|
|
|
|
private:
|
|
void SetIndex(s64 index);
|
|
void ScanHomebrew();
|
|
void Sort();
|
|
void SortAndFindLastFile(bool scan);
|
|
void FreeEntries();
|
|
void OnLayoutChange();
|
|
|
|
auto GetSelectedEntries() const {
|
|
std::vector<Entry> out;
|
|
for (auto& e : m_entries) {
|
|
if (e.selected) {
|
|
out.emplace_back(e);
|
|
}
|
|
}
|
|
|
|
if (!m_entries.empty() && out.empty()) {
|
|
out.emplace_back(m_entries[m_index]);
|
|
}
|
|
|
|
return out;
|
|
}
|
|
|
|
void ClearSelection() {
|
|
for (auto& e : m_entries) {
|
|
e.selected = false;
|
|
}
|
|
|
|
m_selected_count = 0;
|
|
}
|
|
|
|
void DeleteGames();
|
|
void DumpGames(u32 flags);
|
|
void CreateSaves(AccountUid uid);
|
|
|
|
private:
|
|
static constexpr inline const char* INI_SECTION = "games";
|
|
static constexpr inline const char* INI_SECTION_DUMP = "dump";
|
|
|
|
std::vector<Entry> m_entries{};
|
|
s64 m_index{}; // where i am in the array
|
|
s64 m_selected_count{};
|
|
std::unique_ptr<List> m_list{};
|
|
bool m_is_reversed{};
|
|
bool m_dirty{};
|
|
|
|
option::OptionLong m_sort{INI_SECTION, "sort", SortType::SortType_Updated};
|
|
option::OptionLong m_order{INI_SECTION, "order", OrderType::OrderType_Descending};
|
|
option::OptionLong m_layout{INI_SECTION, "layout", LayoutType::LayoutType_Grid};
|
|
option::OptionBool m_hide_forwarders{INI_SECTION, "hide_forwarders", false};
|
|
option::OptionBool m_title_cache{INI_SECTION, "title_cache", true};
|
|
};
|
|
|
|
} // namespace sphaira::ui::menu::game
|