![]() |
Mixxx
|
00001 #include <QtCore> 00002 #include <QtXml> 00003 #include "mixxxcontrol.h" 00004 00006 MixxxControl::MixxxControl(QString controlobject_group, QString controlobject_value, 00007 QString controlobject_description, MidiOption midioption) 00008 { 00009 m_strCOGroup = controlobject_group; 00010 m_strCOValue = controlobject_value; 00011 m_strCODescription = controlobject_description; 00012 m_midiOption = midioption; 00013 00014 m_thresholdMinimum = 0.0f; 00015 m_thresholdMaximum = 1.0f; 00016 } 00017 00021 MixxxControl::MixxxControl(QDomElement& parentNode, bool isOutputNode) 00022 { 00023 QDomElement groupNode = parentNode.firstChildElement("group"); 00024 QDomElement keyNode = parentNode.firstChildElement("key"); 00025 QDomElement descriptionNode = parentNode.firstChildElement("description"); 00026 00027 m_strCOGroup = groupNode.text(); 00028 m_strCOValue = keyNode.text(); 00029 m_strCODescription = descriptionNode.text(); 00030 00031 QDomElement optionsNode = parentNode.firstChildElement("options"); 00032 00033 // At the moment, use one element, in future iterate through options 00034 QString strMidiOption; 00035 if (optionsNode.hasChildNodes()) { 00036 strMidiOption = optionsNode.firstChild().nodeName().toLower(); 00037 } else { 00038 strMidiOption = "normal"; 00039 } 00040 00041 if (strMidiOption == "normal") // can't switch() on a string 00042 m_midiOption = MIDI_OPT_NORMAL; 00043 else if (strMidiOption == "invert") 00044 m_midiOption = MIDI_OPT_INVERT; 00045 else if (strMidiOption == "rot64") 00046 m_midiOption = MIDI_OPT_ROT64; 00047 else if (strMidiOption == "rot64inv") 00048 m_midiOption = MIDI_OPT_ROT64_INV; 00049 else if (strMidiOption == "rot64fast") 00050 m_midiOption = MIDI_OPT_ROT64_FAST; 00051 else if (strMidiOption == "diff") 00052 m_midiOption = MIDI_OPT_DIFF; 00053 else if (strMidiOption == "button") 00054 m_midiOption = MIDI_OPT_BUTTON; 00055 else if (strMidiOption == "switch") 00056 m_midiOption = MIDI_OPT_SWITCH; 00057 else if (strMidiOption == "hercjog") 00058 m_midiOption = MIDI_OPT_HERC_JOG; 00059 else if (strMidiOption == "spread64") 00060 m_midiOption = MIDI_OPT_SPREAD64; 00061 else if (strMidiOption == "selectknob") 00062 m_midiOption = MIDI_OPT_SELECTKNOB; 00063 else if (strMidiOption == "soft-takeover") 00064 m_midiOption = MIDI_OPT_SOFT_TAKEOVER; 00065 else if (strMidiOption == "script-binding") 00066 m_midiOption = MIDI_OPT_SCRIPT; 00067 else { 00068 m_midiOption = MIDI_OPT_NORMAL; 00069 qWarning() << "Unknown midioption" << strMidiOption << "in" << __FILE__; 00070 } 00071 00072 //Parse threshold stuff, only used for output. 00073 if (isOutputNode) { 00074 00075 //TODO: Parse threshold stuff 00076 QDomElement minNode = parentNode.firstChildElement("minimum"); 00077 QDomElement maxNode = parentNode.firstChildElement("maximum"); 00078 00079 bool ok = false; 00080 if (!minNode.isNull()) { 00081 m_thresholdMinimum = minNode.text().toFloat(&ok); 00082 } else { 00083 ok = false; 00084 } 00085 00086 if (!ok) //If not a float, or node wasn't defined 00087 m_thresholdMinimum = 0.0f; 00088 00089 if (!maxNode.isNull()) { 00090 m_thresholdMaximum = maxNode.text().toFloat(&ok); 00091 } else { 00092 ok = false; 00093 } 00094 00095 if (!ok) //If not a float, or node wasn't defined 00096 m_thresholdMaximum = 1.0f; 00097 } 00098 } 00099 00100 void MixxxControl::serializeToXML(QDomElement& parentNode, bool isOutputNode) const 00101 { 00102 QDomText text; 00103 QDomDocument nodeMaker; 00104 QDomElement tagNode; 00105 00106 //Control object group 00107 tagNode = nodeMaker.createElement("group"); 00108 text = nodeMaker.createTextNode(this->getControlObjectGroup()); 00109 tagNode.appendChild(text); 00110 parentNode.appendChild(tagNode); 00111 00112 //Control object value 00113 tagNode = nodeMaker.createElement("key"); //WTF worst name ever 00114 text = nodeMaker.createTextNode(this->getControlObjectValue()); 00115 tagNode.appendChild(text); 00116 parentNode.appendChild(tagNode); 00117 00118 //Control object description 00119 tagNode = nodeMaker.createElement("description"); 00120 text = nodeMaker.createTextNode(this->getControlObjectDescription()); 00121 tagNode.appendChild(text); 00122 parentNode.appendChild(tagNode); 00123 00124 //Midi option (slightly different format) 00125 QDomElement optionsNode = nodeMaker.createElement("options"); 00126 QString strMidiOption; 00127 int iMidiOption = this->getMidiOption(); 00128 if (iMidiOption == MIDI_OPT_NORMAL) // can't switch() on a string 00129 strMidiOption = "normal"; 00130 else if (iMidiOption == MIDI_OPT_INVERT) 00131 strMidiOption = "invert"; 00132 else if (iMidiOption == MIDI_OPT_ROT64) 00133 strMidiOption = "rot64"; 00134 else if (iMidiOption == MIDI_OPT_ROT64_INV) 00135 strMidiOption = "rot64inv"; 00136 else if (iMidiOption == MIDI_OPT_ROT64_FAST) 00137 strMidiOption = "rot64fast"; 00138 else if (iMidiOption == MIDI_OPT_DIFF) 00139 strMidiOption = "diff"; 00140 else if (iMidiOption == MIDI_OPT_BUTTON) 00141 strMidiOption = "button"; 00142 else if (iMidiOption == MIDI_OPT_SWITCH) 00143 strMidiOption = "switch"; 00144 else if (iMidiOption == MIDI_OPT_HERC_JOG) 00145 strMidiOption = "hercjog"; 00146 else if (iMidiOption == MIDI_OPT_SPREAD64) 00147 strMidiOption = "spread64"; 00148 else if (iMidiOption == MIDI_OPT_SELECTKNOB) 00149 strMidiOption = "selectknob"; 00150 else if (iMidiOption == MIDI_OPT_SOFT_TAKEOVER) 00151 strMidiOption = "soft-takeover"; 00152 else if (iMidiOption == MIDI_OPT_SCRIPT) 00153 strMidiOption = "script-binding"; 00154 else { 00155 strMidiOption = "Unknown"; 00156 qWarning() << "Unknown midioption in" << __FILE__; 00157 } 00158 00159 QDomElement singleOption = nodeMaker.createElement(strMidiOption); 00160 optionsNode.appendChild(singleOption); 00161 parentNode.appendChild(optionsNode); 00162 00163 //If we're writing to an <output> block, write our threshold params 00164 if (isOutputNode) 00165 { 00166 //TODO: Write threshold blocks 00167 tagNode = nodeMaker.createElement("minimum"); 00168 text = nodeMaker.createTextNode(QString("%1").arg(this->getThresholdMinimum())); 00169 tagNode.appendChild(text); 00170 parentNode.appendChild(tagNode); 00171 00172 tagNode = nodeMaker.createElement("maximum"); 00173 text = nodeMaker.createTextNode(QString("%1").arg(this->getThresholdMaximum())); 00174 tagNode.appendChild(text); 00175 parentNode.appendChild(tagNode); 00176 } 00177 } 00178 00179 00180 uint qHash(const MixxxControl& key) 00181 { 00182 return (qHash(key.getControlObjectGroup() + key.getControlObjectValue())); 00183 }