diff --git a/libstarlight/source/starlight/ThemeManager.cpp b/libstarlight/source/starlight/ThemeManager.cpp index e966922..94220c2 100644 --- a/libstarlight/source/starlight/ThemeManager.cpp +++ b/libstarlight/source/starlight/ThemeManager.cpp @@ -286,9 +286,6 @@ void ThemeManager::LoadProc() { } string ThemeManager::ResolveAssetPath(const string& id) { - //struct stat buf; - //string path(id.length() + 64, ' '); // preallocate buffer space - string pfx = ""; size_t cpos = id.find(":/"); @@ -339,23 +336,50 @@ string ThemeManager::ResolveAssetPath(const string& id) { } } - /*path.clear(); path.append("romfs:/"); path.append(id); path.append(".json"); - printf("attempt: %s\n", path.c_str()); - if (stat(path.c_str(), &buf) == 0) return path; - path.erase(path.end()-5, path.end()); path.append(".png"); - printf("attempt: %s\n", path.c_str()); - if (stat(path.c_str(), &buf) == 0) return path;//*/ - return string(); } string ThemeManager::ResolveFontPath(const string& id) { // there we go, nice and simple - for (auto thm : themeData) { - Path p = thm.basePath.Combine("fonts").Combine(id+".json"); + string pfx = ""; + + size_t cpos = id.find(":/"); + if (cpos != string::npos) { + pfx = id.substr(0, cpos); + cpos += 2; + } else cpos = 0; + + if (pfx == "app") { + string sid = id.substr(cpos); // strip off the "app:/" + // app-local asset + // check if present in theme/app/[appname]/fonts/, else check in romfs + for (auto thm : themeData) { + Path bp = thm.basePath.Combine("app").Combine(Application::AppName()).Combine("fonts"); + Path p = bp.Combine(sid+".json"); + if (p.IsFile()) return p; + } + // TBD - directly in romfs, or in an assets folder? + Path bp = Path("romfs:/fonts/"); + Path p = bp.Combine(sid+".json"); if (p.IsFile()) return p; } + else if (pfx == "sdmc" || pfx == "romfs") { + // no forced "fonts" here, of course; this is an actual path + Path p = Path(id + ".json"); + if (p.IsFile()) return p; + } + else { + // theme asset; check in each theme from selected to most-fallback + + for (auto thm : themeData) { + Path p = thm.basePath.Combine("fonts").Combine(id+".json"); + if (p.IsFile()) return p; + } + } - return string(); + // I guess fall back to 12px monospace if it's just nowhere to be found + const string fallback = "mono.12"; + if (id != fallback) return ResolveFontPath(fallback); + return string(); // fallback not found; no themes on sdmc or romfs, probably } json& ThemeManager::GetMetric(const string& path) { diff --git a/libstarlight/todo.txt b/libstarlight/todo.txt index 6fe27d2..da84d88 100644 --- a/libstarlight/todo.txt +++ b/libstarlight/todo.txt @@ -2,14 +2,10 @@ roadmap to v0.5.1 { - - clear bug workaround implemented - ^ maybe replace clearing with the workaround entirely? - - try to figure out why the workaround doesn't work in citra (it was a difference between openGL and PICA blend operations!) - https://github.com/citra-emu/citra/issues/2684 - implement more blend modes { - - flat replace - - masking - } + make font-not-found not outright crash the app + make asset gc actually sweep every 5sec + maybe entirely replace clearing with transparent knockout on bind? + implement more blend modes?? - libctru console as ui element @@ -37,9 +33,11 @@ roadmap to v0.5.1 { lambda task thread } } then by v0.5.5 { + refactor ResolveAsset/FontPath to use Path objects for cleaner code event propagation system of some sort; threadsafe to whatever extent is needed on 3DS figure out how to *actually* fix the clear bug...? some sort of tagging for longer retention for large drawables such as backgrounds (particularly for the OSK) + convert the profiler from "single static thing" to "here, have an instance on the stack" } then consider these before 1.0 "gold" { replace some of the OptRef stuffs on invalidatable types with invalid checks; add implicit conversions from nullptr to invalid make closing forms a bit less finicky (add them to a separate list and let the Application remove them from the list) @@ -68,7 +66,10 @@ roadmap to v0.5.1 { quick includes for all UI elements, etc. cross-app integrations { - app icon and manifest.json in romfs, copied into .starlight on launch + app icon and manifest.json in romfs, copied into .starlight on launch { + app name, description etc. + themeLevel: 0 (default) as fallback only, 1 or 2 to override user theme unless opted out, 1 for "just by default", 2 for "this doesn't look so good otherwise" + } settings pane data for each app, contained in manifest.json and used by Starlight Settings to provide centralized configuration, iOS-style some standard means of passing parameters into another application, which works on a cia (probably a json file) }