diff --git a/Keishiki/UI.cpp b/Keishiki/UI.cpp index d59637e..4474e62 100644 --- a/Keishiki/UI.cpp +++ b/Keishiki/UI.cpp @@ -2051,6 +2051,56 @@ namespace K::UI { delete_requests[K_DR_Selected_Compositions] = false; } + if (delete_requests[K_DR_Make_Subcomposition]) { + auto itt = app_state.project.compositions.emplace(); + CompositionState& new_comp = *itt; + new_comp.name = "subcomp"; + new_comp.fps = s.fps; + new_comp.width = s.width; + new_comp.height = s.height; + new_comp.Setup(); + u32 index_in_new_comp = 0; + u64 frame_min = -1, frame_max = 0; + for (auto& j : s.selected) { + new_comp.layers.push_back(s.layers[j]); + for (auto& u : new_comp.layers.back().track.uniforms) + if (u.status & K_U_Exposed) { + VisualTrack::ExposeUniform(new_comp, u); + } + if (std::ranges::find(s.disabled, j) != s.disabled.end()) + new_comp.disabled.push_back(index_in_new_comp); + frame_min = std::min(frame_min, s.layers[j].in); + frame_max = std::max(frame_max, s.layers[j].out); + index_in_new_comp++; + } + new_comp.frame_max = frame_max - frame_min; + for (auto& layer : new_comp.layers) + layer.in -= frame_min; + + if (std::ranges::find(s.selected, s.active) != s.selected.end()) // unset active if active is selected + s.active = -1; + u32 deleted = 0, before_active = 0; // stupid counting tricks + const u32 sz = s.layers.size(); + for (u32 j = 0; j < sz; j++) { // im sure this isn't the best way to go about this + if (std::ranges::find(s.selected, j) != s.selected.end()) { + for (auto &u: s.layers[j - deleted].track.uniforms) + VisualTrack::HideUniform(s, u); + s.layers.erase(s.layers.begin() + j - deleted); + std::erase(s.disabled, j); + if (static_cast(j) < s.active) + before_active++; + deleted++; + } + else if (auto it = std::ranges::find(s.disabled, j); it != s.disabled.end()) + *it -= deleted; + } + s.selected.clear(); + if (s.active != -1) + s.active -= static_cast(before_active); + + delete_requests[K_DR_Make_Subcomposition] = false; + } + if (delete_requests[K_DR_Selected_Layers]) { if (std::ranges::find(s.selected, s.active) != s.selected.end()) // unset active if active is selected s.active = -1; @@ -2077,55 +2127,6 @@ namespace K::UI { delete_requests[K_DR_Selected_Layers] = false; } - if (delete_requests[K_DR_Make_Subcomposition]) { - auto itt = app_state.project.compositions.emplace(); - CompositionState& new_comp = *itt; - new_comp.name = "subcomp"; - new_comp.fps = s.fps; - new_comp.width = s.width; - new_comp.height = s.height; - new_comp.Setup(); - u32 index_in_new_comp = 0; - u64 frame_min = -1, frame_max = 0; - for (auto& j : s.selected) { - for (auto& u : s.layers[j].track.uniforms) - if (u.status & K_U_Exposed) { - VisualTrack::HideUniform(s, u); // fixme - VisualTrack::ExposeUniform(new_comp, u); - } - new_comp.layers.push_back(std::move(s.layers[j])); - if (std::ranges::find(s.disabled, j) != s.disabled.end()) - new_comp.disabled.push_back(index_in_new_comp); - frame_min = std::min(frame_min, s.layers[j].in); - frame_max = std::max(frame_max, s.layers[j].out); - index_in_new_comp++; - } - new_comp.frame_max = frame_max - frame_min; - for (auto& layer : new_comp.layers) - layer.in -= frame_min; - - if (std::ranges::find(s.selected, s.active) != s.selected.end()) // unset active if active is selected - s.active = -1; - u32 deleted = 0, before_active = 0; // stupid counting tricks - const u32 sz = s.layers.size(); - for (u32 j = 0; j < sz; j++) { // im sure this isn't the best way to go about this - if (std::ranges::find(s.selected, j) != s.selected.end()) { - s.layers.erase(s.layers.begin() + j - deleted); - std::erase(s.disabled, j); - if (static_cast(j) < s.active) - before_active++; - deleted++; - } - else if (auto it = std::ranges::find(s.disabled, j); it != s.disabled.end()) - *it -= deleted; - } - s.selected.clear(); - if (s.active != -1) - s.active -= static_cast(before_active); - - delete_requests[K_DR_Make_Subcomposition] = false; - } - if (delete_requests[K_DR_Selected_Nodes]) { for (auto p: s.plugboard.selected_nodes) { std::visit([&s](auto &&arg) {