Change title to "MuJoCo Live" and respect system colour scheme.

PiperOrigin-RevId: 916183118
Change-Id: I760be720cb001038e993383a5e523a2de8496a7c
This commit is contained in:
Saran Tunyasuvunakool
2026-05-15 14:26:00 -07:00
committed by Copybara-Service
parent b540909f18
commit 2345663efb
4 changed files with 32 additions and 12 deletions
+10 -4
View File
@@ -81,9 +81,15 @@ static constexpr const char* ICON_UNDO_SPEC = platform::ICON_FA_UNDO;
static constexpr const char* ICON_REDO_SPEC = platform::ICON_FA_REPEAT; static constexpr const char* ICON_REDO_SPEC = platform::ICON_FA_REPEAT;
App::App(Config config) App::App(Config config)
: ini_path_(std::move(config.ini_path)), gfx_mode_(config.gfx_mode) { : app_title_(std::move(config.title)),
ini_path_(std::move(config.ini_path)),
gfx_mode_(config.gfx_mode) {
SwitchGraphicsMode(config.width, config.height, config.gfx_mode); SwitchGraphicsMode(config.width, config.height, config.gfx_mode);
if (config.initial_theme.has_value()) {
ui_.theme = *config.initial_theme;
}
ImPlot::CreateContext(); ImPlot::CreateContext();
mjv_defaultPerturb(&perturb_); mjv_defaultPerturb(&perturb_);
mjv_defaultCamera(&camera_); mjv_defaultCamera(&camera_);
@@ -100,7 +106,7 @@ void App::SwitchGraphicsMode(int width, int height,
platform::Window::Config window_config; platform::Window::Config window_config;
window_config.gfx_mode = gfx_mode_; window_config.gfx_mode = gfx_mode_;
window_ = std::make_unique<platform::Window>("MuJoCo Studio", width, height, window_ = std::make_unique<platform::Window>(app_title_, width, height,
window_config); window_config);
renderer_ = std::make_unique<platform::Renderer>( renderer_ = std::make_unique<platform::Renderer>(
window_->GetNativeWindowHandle(), gfx_mode_); window_->GetNativeWindowHandle(), gfx_mode_);
@@ -147,9 +153,9 @@ void App::LoadModelFromFile(const std::string& filepath) {
UpdateFilePaths(resolved_file); UpdateFilePaths(resolved_file);
if (model() && model()->names) { if (model() && model()->names) {
// Assumes the first string in the model is the name of the model itself. // Assumes the first string in the model is the name of the model itself.
window_->SetTitle("MuJoCo Studio : " + std::string(model()->names)); window_->SetTitle(app_title_ + " : " + std::string(model()->names));
} else { } else {
window_->SetTitle("MuJoCo Studio : " + window_->SetTitle(app_title_ + " : " +
std::filesystem::path(filepath).stem().string()); std::filesystem::path(filepath).stem().string());
} }
} else { } else {
+7
View File
@@ -55,6 +55,12 @@ class App {
// The graphics configuration used for initializing the window. // The graphics configuration used for initializing the window.
platform::GraphicsMode gfx_mode = platform::GraphicsMode::FilamentVulkan; platform::GraphicsMode gfx_mode = platform::GraphicsMode::FilamentVulkan;
// The initial GUI theme. If set, overrides the default (kLight).
std::optional<platform::GuiTheme> initial_theme;
// The application title shown in the window title bar.
std::string title = "MuJoCo Studio";
}; };
explicit App(Config config); explicit App(Config config);
@@ -227,6 +233,7 @@ class App {
bool has_model() const { return model_holder_ && model_holder_->model(); } bool has_model() const { return model_holder_ && model_holder_->model(); }
bool has_data() const { return model_holder_ && model_holder_->data(); } bool has_data() const { return model_holder_ && model_holder_->data(); }
std::string app_title_;
std::string ini_path_; std::string ini_path_;
std::string model_name_; // Used if model_kind_ is kModelFromBuffer. std::string model_name_; // Used if model_kind_ is kModelFromBuffer.
std::string model_path_; std::string model_path_;
+12 -7
View File
@@ -148,7 +148,7 @@ void RegisterAsset(std::string filename, std::string contents) {
} }
// Javascript-facing function to initialize the app. // Javascript-facing function to initialize the app.
void Init() { void Init(const std::string& title, bool dark_theme) {
// Note: dimensions do not matter as window will be resized to fit canvas. // Note: dimensions do not matter as window will be resized to fit canvas.
const int width = 100; const int width = 100;
const int height = 100; const int height = 100;
@@ -224,12 +224,17 @@ void Init() {
github_provider.prefix = "github"; github_provider.prefix = "github";
mjp_registerResourceProvider(&github_provider); mjp_registerResourceProvider(&github_provider);
g_app = new mujoco::studio::App({ mujoco::studio::App::Config config;
.width = width, config.width = width;
.height = height, config.height = height;
.ini_path = ini_path, config.ini_path = ini_path;
.gfx_mode = mujoco::platform::GraphicsMode::FilamentWebGl, config.gfx_mode = mujoco::platform::GraphicsMode::FilamentWebGl;
}); config.initial_theme = dark_theme ? mujoco::platform::GuiTheme::kDark
: mujoco::platform::GuiTheme::kLight;
if (!title.empty()) {
config.title = title;
}
g_app = new mujoco::studio::App(std::move(config));
g_app->InitEmptyModel(); g_app->InitEmptyModel();
} }
+3 -1
View File
@@ -96,7 +96,9 @@ var Module = {
Promise.all(assetPromises) Promise.all(assetPromises)
.then(() => { .then(() => {
try { try {
Module.init(); const prefersDark = !(window.matchMedia &&
window.matchMedia('(prefers-color-scheme: light)').matches);
Module.init("MuJoCo Live", prefersDark);
// Check for a ?model= URL parameter and load from URL. // Check for a ?model= URL parameter and load from URL.
const params = new URLSearchParams(window.location.search); const params = new URLSearchParams(window.location.search);