@@ -12,11 +12,11 @@ namespace rack { | |||||
void App::init() { | void App::init() { | ||||
engine = new engine::Engine; | engine = new engine::Engine; | ||||
patch = new PatchManager; | |||||
if (!settings::headless) { | if (!settings::headless) { | ||||
event = new event::State; | event = new event::State; | ||||
history = new history::State; | history = new history::State; | ||||
window = new Window; | window = new Window; | ||||
patch = new PatchManager; | |||||
scene = new app::Scene; | scene = new app::Scene; | ||||
event->rootWidget = scene; | event->rootWidget = scene; | ||||
} | } | ||||
@@ -27,9 +27,6 @@ App::~App() { | |||||
if (scene) | if (scene) | ||||
delete scene; | delete scene; | ||||
scene = NULL; | scene = NULL; | ||||
if (patch) | |||||
delete patch; | |||||
patch = NULL; | |||||
if (event) | if (event) | ||||
delete event; | delete event; | ||||
event = NULL; | event = NULL; | ||||
@@ -39,6 +36,9 @@ App::~App() { | |||||
if (window) | if (window) | ||||
delete window; | delete window; | ||||
window = NULL; | window = NULL; | ||||
if (patch) | |||||
delete patch; | |||||
patch = NULL; | |||||
if (engine) | if (engine) | ||||
delete engine; | delete engine; | ||||
engine = NULL; | engine = NULL; | ||||
@@ -411,14 +411,17 @@ void Engine::clear() { | |||||
std::set<ParamHandle*> paramHandles = internal->paramHandles; | std::set<ParamHandle*> paramHandles = internal->paramHandles; | ||||
for (ParamHandle* paramHandle : paramHandles) { | for (ParamHandle* paramHandle : paramHandles) { | ||||
removeParamHandle(paramHandle); | removeParamHandle(paramHandle); | ||||
// Don't delete paramHandle because they're owned by other things (e.g. Modules) | |||||
} | } | ||||
std::vector<Cable*> cables = internal->cables; | std::vector<Cable*> cables = internal->cables; | ||||
for (Cable* cable : cables) { | for (Cable* cable : cables) { | ||||
removeCable(cable); | removeCable(cable); | ||||
delete cable; | |||||
} | } | ||||
std::vector<Module*> modules = internal->modules; | std::vector<Module*> modules = internal->modules; | ||||
for (Module* module : modules) { | for (Module* module : modules) { | ||||
removeModule(module); | removeModule(module); | ||||
delete module; | |||||
} | } | ||||
// Reset engine state | // Reset engine state | ||||
internal->nextModuleId = 0; | internal->nextModuleId = 0; | ||||
@@ -185,13 +185,11 @@ int main(int argc, char* argv[]) { | |||||
} | } | ||||
#endif | #endif | ||||
if (!settings::headless) { | |||||
APP->patch->init(patchPath); | |||||
} | |||||
APP->patch->init(patchPath); | |||||
if (settings::headless) { | if (settings::headless) { | ||||
// TEMP Prove that the app doesn't crash | |||||
std::this_thread::sleep_for(std::chrono::seconds(2)); | |||||
printf("Press enter to exit.\n"); | |||||
getchar(); | |||||
} | } | ||||
else if (screenshot) { | else if (screenshot) { | ||||
INFO("Taking screenshots of all modules at %gx zoom", screenshotZoom); | INFO("Taking screenshots of all modules at %gx zoom", screenshotZoom); | ||||
@@ -209,7 +207,9 @@ int main(int argc, char* argv[]) { | |||||
} | } | ||||
INFO("Destroying app"); | INFO("Destroying app"); | ||||
appDestroy(); | appDestroy(); | ||||
settings::save(asset::settingsPath); | |||||
if (!settings::headless) { | |||||
settings::save(asset::settingsPath); | |||||
} | |||||
// Destroy environment | // Destroy environment | ||||
INFO("Destroying environment"); | INFO("Destroying environment"); | ||||
@@ -55,9 +55,11 @@ void PatchManager::init(std::string path) { | |||||
} | } | ||||
void PatchManager::reset() { | void PatchManager::reset() { | ||||
APP->history->clear(); | |||||
APP->scene->rack->clear(); | |||||
APP->scene->rackScroll->reset(); | |||||
if (!settings::headless) { | |||||
APP->history->clear(); | |||||
APP->scene->rack->clear(); | |||||
APP->scene->rackScroll->reset(); | |||||
} | |||||
APP->engine->clear(); | APP->engine->clear(); | ||||
path = ""; | path = ""; | ||||
@@ -183,9 +185,11 @@ bool PatchManager::load(std::string path) { | |||||
json_decref(rootJ); | json_decref(rootJ); | ||||
}); | }); | ||||
APP->history->clear(); | |||||
APP->scene->rack->clear(); | |||||
APP->scene->rackScroll->reset(); | |||||
if (!settings::headless) { | |||||
APP->history->clear(); | |||||
APP->scene->rack->clear(); | |||||
APP->scene->rackScroll->reset(); | |||||
} | |||||
APP->engine->clear(); | APP->engine->clear(); | ||||
fromJson(rootJ); | fromJson(rootJ); | ||||
return true; | return true; | ||||
@@ -255,7 +259,9 @@ json_t* PatchManager::toJson() { | |||||
json_object_set_new(rootJ, "version", versionJ); | json_object_set_new(rootJ, "version", versionJ); | ||||
json_t* engineJ = APP->engine->toJson(); | json_t* engineJ = APP->engine->toJson(); | ||||
APP->scene->rack->mergeJson(engineJ); | |||||
if (!settings::headless) { | |||||
APP->scene->rack->mergeJson(engineJ); | |||||
} | |||||
// Merge with rootJ | // Merge with rootJ | ||||
json_object_update(rootJ, engineJ); | json_object_update(rootJ, engineJ); | ||||
@@ -289,7 +295,9 @@ void PatchManager::fromJson(json_t* rootJ) { | |||||
} | } | ||||
APP->engine->fromJson(rootJ); | APP->engine->fromJson(rootJ); | ||||
APP->scene->rack->fromJson(rootJ); | |||||
if (!settings::headless) { | |||||
APP->scene->rack->fromJson(rootJ); | |||||
} | |||||
// At this point, ModuleWidgets and CableWidgets should own all Modules and Cables. | // At this point, ModuleWidgets and CableWidgets should own all Modules and Cables. | ||||
// TODO Assert this | // TODO Assert this | ||||
@@ -81,9 +81,8 @@ json_t* toJson() { | |||||
json_object_set_new(rootJ, "autosavePeriod", json_real(autosavePeriod)); | json_object_set_new(rootJ, "autosavePeriod", json_real(autosavePeriod)); | ||||
if (skipLoadOnLaunch) { | |||||
json_object_set_new(rootJ, "skipLoadOnLaunch", json_true()); | |||||
} | |||||
if (skipLoadOnLaunch) | |||||
json_object_set_new(rootJ, "skipLoadOnLaunch", json_boolean(true)); | |||||
json_object_set_new(rootJ, "patchPath", json_string(patchPath.c_str())); | json_object_set_new(rootJ, "patchPath", json_string(patchPath.c_str())); | ||||