/[svn]/qsampler/trunk/src/qsamplerChannelStrip.cpp
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerChannelStrip.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2074 by capela, Mon Mar 29 17:00:30 2010 UTC revision 3518 by capela, Sun Jun 30 16:58:30 2019 UTC
# Line 1  Line 1 
1  // qsamplerChannelStrip.cpp  // qsamplerChannelStrip.cpp
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2004-2010, rncbc aka Rui Nuno Capela. All rights reserved.     Copyright (C) 2004-2019, rncbc aka Rui Nuno Capela. All rights reserved.
5     Copyright (C) 2007, 2008 Christian Schoenebeck     Copyright (C) 2007, 2008, 2014 Christian Schoenebeck
6    
7     This program is free software; you can redistribute it and/or     This program is free software; you can redistribute it and/or
8     modify it under the terms of the GNU General Public License     modify it under the terms of the GNU General Public License
# Line 29  Line 29 
29    
30  #include <QMessageBox>  #include <QMessageBox>
31  #include <QDragEnterEvent>  #include <QDragEnterEvent>
32    #include <QFileInfo>
33  #include <QTimer>  #include <QTimer>
34  #include <QUrl>  #include <QUrl>
35    #include <QMenu>
36    
37    #if QT_VERSION >= 0x050000
38    #include <QMimeData>
39    #endif
40    
41  // Channel status/usage usage limit control.  // Channel status/usage usage limit control.
42  #define QSAMPLER_ERROR_LIMIT    3  #define QSAMPLER_ERROR_LIMIT    3
# Line 73  ChannelStrip::ChannelStrip ( QWidget* pP Line 78  ChannelStrip::ChannelStrip ( QWidget* pP
78          m_pChannel     = NULL;          m_pChannel     = NULL;
79          m_iDirtyChange = 0;          m_iDirtyChange = 0;
80          m_iErrorCount  = 0;          m_iErrorCount  = 0;
81            m_instrumentListPopupMenu = NULL;
82    
83          if (++g_iMidiActivityRefCount == 1) {          if (++g_iMidiActivityRefCount == 1) {
84                  g_pMidiActivityLedOn  = new QPixmap(":/images/ledon1.png");                  g_pMidiActivityLedOn  = new QPixmap(":/images/ledon1.png");
# Line 105  ChannelStrip::ChannelStrip ( QWidget* pP Line 111  ChannelStrip::ChannelStrip ( QWidget* pP
111          QObject::connect(m_ui.ChannelSoloPushButton,          QObject::connect(m_ui.ChannelSoloPushButton,
112                  SIGNAL(toggled(bool)),                  SIGNAL(toggled(bool)),
113                  SLOT(channelSolo(bool)));                  SLOT(channelSolo(bool)));
114          QObject::connect(m_ui.VolumeSlider,          QObject::connect(m_ui.ChannelVolumeSlider,
115                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
116                  SLOT(volumeChanged(int)));                  SLOT(volumeChanged(int)));
117          QObject::connect(m_ui.VolumeSpinBox,          QObject::connect(m_ui.ChannelVolumeSpinBox,
118                  SIGNAL(valueChanged(int)),                  SIGNAL(valueChanged(int)),
119                  SLOT(volumeChanged(int)));                  SLOT(volumeChanged(int)));
120          QObject::connect(m_ui.ChannelEditPushButton,          QObject::connect(m_ui.ChannelEditPushButton,
121                  SIGNAL(clicked()),                  SIGNAL(clicked()),
122                  SLOT(channelEdit()));                  SLOT(channelEdit()));
123          QObject::connect(m_ui.FxPushButton,          QObject::connect(m_ui.ChannelFxPushButton,
124                  SIGNAL(clicked()),                  SIGNAL(clicked()),
125                  SLOT(channelFxEdit()));                  SLOT(channelFxEdit()));
126    
# Line 157  void ChannelStrip::dragEnterEvent ( QDra Line 163  void ChannelStrip::dragEnterEvent ( QDra
163                          while (iter.hasNext()) {                          while (iter.hasNext()) {
164                                  const QString& sFilename = iter.next().toLocalFile();                                  const QString& sFilename = iter.next().toLocalFile();
165                                  if (!sFilename.isEmpty()) {                                  if (!sFilename.isEmpty()) {
166                                          bAccept = Channel::isInstrumentFile(sFilename);                                  //      bAccept = Channel::isDlsInstrumentFile(sFilename);
167                                            bAccept = QFileInfo(sFilename).exists();
168                                          break;                                          break;
169                                  }                                  }
170                          }                          }
# Line 230  QFont ChannelStrip::displayFont (void) c Line 237  QFont ChannelStrip::displayFont (void) c
237          return m_ui.EngineNameTextLabel->font();          return m_ui.EngineNameTextLabel->font();
238  }  }
239    
240    
241  void ChannelStrip::setDisplayFont ( const QFont & font )  void ChannelStrip::setDisplayFont ( const QFont & font )
242  {  {
243          m_ui.EngineNameTextLabel->setFont(font);          m_ui.EngineNameTextLabel->setFont(font);
244          m_ui.MidiPortChannelTextLabel->setFont(font);          m_ui.MidiPortChannelTextLabel->setFont(font);
245          m_ui.InstrumentNameTextLabel->setFont(font);          m_ui.InstrumentNamePushButton->setFont(font);
246          m_ui.InstrumentStatusTextLabel->setFont(font);          m_ui.InstrumentStatusTextLabel->setFont(font);
247  }  }
248    
# Line 244  void ChannelStrip::setDisplayEffect ( bo Line 252  void ChannelStrip::setDisplayEffect ( bo
252  {  {
253          QPalette pal;          QPalette pal;
254          pal.setColor(QPalette::Foreground, Qt::yellow);          pal.setColor(QPalette::Foreground, Qt::yellow);
255            pal.setColor(QPalette::ButtonText, Qt::yellow);
256          m_ui.EngineNameTextLabel->setPalette(pal);          m_ui.EngineNameTextLabel->setPalette(pal);
257          m_ui.MidiPortChannelTextLabel->setPalette(pal);          m_ui.MidiPortChannelTextLabel->setPalette(pal);
258          pal.setColor(QPalette::Foreground, Qt::green);          pal.setColor(QPalette::Foreground, Qt::green);
259            pal.setColor(QPalette::ButtonText, Qt::green);
260          if (bDisplayEffect) {          if (bDisplayEffect) {
261                  QPixmap pm(":/images/displaybg1.png");                  QPixmap pm(":/images/displaybg1.png");
262                  pal.setBrush(QPalette::Background, QBrush(pm));                  pal.setBrush(QPalette::Background, QBrush(pm));
# Line 254  void ChannelStrip::setDisplayEffect ( bo Line 264  void ChannelStrip::setDisplayEffect ( bo
264                  pal.setColor(QPalette::Background, Qt::black);                  pal.setColor(QPalette::Background, Qt::black);
265          }          }
266          m_ui.ChannelInfoFrame->setPalette(pal);          m_ui.ChannelInfoFrame->setPalette(pal);
267          m_ui.InstrumentNameTextLabel->setPalette(pal);          m_ui.InstrumentNamePushButton->setPalette(pal);
268          m_ui.StreamVoiceCountTextLabel->setPalette(pal);          m_ui.StreamVoiceCountTextLabel->setPalette(pal);
269  }  }
270    
# Line 263  void ChannelStrip::setDisplayEffect ( bo Line 273  void ChannelStrip::setDisplayEffect ( bo
273  void ChannelStrip::setMaxVolume ( int iMaxVolume )  void ChannelStrip::setMaxVolume ( int iMaxVolume )
274  {  {
275          m_iDirtyChange++;          m_iDirtyChange++;
276          m_ui.VolumeSlider->setRange(0, iMaxVolume);          m_ui.ChannelVolumeSlider->setRange(0, iMaxVolume);
277          m_ui.VolumeSpinBox->setRange(0, iMaxVolume);          m_ui.ChannelVolumeSpinBox->setRange(0, iMaxVolume);
278          m_iDirtyChange--;          m_iDirtyChange--;
279  }  }
280    
# Line 276  bool ChannelStrip::channelSetup (void) Line 286  bool ChannelStrip::channelSetup (void)
286                  return false;                  return false;
287    
288          // Invoke the channel setup dialog.          // Invoke the channel setup dialog.
289          bool bResult = m_pChannel->channelSetup(this);          const bool bResult = m_pChannel->channelSetup(this);
290          // Notify that this channel has changed.          // Notify that this channel has changed.
291          if (bResult)          if (bResult)
292                  emit channelChanged(this);                  emit channelChanged(this);
# Line 292  bool ChannelStrip::channelMute ( bool bM Line 302  bool ChannelStrip::channelMute ( bool bM
302                  return false;                  return false;
303    
304          // Invoke the channel mute method.          // Invoke the channel mute method.
305          bool bResult = m_pChannel->setChannelMute(bMute);          const bool bResult = m_pChannel->setChannelMute(bMute);
306          // Notify that this channel has changed.          // Notify that this channel has changed.
307          if (bResult)          if (bResult)
308                  emit channelChanged(this);                  emit channelChanged(this);
# Line 308  bool ChannelStrip::channelSolo ( bool bS Line 318  bool ChannelStrip::channelSolo ( bool bS
318                  return false;                  return false;
319    
320          // Invoke the channel solo method.          // Invoke the channel solo method.
321          bool bResult = m_pChannel->setChannelSolo(bSolo);          const bool bResult = m_pChannel->setChannelSolo(bSolo);
322          // Notify that this channel has changed.          // Notify that this channel has changed.
323          if (bResult)          if (bResult)
324                  emit channelChanged(this);                  emit channelChanged(this);
# Line 354  bool ChannelStrip::channelFxEdit (void) Line 364  bool ChannelStrip::channelFxEdit (void)
364          return bResult;          return bResult;
365  }  }
366    
367    
368  // Channel reset slot.  // Channel reset slot.
369  bool ChannelStrip::channelReset (void)  bool ChannelStrip::channelReset (void)
370  {  {
# Line 361  bool ChannelStrip::channelReset (void) Line 372  bool ChannelStrip::channelReset (void)
372                  return false;                  return false;
373    
374          // Invoke the channel reset method.          // Invoke the channel reset method.
375          bool bResult = m_pChannel->channelReset();          const bool bResult = m_pChannel->channelReset();
376          // Notify that this channel has changed.          // Notify that this channel has changed.
377          if (bResult)          if (bResult)
378                  emit channelChanged(this);                  emit channelChanged(this);
# Line 383  bool ChannelStrip::updateInstrumentName Line 394  bool ChannelStrip::updateInstrumentName
394          // Instrument name...          // Instrument name...
395          if (m_pChannel->instrumentName().isEmpty()) {          if (m_pChannel->instrumentName().isEmpty()) {
396                  if (m_pChannel->instrumentStatus() >= 0) {                  if (m_pChannel->instrumentStatus() >= 0) {
397                          m_ui.InstrumentNameTextLabel->setText(                          m_ui.InstrumentNamePushButton->setText(
398                                  ' ' + Channel::loadingInstrument());                                  ' ' + Channel::loadingInstrument());
399                  } else {                  } else {
400                          m_ui.InstrumentNameTextLabel->setText(                          m_ui.InstrumentNamePushButton->setText(
401                                  ' ' + Channel::noInstrumentName());                                  ' ' + Channel::noInstrumentName());
402                  }                  }
403          } else {          } else {
404                  m_ui.InstrumentNameTextLabel->setText(                  m_ui.InstrumentNamePushButton->setText(
405                          ' ' + m_pChannel->instrumentName());                          ' ' + m_pChannel->instrumentName());
406          }          }
407            
408            bool bShowInstrumentPopup = false;
409    
410            // Instrument list popup (for fast switching among sounds of the same file)
411            if (!m_pChannel->instrumentFile().isEmpty()) {
412                    const QStringList instruments
413                            = Channel::getInstrumentList(m_pChannel->instrumentFile(), true);
414                    if (!instruments.isEmpty()) {
415                            bShowInstrumentPopup = true;
416                            if (!m_instrumentListPopupMenu) {
417                                    m_instrumentListPopupMenu
418                                            = new QMenu(m_ui.InstrumentNamePushButton);
419                                    m_instrumentListPopupMenu->setTitle(tr("Instruments"));
420                                    // for cosmetical reasons, should have at least
421                                    // the width of the instrument name label...
422                                    m_instrumentListPopupMenu->setMinimumWidth(120);
423                                    m_ui.InstrumentNamePushButton->setMenu(m_instrumentListPopupMenu);
424                                    QObject::connect(m_instrumentListPopupMenu,
425                                            SIGNAL(triggered(QAction*)),
426                                            SLOT(instrumentListPopupItemClicked(QAction *)));
427                            } else {
428                                    m_instrumentListPopupMenu->clear();
429                            }
430                            QAction *action;
431                            for (int i = 0; i < instruments.size(); ++i) {
432                                    action = m_instrumentListPopupMenu->addAction(instruments.at(i));
433                                    action->setData(i);
434                                    action->setCheckable(true);
435                                    action->setChecked(i == m_pChannel->instrumentNr());
436                            }
437                    }
438            }
439    
440            if (!bShowInstrumentPopup && m_instrumentListPopupMenu) {
441                    delete m_instrumentListPopupMenu;
442                    m_instrumentListPopupMenu = NULL;
443            }
444    
445          return true;          return true;
446  }  }
447    
448    
449    void ChannelStrip::instrumentListPopupItemClicked ( QAction *action )
450    {
451            if (!action) return;
452    
453            QVariant data = action->data();
454            if (data.isValid() && !m_pChannel->instrumentFile().isEmpty()) {
455                    m_pChannel->loadInstrument(m_pChannel->instrumentFile(), data.toInt());
456                    emit channelChanged(this);
457            }
458    }
459    
460    
461  // Do the dirty volume change.  // Do the dirty volume change.
462  bool ChannelStrip::updateChannelVolume (void)  bool ChannelStrip::updateChannelVolume (void)
463  {  {
# Line 412  bool ChannelStrip::updateChannelVolume ( Line 472  bool ChannelStrip::updateChannelVolume (
472    
473          // Flag it here, to avoid infinite recursion.          // Flag it here, to avoid infinite recursion.
474          m_iDirtyChange++;          m_iDirtyChange++;
475          m_ui.VolumeSlider->setValue(iVolume);          m_ui.ChannelVolumeSlider->setValue(iVolume);
476          m_ui.VolumeSpinBox->setValue(iVolume);          m_ui.ChannelVolumeSpinBox->setValue(iVolume);
477          m_iDirtyChange--;          m_iDirtyChange--;
478    
479          return true;          return true;
# Line 431  bool ChannelStrip::updateChannelInfo (vo Line 491  bool ChannelStrip::updateChannelInfo (vo
491                  return true;                  return true;
492    
493          // Update strip caption.          // Update strip caption.
494          QString sText = m_pChannel->channelName();          const QString& sText = m_pChannel->channelName();
495          setWindowTitle(sText);          setWindowTitle(sText);
496          m_ui.ChannelSetupPushButton->setText('&' + sText);          m_ui.ChannelSetupPushButton->setText('&' + sText);
497    
498          // Check if we're up and connected.          // Check if we're up and connected.
499          MainForm* pMainForm = MainForm::getInstance();          MainForm *pMainForm = MainForm::getInstance();
500          if (pMainForm->client() == NULL)          if (pMainForm->client() == NULL)
501                  return false;                  return false;
502    
# Line 468  bool ChannelStrip::updateChannelInfo (vo Line 528  bool ChannelStrip::updateChannelInfo (vo
528          const QColor& rgbFore = pal.color(QPalette::Foreground);          const QColor& rgbFore = pal.color(QPalette::Foreground);
529    
530          // Instrument status...          // Instrument status...
531          int iInstrumentStatus = m_pChannel->instrumentStatus();          const int iInstrumentStatus = m_pChannel->instrumentStatus();
532          if (iInstrumentStatus < 0) {          if (iInstrumentStatus < 0) {
533                  pal.setColor(QPalette::Foreground, Qt::red);                  pal.setColor(QPalette::Foreground, Qt::red);
534                  m_ui.InstrumentStatusTextLabel->setPalette(pal);                  m_ui.InstrumentStatusTextLabel->setPalette(pal);
# Line 477  bool ChannelStrip::updateChannelInfo (vo Line 537  bool ChannelStrip::updateChannelInfo (vo
537                  m_iErrorCount++;                  m_iErrorCount++;
538                  return false;                  return false;
539          }          }
540    
541          // All seems normal...          // All seems normal...
542          pal.setColor(QPalette::Foreground,          pal.setColor(QPalette::Foreground,
543                  iInstrumentStatus < 100 ? Qt::yellow : Qt::green);                  iInstrumentStatus < 100 ? Qt::yellow : Qt::green);
# Line 487  bool ChannelStrip::updateChannelInfo (vo Line 548  bool ChannelStrip::updateChannelInfo (vo
548    
549  #ifdef CONFIG_MUTE_SOLO  #ifdef CONFIG_MUTE_SOLO
550          // Mute/Solo button state coloring...          // Mute/Solo button state coloring...
551          bool bMute = m_pChannel->channelMute();          const bool bMute = m_pChannel->channelMute();
552          const QColor& rgbButton = pal.color(QPalette::Button);          const QColor& rgbButton = pal.color(QPalette::Button);
553          const QColor& rgbButtonText = pal.color(QPalette::ButtonText);          const QColor& rgbButtonText = pal.color(QPalette::ButtonText);
554          pal.setColor(QPalette::Foreground, rgbFore);          pal.setColor(QPalette::Foreground, rgbFore);
# Line 495  bool ChannelStrip::updateChannelInfo (vo Line 556  bool ChannelStrip::updateChannelInfo (vo
556          pal.setColor(QPalette::ButtonText, bMute ? Qt::darkYellow : rgbButtonText);          pal.setColor(QPalette::ButtonText, bMute ? Qt::darkYellow : rgbButtonText);
557          m_ui.ChannelMutePushButton->setPalette(pal);          m_ui.ChannelMutePushButton->setPalette(pal);
558          m_ui.ChannelMutePushButton->setDown(bMute);          m_ui.ChannelMutePushButton->setDown(bMute);
559          bool bSolo = m_pChannel->channelSolo();          const bool bSolo = m_pChannel->channelSolo();
560          pal.setColor(QPalette::Button, bSolo ? Qt::cyan : rgbButton);            pal.setColor(QPalette::Button, bSolo ? Qt::cyan : rgbButton);  
561          pal.setColor(QPalette::ButtonText, bSolo ? Qt::darkCyan : rgbButtonText);          pal.setColor(QPalette::ButtonText, bSolo ? Qt::darkCyan : rgbButtonText);
562          m_ui.ChannelSoloPushButton->setPalette(pal);          m_ui.ChannelSoloPushButton->setPalette(pal);
# Line 526  bool ChannelStrip::updateChannelUsage (v Line 587  bool ChannelStrip::updateChannelUsage (v
587                  return false;                  return false;
588    
589          // Get current channel voice count.          // Get current channel voice count.
590          int iVoiceCount  = ::lscp_get_channel_voice_count(          const int iVoiceCount  = ::lscp_get_channel_voice_count(
591                  pMainForm->client(), m_pChannel->channelID());                  pMainForm->client(), m_pChannel->channelID());
592  // Get current stream count.          // Get current stream count.
593          int iStreamCount = ::lscp_get_channel_stream_count(          const int iStreamCount = ::lscp_get_channel_stream_count(
594                  pMainForm->client(), m_pChannel->channelID());                  pMainForm->client(), m_pChannel->channelID());
595          // Get current channel buffer fill usage.          // Get current channel buffer fill usage.
596          // As benno has suggested this is the percentage usage          // As benno has suggested this is the percentage usage
597          // of the least filled buffer stream...          // of the least filled buffer stream...
598          int iStreamUsage = ::lscp_get_channel_stream_usage(          const int iStreamUsage = ::lscp_get_channel_stream_usage(
599                  pMainForm->client(), m_pChannel->channelID());;                  pMainForm->client(), m_pChannel->channelID());
600    
601          // Update the GUI elements...          // Update the GUI elements...
602          m_ui.StreamUsageProgressBar->setValue(iStreamUsage);          m_ui.StreamUsageProgressBar->setValue(iStreamUsage);
# Line 618  void ChannelStrip::setSelected ( bool bS Line 679  void ChannelStrip::setSelected ( bool bS
679          QPalette pal;          QPalette pal;
680          if (bSelected) {          if (bSelected) {
681                  const QColor& color = pal.midlight().color();                  const QColor& color = pal.midlight().color();
682                  pal.setColor(QPalette::Background, color.dark(150));                  pal.setColor(QPalette::Background, color.darker(150));
683                  pal.setColor(QPalette::Foreground, color.light(150));                  pal.setColor(QPalette::Foreground, color.lighter(150));
684          }          }
685          QWidget::setPalette(pal);  
686            QWidget *pParentWidget = QWidget::parentWidget();
687            if (pParentWidget)
688                    pParentWidget->setPalette(pal);
689  }  }
690    
691    

Legend:
Removed from v.2074  
changed lines
  Added in v.3518

  ViewVC Help
Powered by ViewVC