Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/controlvaluedelegate.cpp

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines