![]() |
Mixxx
|
00001 /* 00002 * controlvaluedelegate.cpp 00003 * 00004 * Created on: 18-Mar-2009 00005 * Author: Albert Santoni 00006 */ 00007 00008 #include <QtCore> 00009 #include <QtGui> 00010 #include "configobject.h" 00011 #include "controlgroupdelegate.h" //Need to get CONTROLGROUP_CHANNEL1_STRING, etc. 00012 #include "controlvaluedelegate.h" 00013 #include "midi/midiinputmappingtablemodel.h" //Need this to know MIDIINPUTTABLEINDEX_CONTROLOBJECTGROUP 00014 00015 //Static var declarations 00016 QStringList ControlValueDelegate::m_channelControlValues; 00017 QStringList ControlValueDelegate::m_masterControlValues; 00018 QStringList ControlValueDelegate::m_playlistControlValues; 00019 QStringList ControlValueDelegate::m_flangerControlValues; 00020 QStringList ControlValueDelegate::m_microphoneControlValues; 00021 00022 00023 ControlValueDelegate::ControlValueDelegate(QObject *parent) 00024 : QItemDelegate(parent) 00025 { 00026 if (m_channelControlValues.isEmpty()) //List is static/shared across all objects, so only fill once. 00027 { 00028 m_channelControlValues.append("beatsync"); 00029 m_channelControlValues.append("cue_default"); 00030 m_channelControlValues.append("filterHigh"); 00031 m_channelControlValues.append("filterHighKill"); 00032 m_channelControlValues.append("filterLow"); 00033 m_channelControlValues.append("filterLowKill"); 00034 m_channelControlValues.append("filterMid"); 00035 m_channelControlValues.append("filterMidKill"); 00036 m_channelControlValues.append("flanger"); 00037 m_channelControlValues.append("keylock"); 00038 m_channelControlValues.append("LoadSelectedTrack"); 00039 m_channelControlValues.append("NextTrack"); 00040 m_channelControlValues.append("pfl"); 00041 m_channelControlValues.append("play"); 00042 m_channelControlValues.append("fwd"); 00043 m_channelControlValues.append("back"); 00044 m_channelControlValues.append("reverse"); 00045 m_channelControlValues.append("playposition"); 00046 m_channelControlValues.append("pregain"); 00047 m_channelControlValues.append("PrevTrack"); 00048 m_channelControlValues.append("rate"); 00049 m_channelControlValues.append("rate_perm_down_small"); 00050 m_channelControlValues.append("rate_perm_up_small"); 00051 m_channelControlValues.append("rate_perm_down"); 00052 m_channelControlValues.append("rate_perm_up"); 00053 m_channelControlValues.append("rate_temp_down"); 00054 m_channelControlValues.append("rate_temp_up"); 00055 m_channelControlValues.append("rateRange"); 00056 m_channelControlValues.append("scratch"); 00057 m_channelControlValues.append("scratch_enable"); 00058 m_channelControlValues.append("volume"); 00059 m_channelControlValues.append("wheel"); 00060 m_channelControlValues.append("jog"); 00061 m_channelControlValues.append("vinylcontrol_enabled"); 00062 m_channelControlValues.append("vinylcontrol_mode"); 00063 m_channelControlValues.append("vinylcontrol_cueing"); 00064 m_channelControlValues.append("loop_in"); 00065 m_channelControlValues.append("loop_out"); 00066 m_channelControlValues.append("reloop_exit"); 00067 m_channelControlValues.append("beatloop_4"); 00068 m_channelControlValues.append("loop_halve"); 00069 m_channelControlValues.append("loop_double"); 00070 m_channelControlValues.append("hotcue_1_activate"); 00071 m_channelControlValues.append("hotcue_2_activate"); 00072 m_channelControlValues.append("hotcue_3_activate"); 00073 m_channelControlValues.append("hotcue_4_activate"); 00074 m_channelControlValues.append("hotcue_5_activate"); 00075 m_channelControlValues.append("hotcue_6_activate"); 00076 m_channelControlValues.append("hotcue_7_activate"); 00077 m_channelControlValues.append("hotcue_8_activate"); 00078 m_channelControlValues.append("hotcue_9_activate"); 00079 m_channelControlValues.append("hotcue_10_activate"); 00080 m_channelControlValues.append("hotcue_11_activate"); 00081 m_channelControlValues.append("hotcue_12_activate"); 00082 m_channelControlValues.append("hotcue_13_activate"); 00083 m_channelControlValues.append("hotcue_14_activate"); 00084 m_channelControlValues.append("hotcue_15_activate"); 00085 m_channelControlValues.append("hotcue_16_activate"); 00086 m_channelControlValues.append("hotcue_17_activate"); 00087 m_channelControlValues.append("hotcue_18_activate"); 00088 m_channelControlValues.append("hotcue_19_activate"); 00089 m_channelControlValues.append("hotcue_20_activate"); 00090 m_channelControlValues.append("hotcue_21_activate"); 00091 m_channelControlValues.append("hotcue_22_activate"); 00092 m_channelControlValues.append("hotcue_23_activate"); 00093 m_channelControlValues.append("hotcue_24_activate"); 00094 m_channelControlValues.append("hotcue_25_activate"); 00095 m_channelControlValues.append("hotcue_26_activate"); 00096 m_channelControlValues.append("hotcue_27_activate"); 00097 m_channelControlValues.append("hotcue_28_activate"); 00098 m_channelControlValues.append("hotcue_29_activate"); 00099 m_channelControlValues.append("hotcue_30_activate"); 00100 m_channelControlValues.append("hotcue_31_activate"); 00101 m_channelControlValues.append("hotcue_32_activate"); 00102 m_channelControlValues.append("hotcue_33_activate"); 00103 m_channelControlValues.append("hotcue_34_activate"); 00104 m_channelControlValues.append("hotcue_35_activate"); 00105 m_channelControlValues.append("hotcue_36_activate"); 00106 m_channelControlValues.append("hotcue_1_clear"); 00107 m_channelControlValues.append("hotcue_2_clear"); 00108 m_channelControlValues.append("hotcue_3_clear"); 00109 m_channelControlValues.append("hotcue_4_clear"); 00110 m_channelControlValues.append("hotcue_5_clear"); 00111 m_channelControlValues.append("hotcue_6_clear"); 00112 m_channelControlValues.append("hotcue_7_clear"); 00113 m_channelControlValues.append("hotcue_8_clear"); 00114 m_channelControlValues.append("hotcue_9_clear"); 00115 m_channelControlValues.append("hotcue_10_clear"); 00116 m_channelControlValues.append("hotcue_11_clear"); 00117 m_channelControlValues.append("hotcue_12_clear"); 00118 m_channelControlValues.append("hotcue_13_clear"); 00119 m_channelControlValues.append("hotcue_14_clear"); 00120 m_channelControlValues.append("hotcue_15_clear"); 00121 m_channelControlValues.append("hotcue_16_clear"); 00122 m_channelControlValues.append("hotcue_17_clear"); 00123 m_channelControlValues.append("hotcue_18_clear"); 00124 m_channelControlValues.append("hotcue_19_clear"); 00125 m_channelControlValues.append("hotcue_20_clear"); 00126 m_channelControlValues.append("hotcue_21_clear"); 00127 m_channelControlValues.append("hotcue_22_clear"); 00128 m_channelControlValues.append("hotcue_23_clear"); 00129 m_channelControlValues.append("hotcue_24_clear"); 00130 m_channelControlValues.append("hotcue_25_clear"); 00131 m_channelControlValues.append("hotcue_26_clear"); 00132 m_channelControlValues.append("hotcue_27_clear"); 00133 m_channelControlValues.append("hotcue_28_clear"); 00134 m_channelControlValues.append("hotcue_29_clear"); 00135 m_channelControlValues.append("hotcue_30_clear"); 00136 m_channelControlValues.append("hotcue_31_clear"); 00137 m_channelControlValues.append("hotcue_32_clear"); 00138 m_channelControlValues.append("hotcue_33_clear"); 00139 m_channelControlValues.append("hotcue_34_clear"); 00140 m_channelControlValues.append("hotcue_35_clear"); 00141 m_channelControlValues.append("hotcue_36_clear"); 00142 } 00143 if (m_masterControlValues.isEmpty()) 00144 { 00145 m_masterControlValues.append("balance"); 00146 m_masterControlValues.append("crossfader"); 00147 m_masterControlValues.append("volume"); 00148 } 00149 if (m_playlistControlValues.isEmpty()) 00150 { 00151 m_playlistControlValues.append("LoadSelectedIntoFirstStopped"); 00152 m_playlistControlValues.append("SelectNextPlaylist"); 00153 m_playlistControlValues.append("SelectNextTrack"); 00154 m_playlistControlValues.append("SelectPrevPlaylist"); 00155 m_playlistControlValues.append("SelectPrevTrack"); 00156 m_playlistControlValues.append("SelectTrackKnob"); 00157 } 00158 if (m_flangerControlValues.isEmpty()) 00159 { 00160 m_flangerControlValues.append("lfoPeriod"); 00161 m_flangerControlValues.append("lfoDepth"); 00162 m_flangerControlValues.append("lfoDelay"); 00163 } 00164 if (m_microphoneControlValues.isEmpty()) 00165 { 00166 m_microphoneControlValues.append("talkover"); 00167 m_microphoneControlValues.append("volume"); 00168 } 00169 } 00170 00171 void ControlValueDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, 00172 const QModelIndex &index) const 00173 { 00174 if (index.data().canConvert<QString>()) { 00175 QString value = index.data().value<QString>(); 00176 00177 if (option.state & QStyle::State_Selected) 00178 painter->fillRect(option.rect, option.palette.highlight()); 00179 00180 //starRating.paint(painter, option.rect, option.palette, 00181 // StarRating::ReadOnly); 00182 00183 QString text; 00184 text = value; 00185 00186 painter->drawText(option.rect, text, QTextOption(Qt::AlignCenter)); 00187 //Note that Qt::AlignCenter does both vertical and horizontal alignment. 00188 } else { 00189 QItemDelegate::paint(painter, option, index); 00190 } 00191 } 00192 00193 QWidget *ControlValueDelegate::createEditor(QWidget *parent, 00194 const QStyleOptionViewItem &/* option */, 00195 const QModelIndex &index ) const 00196 { 00197 //TODO: Use index to grab the value of the ControlGroup column next to 00198 // this item. We want to do this because some of the possible 00199 // ControlValues only apply to Channel1/2, and not Master (for example). 00200 00201 QModelIndex nextDoor = index.sibling(index.row(), MIDIINPUTTABLEINDEX_CONTROLOBJECTGROUP); 00202 QString controlGroup = nextDoor.model()->data(nextDoor, Qt::EditRole).toString(); 00203 00204 QComboBox *editor = new QComboBox(parent); 00205 00206 if (controlGroup == CONTROLGROUP_CHANNEL1_STRING || 00207 controlGroup == CONTROLGROUP_CHANNEL2_STRING || 00208 controlGroup == CONTROLGROUP_SAMPLER1_STRING || 00209 controlGroup == CONTROLGROUP_SAMPLER2_STRING || 00210 controlGroup == CONTROLGROUP_SAMPLER3_STRING || 00211 controlGroup == CONTROLGROUP_SAMPLER4_STRING) 00212 { 00213 //Add all the channel 1/2 items) 00214 editor->addItems(m_channelControlValues); 00215 } 00216 else if (controlGroup == CONTROLGROUP_MASTER_STRING) 00217 { 00218 //Add all the ControlObject values that only [Master] has. 00219 editor->addItems(m_masterControlValues); 00220 } 00221 else if (controlGroup == CONTROLGROUP_PLAYLIST_STRING) 00222 { 00223 //Add all the ControlObject values that only [Playlist] has. 00224 editor->addItems(m_playlistControlValues); 00225 } 00226 else if (controlGroup == CONTROLGROUP_FLANGER_STRING) 00227 { 00228 //Add all the ControlObject values that only [Flanger] has. 00229 editor->addItems(m_flangerControlValues); 00230 } 00231 else if (controlGroup == CONTROLGROUP_MICROPHONE_STRING) 00232 { 00233 //Add all the ControlObject values that only [Microphone] has. 00234 editor->addItems(m_microphoneControlValues); 00235 } 00236 return editor; 00237 } 00238 00239 void ControlValueDelegate::setEditorData(QWidget *editor, 00240 const QModelIndex &index) const 00241 { 00242 QString value = index.model()->data(index, Qt::EditRole).toString(); 00243 00244 QComboBox *comboBox = static_cast<QComboBox*>(editor); 00245 comboBox->setCurrentIndex(comboBox->findText(value)); 00246 } 00247 00248 void ControlValueDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, 00249 const QModelIndex &index) const 00250 { 00251 QString midiType = 0; 00252 QComboBox *comboBox = static_cast<QComboBox*>(editor); 00253 //comboBox->interpretText(); 00254 00255 //Get the text from the combobox and shoot it into the data model. 00256 QString text = comboBox->currentText(); 00257 00258 model->setData(index, text, Qt::EditRole); 00259 } 00260 00261 void ControlValueDelegate::updateEditorGeometry(QWidget *editor, 00262 const QStyleOptionViewItem &option, 00263 const QModelIndex &/* index */) const 00264 { 00265 editor->setGeometry(option.rect); 00266 } 00267 00274 bool ControlValueDelegate::verifyControlValueValidity(QString controlGroup, QAbstractItemModel *model, 00275 const QModelIndex& index) 00276 { 00277 QString value = index.data().value<QString>(); 00278 00279 if (controlGroup == CONTROLGROUP_CHANNEL1_STRING || 00280 controlGroup == CONTROLGROUP_CHANNEL2_STRING || 00281 controlGroup == CONTROLGROUP_SAMPLER1_STRING || 00282 controlGroup == CONTROLGROUP_SAMPLER2_STRING || 00283 controlGroup == CONTROLGROUP_SAMPLER3_STRING || 00284 controlGroup == CONTROLGROUP_SAMPLER4_STRING) 00285 { 00286 if (m_channelControlValues.contains(value)) 00287 return true; 00288 } 00289 else if (controlGroup == CONTROLGROUP_MASTER_STRING) 00290 { 00291 if (m_masterControlValues.contains(value)) 00292 return true; 00293 } 00294 else if (controlGroup == CONTROLGROUP_PLAYLIST_STRING) 00295 { 00296 if (m_playlistControlValues.contains(value)) 00297 return true; 00298 } 00299 else if (controlGroup == CONTROLGROUP_FLANGER_STRING) 00300 { 00301 if (m_flangerControlValues.contains(value)) 00302 return true; 00303 } 00304 else if (controlGroup == CONTROLGROUP_MICROPHONE_STRING) 00305 { 00306 if (m_microphoneControlValues.contains(value)) 00307 return true; 00308 } 00309 else 00310 { 00311 qDebug() << "Unknown ControlGroup in " << __FILE__; 00312 } 00313 00314 //If we got this far, it means the ControlValue wasn't valid for the new ControlGroup, 00315 //so we should clear the ControlValue. 00316 model->setData(index, "", Qt::EditRole); 00317 00318 return false; 00319 }