From e2da60646dadedbdbb35301e1735cc7197c384ae Mon Sep 17 00:00:00 2001 From: Pablo Curiel Date: Wed, 23 Jun 2021 13:30:39 -0400 Subject: [PATCH] Rewrote RootView. --- include/captioned_image.hpp | 34 --- include/components_tab.hpp | 30 --- include/main_activity.hpp | 26 --- include/recycling_list_tab.hpp | 27 --- {legacy_borealis => include}/root_view.hpp | 6 +- {legacy_borealis => include}/tasks.hpp | 80 +++---- legacy_borealis/en-US/about_tab.json | 34 +++ .../fr => legacy_borealis/en-US}/brls.json | 6 +- legacy_borealis/en-US/gamecard_tab.json | 57 +++++ legacy_borealis/en-US/generic.json | 3 + legacy_borealis/en-US/user_titles_tab.json | 4 + legacy_borealis/root_view.cpp | 211 ----------------- resources/i18n/en-US/demo.json | 48 ---- resources/i18n/en-US/root_view.json | 19 ++ resources/i18n/fr/demo.json | 1 - resources/img/borealis_256.png | Bin 24860 -> 0 bytes resources/img/borealis_96.png | Bin 6444 -> 0 bytes resources/img/tiles.png | Bin 86810 -> 0 bytes resources/xml/activity/main.xml | 102 -------- resources/xml/tabs/components.xml | 216 ----------------- resources/xml/tabs/layout.xml | 4 - resources/xml/tabs/recycling_list.xml | 11 - resources/xml/views/captioned_image.xml | 21 -- source/captioned_image.cpp | 65 ------ source/components_tab.cpp | 43 ---- source/main.cpp | 97 ++++---- source/main_activity.cpp | 17 -- source/recycling_list_tab.cpp | 29 --- source/root_view.cpp | 219 ++++++++++++++++++ {legacy_borealis => source}/tasks.cpp | 186 ++++++--------- 30 files changed, 499 insertions(+), 1097 deletions(-) delete mode 100644 include/captioned_image.hpp delete mode 100644 include/components_tab.hpp delete mode 100644 include/main_activity.hpp delete mode 100644 include/recycling_list_tab.hpp rename {legacy_borealis => include}/root_view.hpp (85%) rename {legacy_borealis => include}/tasks.hpp (65%) create mode 100644 legacy_borealis/en-US/about_tab.json rename {resources/i18n/fr => legacy_borealis/en-US}/brls.json (57%) create mode 100644 legacy_borealis/en-US/gamecard_tab.json create mode 100644 legacy_borealis/en-US/generic.json create mode 100644 legacy_borealis/en-US/user_titles_tab.json delete mode 100644 legacy_borealis/root_view.cpp delete mode 100644 resources/i18n/en-US/demo.json create mode 100644 resources/i18n/en-US/root_view.json delete mode 100644 resources/i18n/fr/demo.json delete mode 100644 resources/img/borealis_256.png delete mode 100644 resources/img/borealis_96.png delete mode 100644 resources/img/tiles.png delete mode 100644 resources/xml/activity/main.xml delete mode 100644 resources/xml/tabs/components.xml delete mode 100644 resources/xml/tabs/layout.xml delete mode 100644 resources/xml/tabs/recycling_list.xml delete mode 100644 resources/xml/views/captioned_image.xml delete mode 100644 source/captioned_image.cpp delete mode 100644 source/components_tab.cpp delete mode 100644 source/main_activity.cpp delete mode 100644 source/recycling_list_tab.cpp create mode 100644 source/root_view.cpp rename {legacy_borealis => source}/tasks.cpp (60%) diff --git a/include/captioned_image.hpp b/include/captioned_image.hpp deleted file mode 100644 index 1980a69..0000000 --- a/include/captioned_image.hpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -#include - -class CaptionedImage : public brls::Box -{ - public: - CaptionedImage(); - - void onChildFocusGained(brls::View* directChild, brls::View* focusedView) override; - void onChildFocusLost(brls::View* directChild, brls::View* focusedView) override; - - static brls::View* create(); - - private: - BRLS_BIND(brls::Image, image, "image"); - BRLS_BIND(brls::Label, label, "label"); -}; diff --git a/include/components_tab.hpp b/include/components_tab.hpp deleted file mode 100644 index a7aab4f..0000000 --- a/include/components_tab.hpp +++ /dev/null @@ -1,30 +0,0 @@ -/* - Copyright 2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -#include - -class ComponentsTab : public brls::Box -{ - public: - ComponentsTab(); - - static brls::View* create(); - - private: - bool onPrimaryButtonClicked(brls::View* view); -}; diff --git a/include/main_activity.hpp b/include/main_activity.hpp deleted file mode 100644 index cfbe3e3..0000000 --- a/include/main_activity.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -#include - -class MainActivity : public brls::Activity -{ - public: - // Declare that the content of this activity is the given XML file - CONTENT_FROM_XML_RES("activity/main.xml"); -}; diff --git a/include/recycling_list_tab.hpp b/include/recycling_list_tab.hpp deleted file mode 100644 index c3b09da..0000000 --- a/include/recycling_list_tab.hpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#pragma once - -#include - -class RecyclingListTab : public brls::Box -{ - public: - RecyclingListTab(); - - static brls::View* create(); -}; diff --git a/legacy_borealis/root_view.hpp b/include/root_view.hpp similarity index 85% rename from legacy_borealis/root_view.hpp rename to include/root_view.hpp index edd965a..8a30cde 100644 --- a/legacy_borealis/root_view.hpp +++ b/include/root_view.hpp @@ -39,7 +39,7 @@ namespace nxdt::views nxdt::tasks::UmsTask *ums_task = nullptr; nxdt::tasks::UsbHostTask *usb_host_task = nullptr; - nxdt::tasks::VoidEvent::Subscription status_info_task_sub; + nxdt::tasks::StatusInfoEvent::Subscription status_info_task_sub; brls::Label *applet_mode_lbl = nullptr; brls::Label *time_lbl = nullptr; @@ -47,8 +47,8 @@ namespace nxdt::views brls::Label *connection_icon = nullptr, *connection_status_lbl = nullptr; protected: - void draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) override; - void layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash) override; + void draw(NVGcontext* vg, float x, float y, float width, float height, brls::Style style, brls::FrameContext* ctx) override; + void onLayout(void) override; public: RootView(void); diff --git a/legacy_borealis/tasks.hpp b/include/tasks.hpp similarity index 65% rename from legacy_borealis/tasks.hpp rename to include/tasks.hpp index 85f3a47..554f41c 100644 --- a/legacy_borealis/tasks.hpp +++ b/include/tasks.hpp @@ -33,66 +33,65 @@ namespace nxdt::tasks { - /* Custom event types used by the tasks defined below. */ - typedef brls::Event GameCardStatusEvent; - typedef brls::VoidEvent VoidEvent; - typedef brls::Event BooleanEvent; + /* Used to hold status info data. */ + typedef struct { + struct tm *timeinfo; + u32 charge_percentage; + PsmChargerType charger_type; + NifmInternetConnectionType connection_type; + char *ip_addr; + } StatusInfoData; - /* Custom vector type used to hold pointers to application metadata entries. */ + /* Used to hold pointers to application metadata entries. */ typedef std::vector TitleApplicationMetadataVector; - /* Custom vector type used to hold UMS devices. */ + /* Used to hold UMS devices. */ typedef std::vector UmsDeviceVector; + /* Custom event types. */ + typedef brls::Event StatusInfoEvent; + typedef brls::Event GameCardStatusEvent; + typedef brls::Event TitleEvent; + typedef brls::Event UmsEvent; + typedef brls::Event UsbHostEvent; + /* Status info task. */ + /* Its event returns a pointer to a StatusInfoData struct. */ class StatusInfoTask: public brls::RepeatingTask { private: - VoidEvent status_info_event; - - std::string cur_time = ""; - - u32 charge_percentage = 0; - PsmChargerType charger_type = PsmChargerType_Unconnected; - - NifmInternetConnectionType connection_type = (NifmInternetConnectionType)0; - u32 signal_strength = 0; - NifmInternetConnectionStatus connection_status = (NifmInternetConnectionStatus)0; - char *ip_addr = NULL; + StatusInfoEvent status_info_event; + StatusInfoData status_info_data = {0}; protected: - void run(retro_time_t current_time) override; + void run(void) override; public: StatusInfoTask(void); ~StatusInfoTask(void); - std::string GetCurrentTimeString(void); - void GetBatteryStats(u32 *out_charge_percentage, PsmChargerType *out_charger_type); - void GetNetworkStats(NifmInternetConnectionType *out_connection_type, u32 *out_signal_strength, NifmInternetConnectionStatus *out_connection_status, char **out_ip_addr); - - ALWAYS_INLINE VoidEvent::Subscription RegisterListener(VoidEvent::Callback cb) + ALWAYS_INLINE StatusInfoEvent::Subscription RegisterListener(StatusInfoEvent::Callback cb) { return this->status_info_event.subscribe(cb); } - ALWAYS_INLINE void UnregisterListener(VoidEvent::Subscription subscription) + ALWAYS_INLINE void UnregisterListener(StatusInfoEvent::Subscription subscription) { this->status_info_event.unsubscribe(subscription); } }; /* Gamecard task. */ + /* Its event returns a GameCardStatus value. */ class GameCardTask: public brls::RepeatingTask { private: GameCardStatusEvent gc_status_event; - GameCardStatus cur_gc_status = GameCardStatus_NotInserted; GameCardStatus prev_gc_status = GameCardStatus_NotInserted; protected: - void run(retro_time_t current_time) override; + void run(void) override; public: GameCardTask(void); @@ -110,10 +109,11 @@ namespace nxdt::tasks }; /* Title task. */ + /* Its event returns a pointer to a TitleApplicationMetadataVector with metadata for user titles (system titles don't change at runtime). */ class TitleTask: public brls::RepeatingTask { private: - VoidEvent title_event; + TitleEvent title_event; TitleApplicationMetadataVector system_metadata; TitleApplicationMetadataVector user_metadata; @@ -121,50 +121,50 @@ namespace nxdt::tasks void PopulateApplicationMetadataVector(bool is_system); protected: - void run(retro_time_t current_time) override; + void run(void) override; public: TitleTask(void); ~TitleTask(void); + /* Intentionally left here to let system titles views retrieve metadata. */ TitleApplicationMetadataVector* GetApplicationMetadata(bool is_system); - ALWAYS_INLINE VoidEvent::Subscription RegisterListener(VoidEvent::Callback cb) + ALWAYS_INLINE TitleEvent::Subscription RegisterListener(TitleEvent::Callback cb) { return this->title_event.subscribe(cb); } - ALWAYS_INLINE void UnregisterListener(VoidEvent::Subscription subscription) + ALWAYS_INLINE void UnregisterListener(TitleEvent::Subscription subscription) { this->title_event.unsubscribe(subscription); } }; /* USB Mass Storage task. */ + /* Its event returns a pointer to a UmsDeviceVector. */ class UmsTask: public brls::RepeatingTask { private: - VoidEvent ums_event; + UmsEvent ums_event; UmsDeviceVector ums_devices; void PopulateUmsDeviceVector(void); protected: - void run(retro_time_t current_time) override; + void run(void) override; public: UmsTask(void); ~UmsTask(void); - UmsDeviceVector* GetUmsDevices(void); - - ALWAYS_INLINE VoidEvent::Subscription RegisterListener(VoidEvent::Callback cb) + ALWAYS_INLINE UmsEvent::Subscription RegisterListener(UmsEvent::Callback cb) { return this->ums_event.subscribe(cb); } - ALWAYS_INLINE void UnregisterListener(VoidEvent::Subscription subscription) + ALWAYS_INLINE void UnregisterListener(UmsEvent::Subscription subscription) { this->ums_event.unsubscribe(subscription); } @@ -174,24 +174,24 @@ namespace nxdt::tasks class UsbHostTask: public brls::RepeatingTask { private: - BooleanEvent usb_host_event; + UsbHostEvent usb_host_event; bool cur_usb_host_status = false; bool prev_usb_host_status = false; protected: - void run(retro_time_t current_time) override; + void run(void) override; public: UsbHostTask(void); ~UsbHostTask(void); - ALWAYS_INLINE BooleanEvent::Subscription RegisterListener(BooleanEvent::Callback cb) + ALWAYS_INLINE UsbHostEvent::Subscription RegisterListener(UsbHostEvent::Callback cb) { return this->usb_host_event.subscribe(cb); } - ALWAYS_INLINE void UnregisterListener(BooleanEvent::Subscription subscription) + ALWAYS_INLINE void UnregisterListener(UsbHostEvent::Subscription subscription) { this->usb_host_event.unsubscribe(subscription); } diff --git a/legacy_borealis/en-US/about_tab.json b/legacy_borealis/en-US/about_tab.json new file mode 100644 index 0000000..72687be --- /dev/null +++ b/legacy_borealis/en-US/about_tab.json @@ -0,0 +1,34 @@ +{ + "description": "Nintendo Switch Dump Tool", + + "copyright": "Licensed under GPLv3+\n\u00A9 2020 - 2021 {0}\n{1}", + + "dependencies": { + "header": "Dependencies", + "line_00": "\uE016 {0} is powered by Borealis, a hardware-accelerated UI library: {1}.", + "line_01": "\uE016 USB Mass Storage device support is powered by libusbhsfs: {0}.", + "line_02": "\uE016 FatFs is used to mount FAT volumes from the eMMC storage: {0}.", + "line_03": "\uE016 LZ4 is used to decompress NSO binaries: {0}." + }, + + "acknowledgments": { + "header": "Acknowledgments", + "line_00": "\uE016 Switchbrew and libnx contributors.", + "line_01": "\uE016 SciresM, for hactool and Atmosphère-NX.", + "line_02": "\uE016 shchmue, for Lockpick and its runtime key-collection algorithm, as well as helping in reverse engineering tasks.", + "line_03": "\uE016 Adubbz, for Tinfoil and its ES service bindings.", + "line_04": "\uE016 RattletraPM, for the awesome icon.", + "line_05": "\uE016 Whovian9369, for being a key piece throughout the whole development by providing with lots of testing and cool ideas.", + "line_06": "\uE016 0Liam, Shadów and SimonTime, for their tremendous help in understanding Nintendo Switch file and data formats.", + "line_07": "\uE016 The folks from NSWDB.COM and No-Intro.org, for being kind enough to put up public APIs to perform online checksum lookups.", + "line_08": "\uE016 The folks at the nxdumptool Discord server.", + "line_09": "\uE016 The Comfy Boyes, for always being awesome and supportive. You know who you are.", + "line_10": "\uE016 My girlfriend, for always being by my side and motivating me to keep working on all my projects. I love you. \uE87D", + "line_11": "\uE016 And, at last but not least, you! Thank you for using my work!" + }, + + "links": { + "header": "Additional links and resources", + "line_00": "\uE016 Discord server: {0}." + } +} diff --git a/resources/i18n/fr/brls.json b/legacy_borealis/en-US/brls.json similarity index 57% rename from resources/i18n/fr/brls.json rename to legacy_borealis/en-US/brls.json index 9ed2173..6fe8fb3 100644 --- a/resources/i18n/fr/brls.json +++ b/legacy_borealis/en-US/brls.json @@ -1,8 +1,8 @@ { "hints": { "ok": "OK", - "back": "Retour", - "exit": "Quitter" + "back": "Back", + "exit": "Exit" }, "crash_frame": { @@ -10,6 +10,6 @@ }, "thumbnail_sidebar": { - "save": "Sauvegarder" + "save": "Save" } } diff --git a/legacy_borealis/en-US/gamecard_tab.json b/legacy_borealis/en-US/gamecard_tab.json new file mode 100644 index 0000000..5fae0f5 --- /dev/null +++ b/legacy_borealis/en-US/gamecard_tab.json @@ -0,0 +1,57 @@ +{ + "notification": "Gamecard status change detected!", + + "error_frame": { + "not_inserted": "No gamecard inserted.", + "processing": "Processing gamecard, please wait...", + "nogc_enabled": "A gamecard has been inserted, but the \"nogc\" patch is enabled.\nNothing at all can be done with the inserted gamecard.\nDisabling this patch *will* update the Lotus ASIC firmware if it's outdated.\nConsider disabling this patch if you wish to use gamecard dumping features.", + "lafw_update_required": "A gamecard has been inserted, but a Lotus ASIC firmware update is required.\nUpdate your console using the inserted gamecard and try again.", + "info_not_loaded": "A gamecard has been inserted, but an unexpected I/O error occurred.\nPlease report this issue at \"{0}\"." + }, + + "list": { + "properties_table": { + "header": "Gamecard properties", + "capacity": "Capacity", + "total_size": "Total size", + "trimmed_size": "Trimmed size", + "update_version": "Bundled update version", + "lafw_version": "Required LAFW version", + "lafw_version_value": "%lu or greater (%s)", + "sdk_version": "SDK version", + "compatibility_type": "Compatibility type" + }, + + "dump_options": "Dump options", + + "dump_card_image": { + "label": "Dump gamecard image (XCI)", + "description": "Generates a raw gamecard image. This is the option most people will want to use." + }, + + "dump_certificate": { + "label": "Dump gamecard certificate", + "description": "The gamecard certificate is used to unequivocally identify each individual gamecard." + }, + + "dump_header": { + "label": "Dump gamecard header", + "description": "The gamecard header holds information such as the location of the root HFS partition and the gamecard capacity.\nOnly useful for developers, preservationists and advanced users." + }, + + "dump_decrypted_cardinfo": { + "label": "Dump decrypted CardInfo area", + "description": "The CardInfo area holds information such as the bundled system update version and the Lotus ASIC firmware version required by the gamecard.\nThis area is part of the gamecard header, but it's always encrypted.\nOnly useful for developers, preservationists and advanced users." + }, + + "dump_initial_data": { + "label": "Dump InitialData area", + "description": "The InitialData area holds cryptographic information used by the Lotus ASIC to communicate with the gamecard.\nIt can't be dumped through normal means - it's not part of the storage areas from gamecard images.\nOnly useful for developers, preservationists and advanced users." + }, + + "dump_hfs_partitions": { + "label": "Dump Hash File System (HFS) partitions", + "description": "Dumps data from the HFS partitions within the gamecard storage areas, in both raw and extracted forms." + } + } +} diff --git a/legacy_borealis/en-US/generic.json b/legacy_borealis/en-US/generic.json new file mode 100644 index 0000000..47a19eb --- /dev/null +++ b/legacy_borealis/en-US/generic.json @@ -0,0 +1,3 @@ +{ + "unknown": "Unknown" +} diff --git a/legacy_borealis/en-US/user_titles_tab.json b/legacy_borealis/en-US/user_titles_tab.json new file mode 100644 index 0000000..bfa9771 --- /dev/null +++ b/legacy_borealis/en-US/user_titles_tab.json @@ -0,0 +1,4 @@ +{ + "no_titles_available": "No user titles available.", + "notification": "User titles list updated!" +} diff --git a/legacy_borealis/root_view.cpp b/legacy_borealis/root_view.cpp deleted file mode 100644 index 11d164b..0000000 --- a/legacy_borealis/root_view.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* - * root_view.cpp - * - * Copyright (c) 2020-2021, DarkMatterCore . - * - * This file is part of nxdumptool (https://github.com/DarkMatterCore/nxdumptool). - * - * nxdumptool is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * nxdumptool is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -//#include -//#include -#include - -using namespace brls::i18n::literals; /* For _i18n. */ - -namespace nxdt::views -{ - RootView::RootView(void) : brls::TabFrame() - { - /* Check if we're running under applet mode. */ - this->applet_mode = utilsAppletModeCheck(); - - /* Create labels. */ - this->applet_mode_lbl = new brls::Label(brls::LabelStyle::HINT, "root_view/applet_mode"_i18n); - this->applet_mode_lbl->setColor(nvgRGB(255, 0, 0)); - this->applet_mode_lbl->setParent(this); - - this->time_lbl = new brls::Label(brls::LabelStyle::SMALL, ""); - this->time_lbl->setParent(this); - - this->battery_icon = new brls::Label(brls::LabelStyle::SMALL, ""); - this->battery_icon->setFont(brls::Application::getFontStash()->material); - this->battery_icon->setParent(this); - - this->battery_percentage = new brls::Label(brls::LabelStyle::SMALL, ""); - this->battery_percentage->setParent(this); - - this->connection_icon = new brls::Label(brls::LabelStyle::SMALL, ""); - this->connection_icon->setFont(brls::Application::getFontStash()->material); - this->connection_icon->setParent(this); - - this->connection_status_lbl = new brls::Label(brls::LabelStyle::SMALL, ""); - this->connection_status_lbl->setParent(this); - - /* Start background tasks. */ - this->status_info_task = new nxdt::tasks::StatusInfoTask(); - this->gc_status_task = new nxdt::tasks::GameCardTask(); - this->title_task = new nxdt::tasks::TitleTask(); - this->ums_task = new nxdt::tasks::UmsTask(); - this->usb_host_task = new nxdt::tasks::UsbHostTask(); - - /* Set UI properties. */ - this->setTitle(APP_TITLE); - this->setIcon(BOREALIS_ASSET("icon/" APP_TITLE ".jpg")); - this->setFooterText("v" APP_VERSION); - - /* Add tabs. */ - this->addTab("root_view/tabs/gamecard"_i18n, new GameCardTab(this->gc_status_task)); - this->addSeparator(); - this->addTab("root_view/tabs/user_titles"_i18n, new UserTitlesTab(this->title_task)); - this->addTab("root_view/tabs/system_titles"_i18n, new brls::Rectangle(nvgRGB(0, 0, 255))); - this->addSeparator(); - this->addTab("root_view/tabs/options"_i18n, new brls::Rectangle(nvgRGB(255, 255, 0))); - this->addSeparator(); - this->addTab("root_view/tabs/about"_i18n, new AboutTab()); - - /* Subscribe to status info event. */ - this->status_info_task_sub = this->status_info_task->RegisterListener([this](void) { - u32 charge_percentage = 0; - PsmChargerType charger_type = PsmChargerType_Unconnected; - - NifmInternetConnectionType connection_type = (NifmInternetConnectionType)0; - u32 signal_strength = 0; - NifmInternetConnectionStatus connection_status = (NifmInternetConnectionStatus)0; - char *ip_addr = NULL; - - /* Update time label. */ - this->time_lbl->setText(this->status_info_task->GetCurrentTimeString()); - - /* Update battery labels. */ - this->status_info_task->GetBatteryStats(&charge_percentage, &charger_type); - - this->battery_icon->setText(charger_type != PsmChargerType_Unconnected ? "\uE1A3" : (charge_percentage <= 15 ? "\uE19C" : "\uE1A4")); - this->battery_icon->setColor(charger_type != PsmChargerType_Unconnected ? nvgRGB(0, 255, 0) : (charge_percentage <= 15 ? nvgRGB(255, 0, 0) : brls::Application::getTheme()->textColor)); - - this->battery_percentage->setText(fmt::format("{}%", charge_percentage)); - - /* Update network label. */ - this->status_info_task->GetNetworkStats(&connection_type, &signal_strength, &connection_status, &ip_addr); - - this->connection_icon->setText(!connection_type ? "\uE195" : (connection_type == NifmInternetConnectionType_WiFi ? "\uE63E" : "\uE8BE")); - this->connection_status_lbl->setText(ip_addr ? std::string(ip_addr) : "root_view/not_connected"_i18n); - - /* Update layout. */ - this->invalidate(true); - }); - } - - RootView::~RootView(void) - { - /* Unregister status info task listener. */ - this->status_info_task->UnregisterListener(this->status_info_task_sub); - - /* Destroy labels. */ - delete this->applet_mode_lbl; - delete this->time_lbl; - delete this->battery_icon; - delete this->battery_percentage; - delete this->connection_icon; - delete this->connection_status_lbl; - - /* Stop background tasks. */ - this->gc_status_task->stop(); - this->title_task->stop(); - this->ums_task->stop(); - this->usb_host_task->stop(); - } - - void RootView::draw(NVGcontext* vg, int x, int y, unsigned width, unsigned height, brls::Style* style, brls::FrameContext* ctx) - { - if (this->applet_mode) this->applet_mode_lbl->frame(ctx); - - this->time_lbl->frame(ctx); - - this->battery_icon->frame(ctx); - this->battery_percentage->frame(ctx); - - this->connection_icon->frame(ctx); - this->connection_status_lbl->frame(ctx); - - brls::AppletFrame::draw(vg, x, y, width, height, style, ctx); - } - - void RootView::layout(NVGcontext* vg, brls::Style* style, brls::FontStash* stash) - { - int y_pos = 0; - - brls::AppletFrame::layout(vg, style, stash); - - if (this->applet_mode) - { - /* Applet mode label. */ - this->applet_mode_lbl->invalidate(true); - this->applet_mode_lbl->setBoundaries( - this->x + (this->width / 4) - (this->applet_mode_lbl->getWidth() / 2), - this->y + this->height - (style->AppletFrame.footerHeight / 2), - this->applet_mode_lbl->getWidth(), - this->applet_mode_lbl->getHeight()); - } - - /* Time label. */ - this->time_lbl->invalidate(true); - y_pos += this->y + 25 + this->time_lbl->getHeight(); - - this->time_lbl->setBoundaries( - this->x + this->width - (style->AppletFrame.separatorSpacing * 2) - this->time_lbl->getWidth(), - y_pos, - this->time_lbl->getWidth(), - this->time_lbl->getHeight()); - - /* Battery stats labels. */ - this->battery_icon->invalidate(true); - this->battery_percentage->invalidate(true); - y_pos += (20 + this->battery_icon->getHeight()); - - this->battery_icon->setBoundaries( - this->x + this->width - (style->AppletFrame.separatorSpacing * 2) - this->battery_percentage->getWidth() - 5 - this->battery_icon->getWidth(), - y_pos, - this->battery_icon->getWidth(), - this->battery_icon->getHeight()); - - this->battery_percentage->setBoundaries( - this->x + this->width - (style->AppletFrame.separatorSpacing * 2) - this->battery_percentage->getWidth(), - y_pos, - this->battery_percentage->getWidth(), - this->battery_percentage->getHeight()); - - /* Network connection labels. */ - this->connection_icon->invalidate(true); - this->connection_status_lbl->invalidate(true); - y_pos += (20 + this->connection_icon->getHeight()); - - this->connection_icon->setBoundaries( - this->x + this->width - (style->AppletFrame.separatorSpacing * 2) - this->connection_status_lbl->getWidth() - 5 - this->connection_icon->getWidth(), - y_pos, - this->connection_icon->getWidth(), - this->connection_icon->getHeight()); - - this->connection_status_lbl->setBoundaries( - this->x + this->width - (style->AppletFrame.separatorSpacing * 2) - this->connection_status_lbl->getWidth(), - y_pos, - this->connection_status_lbl->getWidth(), - this->connection_status_lbl->getHeight()); - } -} diff --git a/resources/i18n/en-US/demo.json b/resources/i18n/en-US/demo.json deleted file mode 100644 index c5a99f1..0000000 --- a/resources/i18n/en-US/demo.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "title": "Borealis Demo App", - - "tabs": { - "components": "Basic components", - "layout": "Layout and alignment", - "recycling": "Recycling lists", - "popups": "Popups, notifications and dialogs", - "hos_layout": "Horizon layouts", - "misc_layouts": "Misc. layouts", - "misc_components": "Misc. components", - "misc_tools": "Misc. dev tools", - "about": "About borealis" - }, - - "welcome": "Welcome to the borealis demo! Feel free to explore and discover what the library can do.", - - "components": { - "buttons_header": "Buttons", - "button_primary": "Primary button", - "button_highlight": "\uE13C Highlight button", - "button_wrapping": "Default button with wrapping text", - "button_bordered": "Bordered button", - "button_borderless": "Borderless button", - - "labels_header": "Labels", - "regular_label": "This is a label. By default, they will automatically wrap and expand their height, should the remaining vertical space allow it. Otherwise, they will be truncated, like some of the tabs of the sidebar.", - "label_left": "This label is left-aligned", - "label_center": "This label is center-aligned", - "label_right": "This label is right-aligned", - - "images_header_title": "Images", - "images_header_subtitle": "Focus them to see the scaling method", - "images_downscaled": "Downscaled", - "images_original": "Original", - "images_upscaled": "Upscaled", - "images_stretched": "Stretched", - "images_cropped": "Cropped" - }, - - "about": { - "title": "borealis", - "description": "A hardware accelerated, controller and TV oriented UI library for PC and Nintendo Switch (libnx).", - "github": "Find it on github.com/natinusala/borealis", - "licence": "Licensed under Apache 2.0", - "logo_credit": "Logo by @MeganRoshelle" - } -} diff --git a/resources/i18n/en-US/root_view.json b/resources/i18n/en-US/root_view.json new file mode 100644 index 0000000..50f3ec5 --- /dev/null +++ b/resources/i18n/en-US/root_view.json @@ -0,0 +1,19 @@ +{ + "applet_mode": "\uE8B2 Applet Mode \uE8B2", + + "time_format": "12", + "__time_format_comment__": "Use 12 for a 12-hour clock, or 24 for a 24-hour clock", + + "date": "{1:02d}/{2:02d}/{0} {3:02d}:{4:02d}:{5:02d} {6}", + "__date_comment__": "{0} = Year, {1} = Month, {2} = Day, {3} = Hour, {4} = Minute, {5} = Second, {6} = AM/PM (if time_format is set to 12)", + + "not_connected": "Not connected", + + "tabs": { + "gamecard": "Gamecard", + "user_titles": "User titles", + "system_titles": "System titles", + "options": "Options", + "about": "About" + } +} diff --git a/resources/i18n/fr/demo.json b/resources/i18n/fr/demo.json deleted file mode 100644 index 69a88e3..0000000 --- a/resources/i18n/fr/demo.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/resources/img/borealis_256.png b/resources/img/borealis_256.png deleted file mode 100644 index d120a87328592f0e51702515cff0effe9ade3182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24860 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 diff --git a/resources/img/borealis_96.png b/resources/img/borealis_96.png deleted file mode 100644 index fe3e53a6e979d38f77d8c447d815a8ab25efd7bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6444 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 a_5TCA=s9 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/xml/tabs/components.xml b/resources/xml/tabs/components.xml deleted file mode 100644 index 0635473..0000000 --- a/resources/xml/tabs/components.xml +++ /dev/null @@ -1,216 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/resources/xml/tabs/layout.xml b/resources/xml/tabs/layout.xml deleted file mode 100644 index f0afa12..0000000 --- a/resources/xml/tabs/layout.xml +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/resources/xml/tabs/recycling_list.xml b/resources/xml/tabs/recycling_list.xml deleted file mode 100644 index 8506f5a..0000000 --- a/resources/xml/tabs/recycling_list.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/resources/xml/views/captioned_image.xml b/resources/xml/views/captioned_image.xml deleted file mode 100644 index 2c31270..0000000 --- a/resources/xml/views/captioned_image.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - diff --git a/source/captioned_image.cpp b/source/captioned_image.cpp deleted file mode 100644 index 31becfa..0000000 --- a/source/captioned_image.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "captioned_image.hpp" - -CaptionedImage::CaptionedImage() -{ - // Load the XML file and inflate ourself with its content - // The top-level Box in the XML corresponds to us, and every XML child - // is added to our children (and the attributes are applied) - // The CaptionedImage instance basically becomes what's written in the XML - this->inflateFromXMLRes("xml/views/captioned_image.xml"); - - // The label stays hidden until focused, so hide it right away - this->label->hide([] {}); - - // Forward Image and Label XML attributes - this->forwardXMLAttribute("scalingType", this->image); - this->forwardXMLAttribute("image", this->image); - this->forwardXMLAttribute("focusUp", this->image); - this->forwardXMLAttribute("focusRight", this->image); - this->forwardXMLAttribute("focusDown", this->image); - this->forwardXMLAttribute("focusLeft", this->image); - this->forwardXMLAttribute("imageWidth", this->image, "width"); - this->forwardXMLAttribute("imageHeight", this->image, "height"); - - this->forwardXMLAttribute("caption", this->label, "text"); -} - -void CaptionedImage::onChildFocusGained(brls::View* directChild, brls::View* focusedView) -{ - // Called when a child of ours gets focused, in that case it's the Image - - Box::onChildFocusGained(directChild, focusedView); - - this->label->show([] {}); -} - -void CaptionedImage::onChildFocusLost(brls::View* directChild, brls::View* focusedView) -{ - // Called when a child of ours losts focused, in that case it's the Image - - Box::onChildFocusLost(directChild, focusedView); - - this->label->hide([] {}); -} - -brls::View* CaptionedImage::create() -{ - // Called by the XML engine to create a new CaptionedImage - return new CaptionedImage(); -} diff --git a/source/components_tab.cpp b/source/components_tab.cpp deleted file mode 100644 index e64c548..0000000 --- a/source/components_tab.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - Copyright 2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "components_tab.hpp" - -ComponentsTab::ComponentsTab() -{ - // Inflate the tab from the XML file - this->inflateFromXMLRes("xml/tabs/components.xml"); - - // Bind the button click to a method using the macro (just for the sake of showcasing it, it's overkill in this situation) - BRLS_REGISTER_CLICK_BY_ID("button_primary", this->onPrimaryButtonClicked); - - // Get a handle to the button and register the action directly - brls::Button* highlightButton = (brls::Button*)this->getView("button_highlight"); - highlightButton->registerAction( - "Honk", brls::BUTTON_A, [](brls::View* view) { return true; }, false, brls::SOUND_HONK); -} - -bool ComponentsTab::onPrimaryButtonClicked(brls::View* view) -{ - brls::Logger::info("Clicked"); - return true; -} - -brls::View* ComponentsTab::create() -{ - // Called by the XML engine to create a new ComponentsTab - return new ComponentsTab(); -} diff --git a/source/main.cpp b/source/main.cpp index fbeea48..53833e3 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,59 +1,64 @@ +/* + * main.cpp + * + * Copyright (c) 2020-2021, DarkMatterCore . + * + * This file is part of nxdumptool (https://github.com/DarkMatterCore/nxdumptool). + * + * nxdumptool is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * nxdumptool is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include - -#include - -#include "captioned_image.hpp" -#include "components_tab.hpp" -#include "main_activity.hpp" -#include "recycling_list_tab.hpp" - -using namespace brls::literals; // for _i18n +#include int main(int argc, char* argv[]) { /* Set scope guard to clean up resources at exit. */ ON_SCOPE_EXIT { utilsCloseResources(); }; - + /* Initialize application resources. */ if (!utilsInitializeResources(argc, (const char**)argv)) return EXIT_FAILURE; - - // Set log level - // We recommend to use INFO for real apps + + /* Set Borealis log level. */ + /* TODO: set this to INFO before a proper release. */ brls::Logger::setLogLevel(brls::LogLevel::DEBUG); - - // Init the app and i18n - if (!brls::Application::init()) - { - brls::Logger::error("Unable to init Borealis application"); - return EXIT_FAILURE; - } - - brls::Application::createWindow("demo/title"_i18n); - - // Have the application register an action on every activity that will quit when you press BUTTON_START + + /* Initialize Borealis. */ + if (!brls::Application::init()) return EXIT_FAILURE; + + /* Create application window. */ + brls::Application::createWindow(APP_TITLE); + + /* Set common footer. */ + brls::Application::setCommonFooter("v" APP_VERSION); + + /* Register an action on every activity to quit whenever BUTTON_START is pressed. */ brls::Application::setGlobalQuit(true); - - // Register custom views (including tabs, which are views) - brls::Application::registerXMLView("CaptionedImage", CaptionedImage::create); - brls::Application::registerXMLView("RecyclingListTab", RecyclingListTab::create); - brls::Application::registerXMLView("ComponentsTab", ComponentsTab::create); - - // Add custom values to the theme - brls::getLightTheme().addColor("captioned_image/caption", nvgRGB(2, 176, 183)); - brls::getDarkTheme().addColor("captioned_image/caption", nvgRGB(51, 186, 227)); - - // Add custom values to the style - brls::getStyle().addMetric("about/padding_top_bottom", 50); - brls::getStyle().addMetric("about/padding_sides", 75); - brls::getStyle().addMetric("about/description_margin", 50); - - // Create and push the main activity to the stack - brls::Application::pushActivity(new MainActivity()); - - // Run the app - while (brls::Application::mainLoop()); - - // Exit + + /* Display a FPS counter whenever BUTTON_BACK is pressed. */ + /* TODO: disable this before a proper release. */ + brls::Application::setGlobalFPSToggle(true); + + /* Create and push the main activity to the stack. */ + brls::Activity *main_activity = new brls::Activity(); + main_activity->setContentView(new nxdt::views::RootView()); + brls::Application::pushActivity(main_activity); + + /* Run the application. */ + while(brls::Application::mainLoop()); + + /* Exit. */ return EXIT_SUCCESS; } diff --git a/source/main_activity.cpp b/source/main_activity.cpp deleted file mode 100644 index b4e1a35..0000000 --- a/source/main_activity.cpp +++ /dev/null @@ -1,17 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "main_activity.hpp" diff --git a/source/recycling_list_tab.cpp b/source/recycling_list_tab.cpp deleted file mode 100644 index 4c4a82b..0000000 --- a/source/recycling_list_tab.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - Copyright 2020-2021 natinusala - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - -#include "recycling_list_tab.hpp" - -RecyclingListTab::RecyclingListTab() -{ - // Inflate the tab from the XML file - this->inflateFromXMLRes("xml/tabs/recycling_list.xml"); -} - -brls::View* RecyclingListTab::create() -{ - // Called by the XML engine to create a new RecyclingListTab - return new RecyclingListTab(); -} diff --git a/source/root_view.cpp b/source/root_view.cpp new file mode 100644 index 0000000..58d7eb2 --- /dev/null +++ b/source/root_view.cpp @@ -0,0 +1,219 @@ +/* + * root_view.cpp + * + * Copyright (c) 2020-2021, DarkMatterCore . + * + * This file is part of nxdumptool (https://github.com/DarkMatterCore/nxdumptool). + * + * nxdumptool is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * nxdumptool is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +//#include +//#include +//#include +//#include +//#include + +using namespace brls::literals; /* For _i18n. */ + +namespace nxdt::views +{ + RootView::RootView(void) : brls::TabFrame() + { + /* Set UI properties. */ + this->setTitle(APP_TITLE); + this->setIconFromRes("img/" APP_TITLE ".jpg"); + + /* Check if we're running under applet mode. */ + this->applet_mode = utilsAppletModeCheck(); + + /* Create labels. */ + this->applet_mode_lbl = new brls::Label(); + this->applet_mode_lbl->setText("root_view/applet_mode"_i18n); + this->applet_mode_lbl->setFontSize(22.0f); + this->applet_mode_lbl->setTextColor(nvgRGB(255, 0, 0)); + this->applet_mode_lbl->setSingleLine(true); + this->applet_mode_lbl->setParent(this); + + this->time_lbl = new brls::Label(); + this->time_lbl->setFontSize(16.0f); + this->time_lbl->setSingleLine(true); + this->time_lbl->setParent(this); + + this->battery_icon = new brls::Label(); + this->battery_icon->setFontSize(16.0f); + this->battery_icon->setSingleLine(true); + this->battery_icon->setParent(this); + + this->battery_percentage = new brls::Label(); + this->battery_percentage->setFontSize(16.0f); + this->battery_percentage->setSingleLine(true); + this->battery_percentage->setParent(this); + + this->connection_icon = new brls::Label(); + this->connection_icon->setFontSize(16.0f); + this->connection_icon->setSingleLine(true); + this->connection_icon->setParent(this); + + this->connection_status_lbl = new brls::Label(); + this->connection_status_lbl->setFontSize(16.0f); + this->connection_status_lbl->setSingleLine(true); + this->connection_status_lbl->setParent(this); + + /* Add tabs. */ + this->addTab("root_view/tabs/gamecard"_i18n, [this](void){ return new brls::Rectangle(nvgRGB(255, 0, 0));/*return new GameCardTab(this->gc_status_task);*/ }); + this->addSeparator(); + this->addTab("root_view/tabs/user_titles"_i18n, [this](void){ return new brls::Rectangle(nvgRGB(0, 255, 0));/*return new UserTitlesTab(this->title_task);*/ }); + this->addTab("root_view/tabs/system_titles"_i18n, [this](void){ return new brls::Rectangle(nvgRGB(0, 0, 255)); }); + this->addSeparator(); + this->addTab("root_view/tabs/options"_i18n, [this](void){ return new brls::Rectangle(nvgRGB(255, 255, 0)); }); + this->addSeparator(); + this->addTab("root_view/tabs/about"_i18n, [this](void){ return new brls::Rectangle(nvgRGB(0, 255, 255));/*return new AboutTab();*/ }); + + /* Start background tasks. */ + this->status_info_task = new nxdt::tasks::StatusInfoTask(); + this->gc_status_task = new nxdt::tasks::GameCardTask(); + this->title_task = new nxdt::tasks::TitleTask(); + this->ums_task = new nxdt::tasks::UmsTask(); + this->usb_host_task = new nxdt::tasks::UsbHostTask(); + + /* Subscribe to status info event. */ + this->status_info_task_sub = this->status_info_task->RegisterListener([this](const nxdt::tasks::StatusInfoData *status_info_data) { + /* Update time label. */ + bool is_am = true; + struct tm *timeinfo = status_info_data->timeinfo; + + timeinfo->tm_mon++; + timeinfo->tm_year += 1900; + + if ("root_view/time_format"_i18n.compare("12") == 0) + { + /* Adjust time for 12-hour clock. */ + if (timeinfo->tm_hour > 12) + { + timeinfo->tm_hour -= 12; + is_am = false; + } else + if (!timeinfo->tm_hour) + { + timeinfo->tm_hour = 12; + } + } + + this->time_lbl->setText(brls::getStr("root_view/date"_i18n, timeinfo->tm_year, timeinfo->tm_mon, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ + is_am ? "AM" : "PM")); + + /* Update battery labels. */ + u32 charge_percentage = status_info_data->charge_percentage; + PsmChargerType charger_type = status_info_data->charger_type; + + this->battery_icon->setText(charger_type != PsmChargerType_Unconnected ? "\uE1A3" : (charge_percentage <= 15 ? "\uE19C" : "\uE1A4")); + this->battery_icon->setTextColor(charger_type != PsmChargerType_Unconnected ? nvgRGB(0, 255, 0) : (charge_percentage <= 15 ? nvgRGB(255, 0, 0) : brls::Application::getTheme()["brls/text"])); + + this->battery_percentage->setText(fmt::format("{}%", charge_percentage)); + + /* Update network label. */ + NifmInternetConnectionType connection_type = status_info_data->connection_type; + char *ip_addr = status_info_data->ip_addr; + + this->connection_icon->setText(!connection_type ? "\uE195" : (connection_type == NifmInternetConnectionType_WiFi ? "\uE63E" : "\uE8BE")); + this->connection_status_lbl->setText(ip_addr ? std::string(ip_addr) : "root_view/not_connected"_i18n); + + /* Update layout. */ + this->invalidate(); + }); + } + + RootView::~RootView(void) + { + /* Unregister status info task listener. */ + this->status_info_task->UnregisterListener(this->status_info_task_sub); + + /* Stop background tasks. */ + this->gc_status_task->stop(); + this->title_task->stop(); + this->ums_task->stop(); + this->usb_host_task->stop(); + + /* Destroy labels. */ + delete this->applet_mode_lbl; + delete this->time_lbl; + delete this->battery_icon; + delete this->battery_percentage; + delete this->connection_icon; + delete this->connection_status_lbl; + } + + void RootView::draw(NVGcontext* vg, float x, float y, float width, float height, brls::Style style, brls::FrameContext* ctx) + { + brls::AppletFrame::draw(vg, x, y, width, height, style, ctx); + + if (this->applet_mode) this->applet_mode_lbl->frame(ctx); + + this->time_lbl->frame(ctx); + + this->battery_icon->frame(ctx); + this->battery_percentage->frame(ctx); + + this->connection_icon->frame(ctx); + this->connection_status_lbl->frame(ctx); + } + + void RootView::onLayout(void) + { + brls::AppletFrame::onLayout(); + + float y_pos = 0; + brls::Style style = brls::Application::getStyle(); + + if (this->applet_mode) + { + /* Applet mode label. */ + this->applet_mode_lbl->invalidate(); + this->applet_mode_lbl->setPositionLeft((this->getWidth() / 4.0f) - (this->applet_mode_lbl->getWidth() / 2.0f)); + this->applet_mode_lbl->setPositionBottom(-(style["brls/applet_frame/footer_height"] / 2.0f)); + } + + /* Time label. */ + this->time_lbl->invalidate(); + y_pos += (this->getY() + 25.0f + this->time_lbl->getLineHeight()); + + this->time_lbl->setPositionTop(y_pos); + this->time_lbl->setPositionRight(-style["brls/applet_frame/header_padding_sides"]); + + /* Battery stats labels. */ + this->battery_icon->invalidate(); + this->battery_percentage->invalidate(); + y_pos += (20.0f + this->battery_icon->getLineHeight()); + + this->battery_percentage->setPositionTop(y_pos); + this->battery_percentage->setPositionRight(-style["brls/applet_frame/header_padding_sides"]); + + this->battery_icon->setPositionTop(y_pos); + this->battery_icon->setPositionRight(-(style["brls/applet_frame/header_padding_sides"] + this->battery_percentage->getWidth() + 5.0f)); + + /* Network connection labels. */ + this->connection_icon->invalidate(); + this->connection_status_lbl->invalidate(); + y_pos += (20.0f + this->connection_icon->getLineHeight()); + + this->connection_status_lbl->setPositionTop(y_pos); + this->connection_status_lbl->setPositionRight(-style["brls/applet_frame/header_padding_sides"]); + + this->connection_icon->setPositionTop(y_pos); + this->connection_icon->setPositionRight(-(style["brls/applet_frame/header_padding_sides"] + this->connection_status_lbl->getWidth() + 5.0f)); + } +} diff --git a/legacy_borealis/tasks.cpp b/source/tasks.cpp similarity index 60% rename from legacy_borealis/tasks.cpp rename to source/tasks.cpp index 5205468..6f51f7c 100644 --- a/legacy_borealis/tasks.cpp +++ b/source/tasks.cpp @@ -23,16 +23,13 @@ #include #include -#define NXDT_TASK_INTERVAL 100 /* 100 ms. */ - -namespace i18n = brls::i18n; /* For getStr(). */ -using namespace i18n::literals; /* For _i18n. */ +#define NXDT_TASK_INTERVAL 250 /* 250 ms. */ namespace nxdt::tasks { /* Status info task. */ - StatusInfoTask::StatusInfoTask(void) : brls::RepeatingTask(1000) + StatusInfoTask::StatusInfoTask(void) : brls::RepeatingTask(NXDT_TASK_INTERVAL) { brls::RepeatingTask::start(); brls::Logger::debug("Status info task started."); @@ -40,82 +37,42 @@ namespace nxdt::tasks StatusInfoTask::~StatusInfoTask(void) { - /* Clear current time string. */ - this->cur_time.clear(); - brls::Logger::debug("Status info task stopped."); } - void StatusInfoTask::run(retro_time_t current_time) + void StatusInfoTask::run(void) { - brls::RepeatingTask::run(current_time); + StatusInfoData *status_info_data = &(this->status_info_data); /* Get current time. */ - bool is_am = true; time_t unix_time = time(NULL); - struct tm *timeinfo = localtime(&unix_time); - - if (timeinfo->tm_hour > 12) - { - timeinfo->tm_hour -= 12; - is_am = false; - } else - if (!timeinfo->tm_hour) - { - timeinfo->tm_hour = 12; - } - - timeinfo->tm_mon++; - timeinfo->tm_year += 1900; - - this->cur_time.clear(); - this->cur_time = i18n::getStr("root_view/date"_i18n, timeinfo->tm_year, timeinfo->tm_mon, timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, is_am ? "AM" : "PM"); + status_info_data->timeinfo = localtime(&unix_time); /* Get battery stats. */ - psmGetBatteryChargePercentage(&(this->charge_percentage)); - psmGetChargerType(&(this->charger_type)); + psmGetBatteryChargePercentage(&(status_info_data->charge_percentage)); + psmGetChargerType(&(status_info_data->charger_type)); /* Get network connection status. */ - Result rc = nifmGetInternetConnectionStatus(&(this->connection_type), &(this->signal_strength), &(this->connection_status)); + u32 signal_strength = 0; + NifmInternetConnectionStatus connection_status = (NifmInternetConnectionStatus)0; + + Result rc = nifmGetInternetConnectionStatus(&(status_info_data->connection_type), &signal_strength, &connection_status); if (R_SUCCEEDED(rc)) { - if (this->connection_type && this->connection_status == NifmInternetConnectionStatus_Connected) + if (status_info_data->connection_type && connection_status == NifmInternetConnectionStatus_Connected) { struct in_addr addr = { .s_addr = 0 }; nifmGetCurrentIpAddress(&(addr.s_addr)); - this->ip_addr = inet_ntoa(addr); + status_info_data->ip_addr = inet_ntoa(addr); } else { - this->ip_addr = NULL; + status_info_data->ip_addr = NULL; } } else { - this->connection_type = (NifmInternetConnectionType)0; - this->signal_strength = 0; - this->connection_status = (NifmInternetConnectionStatus)0; - this->ip_addr = NULL; + status_info_data->connection_type = (NifmInternetConnectionType)0; + status_info_data->ip_addr = NULL; } - this->status_info_event.fire(); - } - - std::string StatusInfoTask::GetCurrentTimeString(void) - { - return this->cur_time; - } - - void StatusInfoTask::GetBatteryStats(u32 *out_charge_percentage, PsmChargerType *out_charger_type) - { - if (!out_charge_percentage || !out_charger_type) return; - *out_charge_percentage = this->charge_percentage; - *out_charger_type = this->charger_type; - } - - void StatusInfoTask::GetNetworkStats(NifmInternetConnectionType *out_connection_type, u32 *out_signal_strength, NifmInternetConnectionStatus *out_connection_status, char **out_ip_addr) - { - if (!out_connection_type || !out_signal_strength || !out_connection_status || !out_ip_addr) return; - *out_connection_type = this->connection_type; - *out_signal_strength = this->signal_strength; - *out_connection_status = this->connection_status; - *out_ip_addr = this->ip_addr; + this->status_info_event.fire(status_info_data); } /* Gamecard task. */ @@ -131,10 +88,8 @@ namespace nxdt::tasks brls::Logger::debug("Gamecard task stopped."); } - void GameCardTask::run(retro_time_t current_time) + void GameCardTask::run(void) { - brls::RepeatingTask::run(current_time); - this->cur_gc_status = (GameCardStatus)gamecardGetStatus(); if (this->cur_gc_status != this->prev_gc_status) { @@ -168,39 +123,15 @@ namespace nxdt::tasks brls::Logger::debug("Title task stopped."); } - void TitleTask::PopulateApplicationMetadataVector(bool is_system) + void TitleTask::run(void) { - TitleApplicationMetadata **app_metadata = NULL; - u32 app_metadata_count = 0; - - /* Get pointer to output vector. */ - TitleApplicationMetadataVector *vector = (is_system ? &(this->system_metadata) : &(this->user_metadata)); - if (vector->size()) vector->clear(); - - /* Get application metadata entries. */ - app_metadata = titleGetApplicationMetadataEntries(is_system, &app_metadata_count); - if (!app_metadata) return; - - /* Fill output vector. */ - for(u32 i = 0; i < app_metadata_count; i++) vector->push_back(app_metadata[i]); - - /* Free application metadata array. */ - free(app_metadata); - - brls::Logger::debug("Retrieved {} {} metadata {}.", app_metadata_count, is_system ? "system" : "user", app_metadata_count == 1 ? "entry" : "entries"); - } - - void TitleTask::run(retro_time_t current_time) - { - brls::RepeatingTask::run(current_time); - if (titleIsGameCardInfoUpdated()) { /* Update user metadata vector. */ this->PopulateApplicationMetadataVector(false); /* Fire task event. */ - this->title_event.fire(); + this->title_event.fire(&(this->user_metadata)); brls::Logger::debug("Title info updated."); } } @@ -210,6 +141,29 @@ namespace nxdt::tasks return (is_system ? &(this->system_metadata) : &(this->user_metadata)); } + void TitleTask::PopulateApplicationMetadataVector(bool is_system) + { + TitleApplicationMetadata **app_metadata = NULL; + u32 app_metadata_count = 0; + + /* Get pointer to output vector. */ + TitleApplicationMetadataVector *vector = (is_system ? &(this->system_metadata) : &(this->user_metadata)); + vector->clear(); + + /* Get application metadata entries. */ + app_metadata = titleGetApplicationMetadataEntries(is_system, &app_metadata_count); + if (app_metadata) + { + /* Fill output vector. */ + for(u32 i = 0; i < app_metadata_count; i++) vector->push_back(app_metadata[i]); + + /* Free application metadata array. */ + free(app_metadata); + } + + brls::Logger::debug("Retrieved {} {} metadata {}.", app_metadata_count, is_system ? "system" : "user", app_metadata_count == 1 ? "entry" : "entries"); + } + /* USB Mass Storage task. */ UmsTask::UmsTask(void) : brls::RepeatingTask(NXDT_TASK_INTERVAL) @@ -226,45 +180,39 @@ namespace nxdt::tasks brls::Logger::debug("UMS task stopped."); } - void UmsTask::PopulateUmsDeviceVector(void) + void UmsTask::run(void) { - UsbHsFsDevice *ums_devices = NULL; - u32 ums_device_count = 0; - - /* Clear UMS device vector (if needed). */ - if (this->ums_devices.size()) this->ums_devices.clear(); - - /* Get UMS devices. */ - ums_devices = umsGetDevices(&ums_device_count); - if (!ums_devices) return; - - /* Fill UMS device vector. */ - for(u32 i = 0; i < ums_device_count; i++) this->ums_devices.push_back(ums_devices[i]); - - /* Free UMS devices array. */ - free(ums_devices); - - brls::Logger::debug("Retrieved info for {} UMS {}.", ums_device_count, ums_device_count == 1 ? "device" : "devices"); - } - - void UmsTask::run(retro_time_t current_time) - { - brls::RepeatingTask::run(current_time); - if (umsIsDeviceInfoUpdated()) { /* Update UMS device vector. */ this->PopulateUmsDeviceVector(); /* Fire task event. */ - this->ums_event.fire(); + this->ums_event.fire(&(this->ums_devices)); brls::Logger::debug("UMS device info updated."); } } - UmsDeviceVector* UmsTask::GetUmsDevices(void) + void UmsTask::PopulateUmsDeviceVector(void) { - return &(this->ums_devices); + UsbHsFsDevice *ums_devices = NULL; + u32 ums_device_count = 0; + + /* Clear UMS device vector. */ + this->ums_devices.clear(); + + /* Get UMS devices. */ + ums_devices = umsGetDevices(&ums_device_count); + if (ums_devices) + { + /* Fill UMS device vector. */ + for(u32 i = 0; i < ums_device_count; i++) this->ums_devices.push_back(ums_devices[i]); + + /* Free UMS devices array. */ + free(ums_devices); + } + + brls::Logger::debug("Retrieved info for {} UMS {}.", ums_device_count, ums_device_count == 1 ? "device" : "devices"); } /* USB host device connection task. */ @@ -280,15 +228,13 @@ namespace nxdt::tasks brls::Logger::debug("USB host task stopped."); } - void UsbHostTask::run(retro_time_t current_time) + void UsbHostTask::run(void) { - brls::RepeatingTask::run(current_time); - this->cur_usb_host_status = usbIsReady(); if (this->cur_usb_host_status != this->prev_usb_host_status) { - this->usb_host_event.fire(this->cur_usb_host_status); this->prev_usb_host_status = this->cur_usb_host_status; + this->usb_host_event.fire(this->cur_usb_host_status); brls::Logger::debug("USB host status change triggered: {}.", this->cur_usb_host_status); } }