#include "settings.hpp" #include "window.hpp" #include "plugin.hpp" #include "app/Scene.hpp" #include "app/ModuleBrowser.hpp" #include "engine/Engine.hpp" #include "app.hpp" #include namespace rack { namespace settings { static json_t *settingsToJson() { // root json_t *rootJ = json_object(); // token json_t *tokenJ = json_string(plugin::token.c_str()); json_object_set_new(rootJ, "token", tokenJ); if (!app()->window->isMaximized()) { // windowSize math::Vec windowSize = app()->window->getWindowSize(); json_t *windowSizeJ = json_pack("[f, f]", windowSize.x, windowSize.y); json_object_set_new(rootJ, "windowSize", windowSizeJ); // windowPos math::Vec windowPos = app()->window->getWindowPos(); json_t *windowPosJ = json_pack("[f, f]", windowPos.x, windowPos.y); json_object_set_new(rootJ, "windowPos", windowPosJ); } // wireOpacity json_t *wireOpacityJ = json_real(wireOpacity); json_object_set_new(rootJ, "wireOpacity", wireOpacityJ); // wireTension json_t *wireTensionJ = json_real(wireTension); json_object_set_new(rootJ, "wireTension", wireTensionJ); // zoom json_t *zoomJ = json_real(zoom); json_object_set_new(rootJ, "zoom", zoomJ); // allowCursorLock json_t *allowCursorLockJ = json_boolean(app()->window->allowCursorLock); json_object_set_new(rootJ, "allowCursorLock", allowCursorLockJ); // sampleRate json_t *sampleRateJ = json_real(app()->engine->getSampleRate()); json_object_set_new(rootJ, "sampleRate", sampleRateJ); // lastPath json_t *lastPathJ = json_string(app()->scene->rackWidget->lastPath.c_str()); json_object_set_new(rootJ, "lastPath", lastPathJ); // skipLoadOnLaunch if (skipLoadOnLaunch) { json_object_set_new(rootJ, "skipLoadOnLaunch", json_true()); } // moduleBrowser json_object_set_new(rootJ, "moduleBrowser", moduleBrowserToJson()); // powerMeter json_object_set_new(rootJ, "powerMeter", json_boolean(powerMeter)); // checkVersion json_object_set_new(rootJ, "checkVersion", json_boolean(checkVersion)); // paramTooltip json_object_set_new(rootJ, "paramTooltip", json_boolean(paramTooltip)); return rootJ; } static void settingsFromJson(json_t *rootJ) { // token json_t *tokenJ = json_object_get(rootJ, "token"); if (tokenJ) plugin::token = json_string_value(tokenJ); // windowSize json_t *windowSizeJ = json_object_get(rootJ, "windowSize"); if (windowSizeJ) { double width, height; json_unpack(windowSizeJ, "[F, F]", &width, &height); app()->window->setWindowSize(math::Vec(width, height)); } // windowPos json_t *windowPosJ = json_object_get(rootJ, "windowPos"); if (windowPosJ) { double x, y; json_unpack(windowPosJ, "[F, F]", &x, &y); app()->window->setWindowPos(math::Vec(x, y)); } // wireOpacity json_t *wireOpacityJ = json_object_get(rootJ, "wireOpacity"); if (wireOpacityJ) wireOpacity = json_number_value(wireOpacityJ); // tension json_t *tensionJ = json_object_get(rootJ, "wireTension"); if (tensionJ) wireTension = json_number_value(tensionJ); // zoom json_t *zoomJ = json_object_get(rootJ, "zoom"); if (zoomJ) zoom = json_number_value(zoomJ); // allowCursorLock json_t *allowCursorLockJ = json_object_get(rootJ, "allowCursorLock"); if (allowCursorLockJ) app()->window->allowCursorLock = json_is_true(allowCursorLockJ); // sampleRate json_t *sampleRateJ = json_object_get(rootJ, "sampleRate"); if (sampleRateJ) { float sampleRate = json_number_value(sampleRateJ); app()->engine->setSampleRate(sampleRate); } // lastPath json_t *lastPathJ = json_object_get(rootJ, "lastPath"); if (lastPathJ) app()->scene->rackWidget->lastPath = json_string_value(lastPathJ); // skipLoadOnLaunch json_t *skipLoadOnLaunchJ = json_object_get(rootJ, "skipLoadOnLaunch"); if (skipLoadOnLaunchJ) skipLoadOnLaunch = json_boolean_value(skipLoadOnLaunchJ); // moduleBrowser json_t *moduleBrowserJ = json_object_get(rootJ, "moduleBrowser"); if (moduleBrowserJ) moduleBrowserFromJson(moduleBrowserJ); // powerMeter json_t *powerMeterJ = json_object_get(rootJ, "powerMeter"); if (powerMeterJ) powerMeter = json_boolean_value(powerMeterJ); // checkVersion json_t *checkVersionJ = json_object_get(rootJ, "checkVersion"); if (checkVersionJ) checkVersion = json_boolean_value(checkVersionJ); // paramTooltip json_t *paramTooltipJ = json_object_get(rootJ, "paramTooltip"); if (paramTooltipJ) paramTooltip = json_boolean_value(paramTooltipJ); } void save(std::string filename) { INFO("Saving settings %s", filename.c_str()); json_t *rootJ = settingsToJson(); if (rootJ) { FILE *file = fopen(filename.c_str(), "w"); if (!file) return; json_dumpf(rootJ, file, JSON_INDENT(2) | JSON_REAL_PRECISION(9)); json_decref(rootJ); fclose(file); } } void load(std::string filename) { INFO("Loading settings %s", filename.c_str()); FILE *file = fopen(filename.c_str(), "r"); if (!file) return; json_error_t error; json_t *rootJ = json_loadf(file, 0, &error); if (rootJ) { settingsFromJson(rootJ); json_decref(rootJ); } else { WARN("JSON parsing error at %s %d:%d %s", error.source, error.line, error.column, error.text); } fclose(file); } float zoom = 1.0; float wireOpacity = 0.5; float wireTension = 0.5; bool paramTooltip = false; bool powerMeter = false; bool lockModules = false; bool checkVersion = true; bool skipLoadOnLaunch = false; } // namespace settings } // namespace rack