From e4275cea8172ccdb5a8e2440fbd143b58f253383 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 30 Mar 2020 01:14:29 +0200 Subject: [PATCH] Update to latest libtesla, help text when no overlays found, show ovl versions --- .vscode/c_cpp_properties.json | 4 +-- Makefile | 3 ++ libs/libtesla | 2 +- source/main.cpp | 54 ++++++++++++++++++++--------------- 4 files changed, 37 insertions(+), 26 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0836926..ee2d6ff 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -4,7 +4,7 @@ "name": "DKP Aarch64 Windows", "includePath": [ "C:/devkitPro/devkitA64/aarch64-none-elf/include/**", - "C:/devkitPro/devkitA64/lib/gcc/aarch64-none-elf/8.3.0/include/**", + "C:/devkitPro/devkitA64/lib/gcc/aarch64-none-elf/9.2.0/include/**", "C:/devkitPro/libnx/include/**", "C:/devkitPro/portlibs/switch/include/**", "C:/devkitPro/portlibs/switch/include/freetype2/**", @@ -25,7 +25,7 @@ "name": "DKP Aarch64 Linux", "includePath": [ "/opt/devkitpro/devkitA64/aarch64-none-elf/include/**", - "/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/8.3.0/include/**", + "/opt/devkitpro/devkitA64/lib/gcc/aarch64-none-elf/9.2.0/include/**", "/opt/devkitpro/libnx/include/**", "/opt/devkitpro/portlibs/switch/include/**", "/opt/devkitpro/portlibs/switch/include/**", diff --git a/Makefile b/Makefile index 7b11ecc..c8277e2 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,9 @@ include $(DEVKITPRO)/libnx/switch_rules # of a homebrew executable (.nro). This is intended to be used for sysmodules. # NACP building is skipped as well. #--------------------------------------------------------------------------------- +APP_TITLE := Tesla Menu +APP_VERSION := v1.1.0 + TARGET := $(notdir $(CURDIR)) BUILD := build SOURCES := source diff --git a/libs/libtesla b/libs/libtesla index a00f404..1ba52ab 160000 --- a/libs/libtesla +++ b/libs/libtesla @@ -1 +1 @@ -Subproject commit a00f404f865365e389214da59d52ee437ace5d7b +Subproject commit 1ba52ab5d8601d5b3b17c2915bc07a307958d96c diff --git a/source/main.cpp b/source/main.cpp index 00923df..780f5b9 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -37,7 +38,7 @@ constexpr int Module_OverlayLoader = 348; constexpr Result ResultSuccess = MAKERESULT(0, 0); constexpr Result ResultParseError = MAKERESULT(Module_OverlayLoader, 1); -std::pair getOverlayName(std::string filePath) { +std::tuple getOverlayInfo(std::string filePath) { FILE *file = fopen(filePath.c_str(), "r"); NroHeader header; @@ -47,50 +48,52 @@ std::pair getOverlayName(std::string filePath) { fseek(file, sizeof(NroStart), SEEK_SET); if (fread(&header, sizeof(NroHeader), 1, file) != 1) { fclose(file); - return { ResultParseError, "" }; + return { ResultParseError, "", "" }; } fseek(file, header.size, SEEK_SET); if (fread(&assetHeader, sizeof(NroAssetHeader), 1, file) != 1) { fclose(file); - return { ResultParseError, "" }; + return { ResultParseError, "", "" }; } fseek(file, header.size + assetHeader.nacp.offset, SEEK_SET); if (fread(&nacp, sizeof(NacpStruct), 1, file) != 1) { fclose(file); - return { ResultParseError, "" }; + return { ResultParseError, "", "" }; } fclose(file); - return { ResultSuccess, std::string(nacp.lang[0].name, sizeof(nacp.lang[0].name)) }; + return { ResultSuccess, std::string(nacp.lang[0].name, std::strlen(nacp.lang[0].name)), std::string(nacp.display_version, std::strlen(nacp.display_version)) }; } -class TeslaMenuFrame : public tsl::elm::OverlayFrame { -public: - TeslaMenuFrame() : OverlayFrame("", "") {} - ~TeslaMenuFrame() {} - - virtual void draw(tsl::gfx::Renderer *renderer) override { - OverlayFrame::draw(renderer); - - renderer->drawBitmap(20, 20, 84, 31, logo_bin); - renderer->drawString(envGetLoaderInfo(), false, 20, 68, 15, renderer->a(0xFFFF)); - } -}; - -static TeslaMenuFrame *rootFrame = nullptr; +static tsl::elm::HeaderOverlayFrame *rootFrame = nullptr; static void rebuildUI() { auto *overlayList = new tsl::elm::List(); + auto *header = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { + const u8 *logo = logo_bin; + + for (s32 y1 = 0; y1 < 31; y1++) { + for (s32 x1 = 0; x1 < 84; x1++) { + const tsl::gfx::Color color = { static_cast(logo[3] >> 4), static_cast(logo[2] >> 4), static_cast(logo[1] >> 4), static_cast(logo[0] >> 4) }; + renderer->setPixelBlendSrc(20 + x1, 20 + y1, renderer->a(color)); + logo += 4; + } + } + + renderer->drawString(envGetLoaderInfo(), false, 20, 68, 15, renderer->a(0xFFFF)); + }); auto noOverlaysError = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) { - renderer->drawString("\uE150", false, (tsl::cfg::FramebufferWidth - 90) / 2, 300, 90, renderer->a(0xFFFF)); - renderer->drawString("No Overlays found!", false, 105, 380, 25, renderer->a(0xFFFF)); + renderer->drawString("\uE150", false, (tsl::cfg::FramebufferWidth - 90) / 2, 300, 90, renderer->a(tsl::style::color::ColorText)); + renderer->drawString("No Overlays found!", false, 105, 380, 25, renderer->a(tsl::style::color::ColorText)); + renderer->drawString("Place your .ovl files in /switch/.overlays", false, 82, 410, 15, renderer->a(tsl::style::color::ColorDescription)); }); u16 entries = 0; + fsdevMountSdmc(); for (const auto &entry : std::filesystem::directory_iterator("sdmc:/switch/.overlays")) { if (entry.path().filename() == "ovlmenu.ovl") continue; @@ -98,11 +101,12 @@ static void rebuildUI() { if (entry.path().extension() != ".ovl") continue; - auto [result, name] = getOverlayName(entry.path()); + auto [result, name, version] = getOverlayInfo(entry.path()); if (result != ResultSuccess) continue; auto *listEntry = new tsl::elm::ListItem(name); + listEntry->setValue(version, true); listEntry->setClickListener([entry, entries](s64 key) { if (key & KEY_A) { tsl::setNextOverlay(entry.path()); @@ -118,12 +122,16 @@ static void rebuildUI() { entries++; } + rootFrame->setHeader(header); + if (entries == 0) { rootFrame->setContent(noOverlaysError); delete overlayList; } else { rootFrame->setContent(overlayList); } + + fsdevUnmountDevice("sdmc"); } class GuiMain : public tsl::Gui { @@ -132,7 +140,7 @@ class GuiMain : public tsl::Gui { ~GuiMain() { } tsl::elm::Element* createUI() override { - rootFrame = new TeslaMenuFrame(); + rootFrame = new tsl::elm::HeaderOverlayFrame(); rebuildUI();