parameterlocking.cpp (3239B)
1 #include "parameterlocking.h" 2 3 #include <cassert> 4 5 #include "controller.h" 6 7 namespace pluginLib 8 { 9 ParameterLocking::ParameterLocking(Controller& _controller) : m_controller(_controller) 10 { 11 } 12 13 bool ParameterLocking::lockRegion(const uint8_t _part, const std::string& _id) 14 { 15 auto& lockedRegions = getLockedRegions(_part); 16 17 if(lockedRegions.find(_id) != lockedRegions.end()) 18 return true; 19 20 auto& regions = m_controller.getParameterDescriptions().getRegions(); 21 22 const auto it = regions.find(_id); 23 24 if(it == regions.end()) 25 return false; 26 27 lockedRegions.insert(_id); 28 29 setParametersLocked(it->second, _part, true); 30 31 return true; 32 } 33 34 bool ParameterLocking::unlockRegion(const uint8_t _part, const std::string& _id) 35 { 36 auto& lockedRegions = getLockedRegions(_part); 37 38 if(!lockedRegions.erase(_id)) 39 return false; 40 41 auto& regions = m_controller.getParameterDescriptions().getRegions(); 42 43 const auto it = regions.find(_id); 44 45 if(it == regions.end()) 46 return false; 47 48 lockedRegions.erase(_id); 49 50 setParametersLocked(it->second, _part, false); 51 52 return true; 53 } 54 55 const std::set<std::string>& ParameterLocking::getLockedRegions(const uint8_t _part) const 56 { 57 return m_lockedRegions[_part]; 58 } 59 60 bool ParameterLocking::isRegionLocked(const uint8_t _part, const std::string& _id) 61 { 62 return m_lockedRegions[_part].find(_id) != m_lockedRegions[_part].end(); 63 } 64 65 std::unordered_set<std::string> ParameterLocking::getLockedParameterNames(const uint8_t _part) const 66 { 67 if(m_lockedRegions[_part].empty()) 68 return {}; 69 70 std::unordered_set<std::string> result; 71 72 auto& regions = m_controller.getParameterDescriptions().getRegions(); 73 74 for (const auto& name : m_lockedRegions[_part]) 75 { 76 const auto& it = regions.find(name); 77 if(it == regions.end()) 78 continue; 79 80 const auto& region = it->second; 81 for (const auto& itParam : region.getParams()) 82 result.insert(itParam.first); 83 } 84 85 return result; 86 } 87 88 std::unordered_set<const Parameter*> ParameterLocking::getLockedParameters(const uint8_t _part) const 89 { 90 const auto paramNames = getLockedParameterNames(_part); 91 92 std::unordered_set<const Parameter*> results; 93 94 for (const auto& paramName : paramNames) 95 { 96 const auto* p = m_controller.getParameter(paramName, _part); 97 assert(p != nullptr); 98 results.insert(p); 99 } 100 101 return results; 102 } 103 104 bool ParameterLocking::isParameterLocked(const uint8_t _part, const std::string& _name) const 105 { 106 auto& regions = m_controller.getParameterDescriptions().getRegions(); 107 108 const auto& lockedRegions = getLockedRegions(_part); 109 110 for (const auto& region : lockedRegions) 111 { 112 const auto& it = regions.find(region); 113 if(it == regions.end()) 114 continue; 115 116 if(it->second.containsParameter(_name)) 117 return true; 118 } 119 return false; 120 } 121 122 void ParameterLocking::setParametersLocked(const ParameterRegion& _parameterRegion, const uint8_t _part, const bool _locked) const 123 { 124 for (const auto& param : _parameterRegion.getParams()) 125 { 126 // if a region is unlocked but other regions still lock the same parameter, do nothing 127 if(!_locked && isParameterLocked(_part, param.first)) 128 continue; 129 130 if(auto* p = m_controller.getParameter(param.first, _part)) 131 p->setLocked(_locked); 132 } 133 } 134 }