display storage sizes, properly colour info text, and more (see below)
- display internal and sd card storage sizes. - removed battery info. - removed current time info. - fix dumping save to sd card due to not opening the file with append. - change all sizes to display GB instead of GiB. - change progress bar units to 1000 rather than 1024. - all info text, such as sizes and timestamps now use the info text colouring. - shorten the ncm content type names.
This commit is contained in:
@@ -155,6 +155,9 @@ public:
|
||||
static Result SetDefaultBackgroundMusic(fs::Fs* fs, const fs::FsPath& path);
|
||||
static void SetBackgroundMusicPause(bool pause);
|
||||
|
||||
static Result GetSdSize(s64* free, s64* total);
|
||||
static Result GetEmmcSize(s64* free, s64* total);
|
||||
|
||||
// helper that converts 1.2.3 to a u32 used for comparisons.
|
||||
static auto GetVersionFromString(const char* str) -> u32;
|
||||
static auto IsVersionNewer(const char* current, const char* new_version) -> u32;
|
||||
|
||||
@@ -13,12 +13,14 @@ enum MenuFlag {
|
||||
|
||||
struct PolledData {
|
||||
struct tm tm{};
|
||||
u32 battery_percetange{};
|
||||
PsmChargerType charger_type{};
|
||||
NifmInternetConnectionType type{};
|
||||
NifmInternetConnectionStatus status{};
|
||||
u32 strength{};
|
||||
u32 ip{};
|
||||
s64 sd_free{1};
|
||||
s64 sd_total{1};
|
||||
s64 emmc_free{1};
|
||||
s64 emmc_total{1};
|
||||
};
|
||||
|
||||
struct MenuBase : Widget {
|
||||
|
||||
@@ -22,4 +22,11 @@ constexpr inline T AlignDown(T value, T align) {
|
||||
return value &~ (align - 1);
|
||||
}
|
||||
|
||||
// formats size to 1.23 MB in 1024 base.
|
||||
// only uses 32 bytes so its SSO optimised, not need to cache.
|
||||
std::string formatSizeStorage(u64 size);
|
||||
|
||||
// formats size to 1.23 MB in 1000 base (used for progress bars).
|
||||
std::string formatSizeNetwork(u64 size);
|
||||
|
||||
} // namespace sphaira::utils
|
||||
|
||||
@@ -1462,6 +1462,20 @@ void App::SetBackgroundMusicPause(bool pause) {
|
||||
}
|
||||
}
|
||||
|
||||
Result App::GetSdSize(s64* free, s64* total) {
|
||||
fs::FsNativeContentStorage fs{FsContentStorageId_SdCard};
|
||||
R_TRY(fs.GetFreeSpace("/", free));
|
||||
R_TRY(fs.GetTotalSpace("/", total));
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result App::GetEmmcSize(s64* free, s64* total) {
|
||||
fs::FsNativeContentStorage fs{FsContentStorageId_User};
|
||||
R_TRY(fs.GetFreeSpace("/", free));
|
||||
R_TRY(fs.GetTotalSpace("/", total));
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
App::App(const char* argv0) {
|
||||
// boost mode is enabled in userAppInit().
|
||||
ON_SCOPE_EXIT(App::SetBoostMode(false));
|
||||
|
||||
@@ -336,7 +336,7 @@ Result DumpToFile(ui::ProgressBox* pbox, fs::Fs* fs, const fs::FsPath& root, Bas
|
||||
|
||||
{
|
||||
fs::File file;
|
||||
R_TRY(fs->OpenFile(temp_path, FsOpenMode_Write, &file));
|
||||
R_TRY(fs->OpenFile(temp_path, FsOpenMode_Write|FsOpenMode_Append, &file));
|
||||
auto write_source = std::make_unique<WriteFileSource>(&file);
|
||||
|
||||
if (custom_transfer) {
|
||||
|
||||
@@ -56,8 +56,6 @@ void userAppInit(void) {
|
||||
diagAbortWithResult(rc);
|
||||
if (R_FAILED(rc = plInitialize(PlServiceType_User)))
|
||||
diagAbortWithResult(rc);
|
||||
if (R_FAILED(rc = psmInitialize()))
|
||||
diagAbortWithResult(rc);
|
||||
if (R_FAILED(rc = nifmInitialize(NifmServiceType_User)))
|
||||
diagAbortWithResult(rc);
|
||||
if (R_FAILED(rc = accountInitialize(is_application ? AccountServiceType_Application : AccountServiceType_System)))
|
||||
@@ -83,7 +81,6 @@ void userAppExit(void) {
|
||||
setExit();
|
||||
accountExit();
|
||||
nifmExit();
|
||||
psmExit();
|
||||
plExit();
|
||||
socketExit();
|
||||
// NOTE (DMC): prevents exfat corruption.
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
#include "web.hpp"
|
||||
#include "minizip_helper.hpp"
|
||||
|
||||
#include "utils/utils.hpp"
|
||||
|
||||
#include <minIni.h>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
@@ -738,7 +740,7 @@ void EntryMenu::Draw(NVGcontext* vg, Theme* theme) {
|
||||
text_start_y += text_inc_y;
|
||||
gfx::drawTextArgs(vg, text_start_x, text_start_y, font_size, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "category: %s"_i18n.c_str(), m_entry.category.c_str());
|
||||
text_start_y += text_inc_y;
|
||||
gfx::drawTextArgs(vg, text_start_x, text_start_y, font_size, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "extracted: %.2f MiB"_i18n.c_str(), (double)m_entry.extracted / 1024.0);
|
||||
gfx::drawTextArgs(vg, text_start_x, text_start_y, font_size, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "extracted: %s"_i18n.c_str(), utils::formatSizeStorage(m_entry.extracted).c_str());
|
||||
text_start_y += text_inc_y;
|
||||
gfx::drawTextArgs(vg, text_start_x, text_start_y, font_size, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "app_dls: %s"_i18n.c_str(), AppDlToStr(m_entry.app_dls).c_str());
|
||||
text_start_y += text_inc_y;
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "ui/error_box.hpp"
|
||||
#include "ui/music_player.hpp"
|
||||
|
||||
#include "utils/utils.hpp"
|
||||
#include "utils/devoptab.hpp"
|
||||
|
||||
#include "log.hpp"
|
||||
@@ -603,10 +604,10 @@ void FsView::Draw(NVGcontext* vg, Theme* theme) {
|
||||
}
|
||||
|
||||
if (e.file_count != -1) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%zd files"_i18n.c_str(), e.file_count);
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(ThemeEntryID_TEXT_INFO), "%zd files"_i18n.c_str(), e.file_count);
|
||||
}
|
||||
if (e.dir_count != -1) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(text_id), "%zd dirs"_i18n.c_str(), e.dir_count);
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT_INFO), "%zd dirs"_i18n.c_str(), e.dir_count);
|
||||
}
|
||||
} else if (e.IsFile() && !m_fs_entry.IsNoStatFile() && (e.file_size != -1 || !e.time_stamp.is_valid)) {
|
||||
if (!e.time_stamp.is_valid && !e.done_stat) {
|
||||
@@ -622,14 +623,9 @@ void FsView::Draw(NVGcontext* vg, Theme* theme) {
|
||||
const auto t = (time_t)(e.time_stamp.modified);
|
||||
struct tm tm{};
|
||||
localtime_r(&t, &tm);
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(text_id), "%02u/%02u/%u", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
|
||||
if ((double)e.file_size / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f KiB", (double)e.file_size / 1024.0);
|
||||
} else if ((double)e.file_size / 1024.0 / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f MiB", (double)e.file_size / 1024.0 / 1024.0);
|
||||
} else {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f GiB", (double)e.file_size / 1024.0 / 1024.0 / 1024.0);
|
||||
}
|
||||
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT_INFO), "%02u/%02u/%u", tm.tm_mday, tm.tm_mon + 1, tm.tm_year + 1900);
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(ThemeEntryID_TEXT_INFO), "%s", utils::formatSizeStorage(e.file_size).c_str());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
#include "yati/nx/ncm.hpp"
|
||||
#include "yati/nx/es.hpp"
|
||||
|
||||
#include "utils/utils.hpp"
|
||||
|
||||
#include "title_info.hpp"
|
||||
#include "app.hpp"
|
||||
#include "defines.hpp"
|
||||
@@ -231,14 +233,8 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
|
||||
GetNcmSizeOfMetaStatus(e);
|
||||
}
|
||||
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(text_id), "%s", ncm::GetReadableStorageIdStr(e.status.storageID));
|
||||
if ((double)e.size / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f KiB", (double)e.size / 1024.0);
|
||||
} else if ((double)e.size / 1024.0 / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f MiB", (double)e.size / 1024.0 / 1024.0);
|
||||
} else {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(text_id), "%.2f GiB", (double)e.size / 1024.0 / 1024.0 / 1024.0);
|
||||
}
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) + 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT_INFO), "%s", ncm::GetReadableStorageIdStr(e.status.storageID));
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f) - 3, 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(ThemeEntryID_TEXT_INFO), "%s", utils::formatSizeStorage(e.size).c_str());
|
||||
|
||||
if (e.selected) {
|
||||
gfx::drawText(vg, x + text_xoffset - 80 / 2, y + (h / 2.f) - (24.f / 2), 24.f, "\uE14B", nullptr, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT_SELECTED));
|
||||
|
||||
@@ -344,15 +344,8 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
|
||||
}
|
||||
|
||||
gfx::drawTextArgs(vg, x + text_xoffset, y + (h / 2.f), 20.f, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%s", ncm::GetContentTypeStr(e.content_type));
|
||||
gfx::drawTextArgs(vg, x + text_xoffset + 185, y + (h / 2.f), 20.f, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%s", utils::hexIdToStr(e.content_id).str);
|
||||
|
||||
if ((double)e.size / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%.2f KiB", (double)e.size / 1024.0);
|
||||
} else if ((double)e.size / 1024.0 / 1024.0 / 1024.0 <= 0.009) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%.2f MiB", (double)e.size / 1024.0 / 1024.0);
|
||||
} else {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%.2f GiB", (double)e.size / 1024.0 / 1024.0 / 1024.0);
|
||||
}
|
||||
gfx::drawTextArgs(vg, x + text_xoffset + 150, y + (h / 2.f), 20.f, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "%s", utils::hexIdToStr(e.content_id).str);
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(ThemeEntryID_TEXT_INFO), "%s", utils::formatSizeStorage(e.size).c_str());
|
||||
|
||||
if (e.missing) {
|
||||
gfx::drawText(vg, x + text_xoffset - 80 / 2, y + (h / 2.f) - (24.f / 2), 24.f, "\uE140", nullptr, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_ERROR));
|
||||
|
||||
@@ -233,7 +233,7 @@ void Menu::Draw(NVGcontext* vg, Theme* theme) {
|
||||
nvgRestore(vg);
|
||||
|
||||
if (!e.tag.empty()) {
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(text_id), "version: %s", e.tag.c_str());
|
||||
gfx::drawTextArgs(vg, x + w - text_xoffset, y + (h / 2.f), 16.f, NVG_ALIGN_RIGHT | NVG_ALIGN_MIDDLE, theme->GetColour(ThemeEntryID_TEXT_INFO), "version: %s", e.tag.c_str());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -18,8 +18,9 @@ Vec4 Menu::DrawEntry(NVGcontext* vg, Theme* theme, bool draw_image, int layout,
|
||||
const auto& [x, y, w, h] = v;
|
||||
|
||||
auto text_id = ThemeEntryID_TEXT;
|
||||
auto info_id = ThemeEntryID_TEXT_INFO;
|
||||
if (selected) {
|
||||
text_id = ThemeEntryID_TEXT_SELECTED;
|
||||
text_id = info_id = ThemeEntryID_TEXT_SELECTED;
|
||||
gfx::drawRectOutline(vg, theme, 4.f, v);
|
||||
} else {
|
||||
DrawElement(v, ThemeEntryID_GRID);
|
||||
@@ -38,8 +39,8 @@ Vec4 Menu::DrawEntry(NVGcontext* vg, Theme* theme, bool draw_image, int layout,
|
||||
const auto text_clip_w = w - 30.f - text_off;
|
||||
const float font_size = 18;
|
||||
m_scroll_name.Draw(vg, selected, text_x, y + 45, text_clip_w, font_size, NVG_ALIGN_LEFT, theme->GetColour(text_id), name);
|
||||
m_scroll_author.Draw(vg, selected, text_x, y + 80, text_clip_w, font_size, NVG_ALIGN_LEFT, theme->GetColour(text_id), author);
|
||||
m_scroll_version.Draw(vg, selected, text_x, y + 115, text_clip_w, font_size, NVG_ALIGN_LEFT, theme->GetColour(text_id), version);
|
||||
m_scroll_author.Draw(vg, selected, text_x, y + 80, text_clip_w, font_size, NVG_ALIGN_LEFT, theme->GetColour(info_id), author);
|
||||
m_scroll_version.Draw(vg, selected, text_x, y + 115, text_clip_w, font_size, NVG_ALIGN_LEFT, theme->GetColour(info_id), version);
|
||||
} else {
|
||||
if (selected) {
|
||||
gfx::drawAppLable(vg, theme, m_scroll_name, x, y, w, name);
|
||||
|
||||
@@ -20,20 +20,24 @@ auto MenuBase::GetPolledData(bool force_refresh) -> PolledData {
|
||||
// doesn't have focus.
|
||||
if (force_refresh || timestamp.GetSeconds() >= 1) {
|
||||
data.tm = {};
|
||||
data.battery_percetange = {};
|
||||
data.charger_type = {};
|
||||
data.type = {};
|
||||
data.status = {};
|
||||
data.strength = {};
|
||||
data.ip = {};
|
||||
// avoid divide by zero if getting the size fails, for whatever reason.
|
||||
data.sd_free = 1;
|
||||
data.sd_total = 1;
|
||||
data.emmc_free = 1;
|
||||
data.emmc_total = 1;
|
||||
|
||||
const auto t = std::time(NULL);
|
||||
localtime_r(&t, &data.tm);
|
||||
psmGetBatteryChargePercentage(&data.battery_percetange);
|
||||
psmGetChargerType(&data.charger_type);
|
||||
nifmGetInternetConnectionStatus(&data.type, &data.strength, &data.status);
|
||||
nifmGetCurrentIpAddress(&data.ip);
|
||||
|
||||
App::GetSdSize(&data.sd_free, &data.sd_total);
|
||||
App::GetEmmcSize(&data.emmc_free, &data.emmc_total);
|
||||
|
||||
timestamp.Update();
|
||||
}
|
||||
|
||||
@@ -60,7 +64,7 @@ void MenuBase::Draw(NVGcontext* vg, Theme* theme) {
|
||||
const auto pdata = GetPolledData();
|
||||
|
||||
const float start_y = 70;
|
||||
const float font_size = 22;
|
||||
const float font_size = 20;
|
||||
const float spacing = 30;
|
||||
|
||||
float start_x = 1220;
|
||||
@@ -77,21 +81,59 @@ void MenuBase::Draw(NVGcontext* vg, Theme* theme) {
|
||||
start_x -= spacing + (bounds[2] - bounds[0]); \
|
||||
}
|
||||
|
||||
draw(ThemeEntryID_TEXT, 90, "%u\uFE6A", pdata.battery_percetange);
|
||||
#define STORAGE_BAR_W 180
|
||||
#define STORAGE_BAR_H 8
|
||||
|
||||
if (App::Get12HourTimeEnable()) {
|
||||
draw(ThemeEntryID_TEXT, 132, "%02u:%02u %s", (pdata.tm.tm_hour == 0 || pdata.tm.tm_hour == 12) ? 12 : pdata.tm.tm_hour % 12, pdata.tm.tm_min, (pdata.tm.tm_hour < 12) ? "AM" : "PM");
|
||||
} else {
|
||||
draw(ThemeEntryID_TEXT, 90, "%02u:%02u", pdata.tm.tm_hour, pdata.tm.tm_min);
|
||||
}
|
||||
const auto rounding = 2;
|
||||
const auto storage_font = 19;
|
||||
const auto storage_y = start_y - 30;
|
||||
auto storage_x = start_x - STORAGE_BAR_W;
|
||||
|
||||
if (pdata.ip) {
|
||||
draw(ThemeEntryID_TEXT, 0, "%u.%u.%u.%u", pdata.ip&0xFF, (pdata.ip>>8)&0xFF, (pdata.ip>>16)&0xFF, (pdata.ip>>24)&0xFF);
|
||||
} else {
|
||||
draw(ThemeEntryID_TEXT, 0, ("No Internet"_i18n).c_str());
|
||||
}
|
||||
gfx::drawTextArgs(vg, storage_x, storage_y, storage_font, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "System %.1f GB"_i18n.c_str(), pdata.emmc_free / 1024.0 / 1024.0 / 1024.0);
|
||||
// gfx::drawTextArgs(vg, storage_x, storage_y, storage_font, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "eMMC %.1f GB"_i18n.c_str(), pdata.emmc_free / 1024.0 / 1024.0 / 1024.0);
|
||||
#if 0
|
||||
Vec4 prog_bar{storage_x, storage_y + 24, STORAGE_BAR_W, STORAGE_BAR_H};
|
||||
gfx::drawRect(vg, prog_bar, theme->GetColour(ThemeEntryID_PROGRESSBAR_BACKGROUND), rounding);
|
||||
gfx::drawRect(vg, prog_bar.x, prog_bar.y, ((double)pdata.emmc_free / (double)pdata.emmc_total) * prog_bar.w, prog_bar.h, theme->GetColour(ThemeEntryID_PROGRESSBAR), rounding);
|
||||
#else
|
||||
gfx::drawRect(vg, storage_x, storage_y + 24, STORAGE_BAR_W, STORAGE_BAR_H, theme->GetColour(ThemeEntryID_TEXT_INFO), rounding);
|
||||
gfx::drawRect(vg, storage_x + 1, storage_y + 24 + 1, STORAGE_BAR_W - 2, STORAGE_BAR_H - 2, theme->GetColour(ThemeEntryID_BACKGROUND), rounding);
|
||||
gfx::drawRect(vg, storage_x + 2, storage_y + 24 + 2, STORAGE_BAR_W - (((double)pdata.emmc_free / (double)pdata.emmc_total) * STORAGE_BAR_W) - 4, STORAGE_BAR_H - 4, theme->GetColour(ThemeEntryID_TEXT_INFO), rounding);
|
||||
#endif
|
||||
|
||||
storage_x -= (STORAGE_BAR_W + spacing);
|
||||
gfx::drawTextArgs(vg, storage_x, storage_y, storage_font, NVG_ALIGN_LEFT | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "microSD %.1f GB"_i18n.c_str(), pdata.sd_free / 1024.0 / 1024.0 / 1024.0);
|
||||
gfx::drawRect(vg, storage_x, storage_y + 24, STORAGE_BAR_W, STORAGE_BAR_H, theme->GetColour(ThemeEntryID_TEXT_INFO), rounding);
|
||||
gfx::drawRect(vg, storage_x + 1, storage_y + 24 + 1, STORAGE_BAR_W - 2, STORAGE_BAR_H - 2, theme->GetColour(ThemeEntryID_BACKGROUND), rounding);
|
||||
gfx::drawRect(vg, storage_x + 2, storage_y + 24 + 2, STORAGE_BAR_W - (((double)pdata.sd_free / (double)pdata.sd_total) * STORAGE_BAR_W) - 4, STORAGE_BAR_H - 4, theme->GetColour(ThemeEntryID_TEXT_INFO), rounding);
|
||||
start_x -= (STORAGE_BAR_W + spacing) * 2;
|
||||
|
||||
// ran out of space, its one or the other.
|
||||
if (!App::IsApplication()) {
|
||||
draw(ThemeEntryID_ERROR, 0, ("[Applet Mode]"_i18n).c_str());
|
||||
} else {
|
||||
if (pdata.ip) {
|
||||
char ip_buf[32];
|
||||
std::snprintf(ip_buf, sizeof(ip_buf), "%u.%u.%u.%u", pdata.ip & 0xFF, (pdata.ip >> 8) & 0xFF, (pdata.ip >> 16) & 0xFF, (pdata.ip >> 24) & 0xFF);
|
||||
gfx::textBounds(vg, 0, 0, bounds, ip_buf);
|
||||
|
||||
char type_buf[32];
|
||||
if (pdata.type == NifmInternetConnectionType_WiFi) {
|
||||
std::snprintf(type_buf, sizeof(type_buf), "Wi-Fi %.0f%%"_i18n.c_str(), ((float)pdata.strength / 3.F) * 100);
|
||||
} else if (pdata.type == NifmInternetConnectionType_Ethernet) {
|
||||
std::snprintf(type_buf, sizeof(type_buf), "Ethernet"_i18n.c_str());
|
||||
} else {
|
||||
std::snprintf(type_buf, sizeof(type_buf), "Unknown"_i18n.c_str());
|
||||
}
|
||||
|
||||
const auto ip_x = start_x;
|
||||
const auto ip_w = bounds[2] - bounds[0];
|
||||
const auto type_x = ip_x - ip_w / 2;
|
||||
gfx::drawTextArgs(vg, type_x, start_y - 25, storage_font - 1, NVG_ALIGN_CENTER | NVG_ALIGN_BOTTOM, theme->GetColour(ThemeEntryID_TEXT_INFO), "%s", type_buf);
|
||||
gfx::drawTextArgs(vg, ip_x, start_y, storage_font, NVG_ALIGN_RIGHT | NVG_ALIGN_BOTTOM, theme->GetColour(ThemeEntryID_TEXT), "%s", ip_buf);
|
||||
} else {
|
||||
draw(ThemeEntryID_TEXT, 0, ("No Internet"_i18n).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
#undef draw
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "threaded_file_transfer.hpp"
|
||||
#include "i18n.hpp"
|
||||
|
||||
#include "utils/utils.hpp"
|
||||
#include "utils/thread.hpp"
|
||||
|
||||
#include <cstring>
|
||||
@@ -152,16 +153,6 @@ auto ProgressBox::Draw(NVGcontext* vg, Theme* theme) -> void {
|
||||
const auto rad = 15;
|
||||
gfx::drawSpinner(vg, theme, prog_bar.x - pad - rad, prog_bar.y + prog_bar.h / 2, rad, armTicksToNs(armGetSystemTick()) / 1e+9);
|
||||
|
||||
const double speed_mb = (double)speed / (1024.0 * 1024.0);
|
||||
const double speed_kb = (double)speed / (1024.0);
|
||||
|
||||
char speed_str[32];
|
||||
if (speed_mb >= 0.01) {
|
||||
std::snprintf(speed_str, sizeof(speed_str), "%.2f MiB/s", speed_mb);
|
||||
} else {
|
||||
std::snprintf(speed_str, sizeof(speed_str), "%.2f KiB/s", speed_kb);
|
||||
}
|
||||
|
||||
const auto left = size - last_offset;
|
||||
const auto left_seconds = left / speed;
|
||||
const auto hours = left_seconds / (60 * 60);
|
||||
@@ -177,7 +168,7 @@ auto ProgressBox::Draw(NVGcontext* vg, Theme* theme) -> void {
|
||||
std::snprintf(time_str, sizeof(time_str), "%zu seconds remaining"_i18n.c_str(), seconds);
|
||||
}
|
||||
|
||||
gfx::drawTextArgs(vg, center_x, prog_bar.y + prog_bar.h + 30, 18, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "%s (%s)", time_str, speed_str);
|
||||
gfx::drawTextArgs(vg, center_x, prog_bar.y + prog_bar.h + 30, 18, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), "%s (%s)", time_str, utils::formatSizeNetwork(speed).c_str());
|
||||
}
|
||||
|
||||
gfx::drawTextArgs(vg, center_x, m_pos.y + 40, 24, NVG_ALIGN_CENTER | NVG_ALIGN_TOP, theme->GetColour(ThemeEntryID_TEXT), action.c_str());
|
||||
|
||||
@@ -14,6 +14,25 @@ HashStr hexIdToStrInternal(auto id) {
|
||||
return str;
|
||||
}
|
||||
|
||||
std::string formatSizeInetrnal(double size, double base) {
|
||||
static const char* const suffixes[] = { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
|
||||
size_t suffix_index = 0;
|
||||
|
||||
while (size >= base && suffix_index < std::size(suffixes) - 1) {
|
||||
size /= base;
|
||||
suffix_index++;
|
||||
}
|
||||
|
||||
char buffer[32];
|
||||
if (suffix_index == 0) {
|
||||
std::snprintf(buffer, sizeof(buffer), "%.0f %s", size, suffixes[suffix_index]);
|
||||
} else {
|
||||
std::snprintf(buffer, sizeof(buffer), "%.2f %s", size, suffixes[suffix_index]);
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
HashStr hexIdToStr(FsRightsId id) {
|
||||
@@ -28,4 +47,12 @@ HashStr hexIdToStr(NcmContentId id) {
|
||||
return hexIdToStrInternal(id);
|
||||
}
|
||||
|
||||
std::string formatSizeStorage(u64 size) {
|
||||
return formatSizeInetrnal(size, 1024.0);
|
||||
}
|
||||
|
||||
std::string formatSizeNetwork(u64 size) {
|
||||
return formatSizeInetrnal(size, 1000.0);
|
||||
}
|
||||
|
||||
} // namespace sphaira::utils
|
||||
|
||||
@@ -34,9 +34,9 @@ auto GetContentTypeStr(u8 content_type) -> const char* {
|
||||
case NcmContentType_Program: return "Program";
|
||||
case NcmContentType_Data: return "Data";
|
||||
case NcmContentType_Control: return "Control";
|
||||
case NcmContentType_HtmlDocument: return "HtmlDocument";
|
||||
case NcmContentType_LegalInformation: return "LegalInformation";
|
||||
case NcmContentType_DeltaFragment: return "DeltaFragment";
|
||||
case NcmContentType_HtmlDocument: return "Html";
|
||||
case NcmContentType_LegalInformation: return "Legal";
|
||||
case NcmContentType_DeltaFragment: return "Delta";
|
||||
}
|
||||
|
||||
return "Unknown";
|
||||
|
||||
Reference in New Issue
Block a user