/[svn]/qsampler/trunk/src/qsamplerMainForm.ui.h
ViewVC logotype

Diff of /qsampler/trunk/src/qsamplerMainForm.ui.h

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

revision 344 by capela, Tue Jan 18 13:53:04 2005 UTC revision 433 by capela, Wed Mar 9 16:44:04 2005 UTC
# Line 26  Line 26 
26  #include <qprocess.h>  #include <qprocess.h>
27  #include <qmessagebox.h>  #include <qmessagebox.h>
28  #include <qdragobject.h>  #include <qdragobject.h>
29    #include <qregexp.h>
30  #include <qfiledialog.h>  #include <qfiledialog.h>
31  #include <qfileinfo.h>  #include <qfileinfo.h>
32  #include <qfile.h>  #include <qfile.h>
# Line 40  Line 41 
41  #include "qsamplerMessages.h"  #include "qsamplerMessages.h"
42    
43  #include "qsamplerChannelStrip.h"  #include "qsamplerChannelStrip.h"
44    
45    #include "qsamplerDeviceForm.h"
46  #include "qsamplerOptionsForm.h"  #include "qsamplerOptionsForm.h"
47    
48  #include "config.h"  #include "config.h"
# Line 104  void qsamplerMainForm::init (void) Line 107  void qsamplerMainForm::init (void)
107      m_pOptions = NULL;      m_pOptions = NULL;
108    
109      // All child forms are to be created later, not earlier than setup.      // All child forms are to be created later, not earlier than setup.
110      m_pMessages = NULL;      m_pMessages   = NULL;
111        m_pDeviceForm = NULL;
112    
113      // We'll start clean.      // We'll start clean.
114      m_iUntitled    = 0;      m_iUntitled   = 0;
115      m_iDirtyCount  = 0;      m_iDirtyCount = 0;
     m_iChangeCount = 0;  
116    
117      m_pServer = NULL;      m_pServer = NULL;
118      m_pClient = NULL;      m_pClient = NULL;
# Line 138  void qsamplerMainForm::init (void) Line 141  void qsamplerMainForm::init (void)
141      pLabel = new QLabel(tr("Connected"), this);      pLabel = new QLabel(tr("Connected"), this);
142      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
143      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
144      m_status[QSAMPLER_STATUS_CLIENT] = pLabel;      m_statusItem[QSAMPLER_STATUS_CLIENT] = pLabel;
145      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
146      // Server address.      // Server address.
147      pLabel = new QLabel(this);      pLabel = new QLabel(this);
148      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
149      m_status[QSAMPLER_STATUS_SERVER] = pLabel;      m_statusItem[QSAMPLER_STATUS_SERVER] = pLabel;
150      statusBar()->addWidget(pLabel, 1);      statusBar()->addWidget(pLabel, 1);
151      // Channel title.      // Channel title.
152      pLabel = new QLabel(this);      pLabel = new QLabel(this);
153      pLabel->setAlignment(Qt::AlignLeft);      pLabel->setAlignment(Qt::AlignLeft);
154      m_status[QSAMPLER_STATUS_CHANNEL] = pLabel;      m_statusItem[QSAMPLER_STATUS_CHANNEL] = pLabel;
155      statusBar()->addWidget(pLabel, 2);      statusBar()->addWidget(pLabel, 2);
156      // Session modification status.      // Session modification status.
157      pLabel = new QLabel(tr("MOD"), this);      pLabel = new QLabel(tr("MOD"), this);
158      pLabel->setAlignment(Qt::AlignHCenter);      pLabel->setAlignment(Qt::AlignHCenter);
159      pLabel->setMinimumSize(pLabel->sizeHint());      pLabel->setMinimumSize(pLabel->sizeHint());
160      m_status[QSAMPLER_STATUS_SESSION] = pLabel;      m_statusItem[QSAMPLER_STATUS_SESSION] = pLabel;
161      statusBar()->addWidget(pLabel);      statusBar()->addWidget(pLabel);
162    
163      // Create the recent files sub-menu.      // Create the recent files sub-menu.
# Line 173  void qsamplerMainForm::destroy (void) Line 176  void qsamplerMainForm::destroy (void)
176  {  {
177      // Do final processing anyway.      // Do final processing anyway.
178      processServerExit();      processServerExit();
179        
180      // Delete recentfiles menu.  #if defined(WIN32)
181      if (m_pRecentFilesMenu)      WSACleanup();
182          delete m_pRecentFilesMenu;  #endif
     // Delete status item labels one by one.  
     if (m_status[QSAMPLER_STATUS_CLIENT])  
         delete m_status[QSAMPLER_STATUS_CLIENT];  
     if (m_status[QSAMPLER_STATUS_SERVER])  
         delete m_status[QSAMPLER_STATUS_SERVER];  
     if (m_status[QSAMPLER_STATUS_CHANNEL])  
         delete m_status[QSAMPLER_STATUS_CHANNEL];  
     if (m_status[QSAMPLER_STATUS_SESSION])  
         delete m_status[QSAMPLER_STATUS_SESSION];  
183    
184      // Finally drop any widgets around...      // Finally drop any widgets around...
185        if (m_pDeviceForm)
186            delete m_pDeviceForm;
187      if (m_pMessages)      if (m_pMessages)
188          delete m_pMessages;          delete m_pMessages;
189      if (m_pWorkspace)      if (m_pWorkspace)
190          delete m_pWorkspace;          delete m_pWorkspace;
191    
192  #if defined(WIN32)      // Delete status item labels one by one.
193      WSACleanup();      if (m_statusItem[QSAMPLER_STATUS_CLIENT])
194  #endif          delete m_statusItem[QSAMPLER_STATUS_CLIENT];
195        if (m_statusItem[QSAMPLER_STATUS_SERVER])
196            delete m_statusItem[QSAMPLER_STATUS_SERVER];
197        if (m_statusItem[QSAMPLER_STATUS_CHANNEL])
198            delete m_statusItem[QSAMPLER_STATUS_CHANNEL];
199        if (m_statusItem[QSAMPLER_STATUS_SESSION])
200            delete m_statusItem[QSAMPLER_STATUS_SESSION];
201    
202        // Delete recentfiles menu.
203        if (m_pRecentFilesMenu)
204            delete m_pRecentFilesMenu;
205  }  }
206    
207    
# Line 207  void qsamplerMainForm::setup ( qsamplerO Line 213  void qsamplerMainForm::setup ( qsamplerO
213    
214      // Some child forms are to be created right now.      // Some child forms are to be created right now.
215      m_pMessages = new qsamplerMessages(this);      m_pMessages = new qsamplerMessages(this);
216        m_pDeviceForm = new qsamplerDeviceForm(this);
217      // Set message defaults...      // Set message defaults...
218      updateMessagesFont();      updateMessagesFont();
219      updateMessagesLimit();      updateMessagesLimit();
# Line 235  void qsamplerMainForm::setup ( qsamplerO Line 242  void qsamplerMainForm::setup ( qsamplerO
242          QTextIStream istr(&sDockables);          QTextIStream istr(&sDockables);
243          istr >> *this;          istr >> *this;
244      }      }
245      // Try to restore old window positioning.      // Try to restore old window positioning and initial visibility.
246      m_pOptions->loadWidgetGeometry(this);      m_pOptions->loadWidgetGeometry(this);
247        m_pOptions->loadWidgetGeometry(m_pDeviceForm);
248    
249      // Final startup stabilization...      // Final startup stabilization...
250      updateRecentFilesMenu();      updateRecentFilesMenu();
# Line 274  bool qsamplerMainForm::queryClose (void) Line 282  bool qsamplerMainForm::queryClose (void)
282              QTextOStream ostr(&sDockables);              QTextOStream ostr(&sDockables);
283              ostr << *this;              ostr << *this;
284              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);              m_pOptions->settings().writeEntry("/Layout/DockWindows", sDockables);
285              // And the main windows state.              // And the children, and the main windows state,.
286                    m_pOptions->saveWidgetGeometry(m_pDeviceForm);
287              m_pOptions->saveWidgetGeometry(this);              m_pOptions->saveWidgetGeometry(this);
288                    // Close popup widgets.
289                    if (m_pDeviceForm)
290                        m_pDeviceForm->close();
291              // Stop client and/or server, gracefully.              // Stop client and/or server, gracefully.
292              stopServer();              stopServer();
293          }          }
# Line 294  void qsamplerMainForm::closeEvent ( QClo Line 306  void qsamplerMainForm::closeEvent ( QClo
306  }  }
307    
308    
309  // Window drag-n-drop event handlers.  // Drag'n'drop file handler.
310  void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )  bool qsamplerMainForm::decodeDragFiles ( const QMimeSource *pEvent, QStringList& files )
311  {  {
312      bool bAccept = false;      bool bDecode = false;
313    
314      if (QTextDrag::canDecode(pDragEnterEvent)) {      if (QTextDrag::canDecode(pEvent)) {
315          QString sUrl;          QString sText;
316          if (QTextDrag::decode(pDragEnterEvent, sUrl) && m_pClient)          bDecode = QTextDrag::decode(pEvent, sText);
317              bAccept = QFileInfo(QUrl(sUrl).path()).exists();          if (bDecode) {
318                files = QStringList::split('\n', sText);
319                for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++)
320                    *iter = QUrl((*iter).stripWhiteSpace().replace(QRegExp("^file:"), QString::null)).path();
321            }
322      }      }
323    
324      pDragEnterEvent->accept(bAccept);      return bDecode;
325    }
326    
327    
328    // Window drag-n-drop event handlers.
329    void qsamplerMainForm::dragEnterEvent ( QDragEnterEvent* pDragEnterEvent )
330    {
331            QStringList files;
332            pDragEnterEvent->accept(decodeDragFiles(pDragEnterEvent, files));
333  }  }
334    
335    
336  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )  void qsamplerMainForm::dropEvent ( QDropEvent* pDropEvent )
337  {  {
338      if (QTextDrag::canDecode(pDropEvent)) {      QStringList files;
339          QString sUrl;  
340          if (QTextDrag::decode(pDropEvent, sUrl) && closeSession(true))      if (!decodeDragFiles(pDropEvent, files))
341              loadSessionFile(QUrl(sUrl).path());          return;
342      }  
343        for (QStringList::Iterator iter = files.begin(); iter != files.end(); iter++) {
344                    const QString& sPath = *iter;
345                    if (qsamplerChannel::isInstrumentFile(sPath)) {
346                            // Try to create a new channel from instrument file...
347                        qsamplerChannel *pChannel = new qsamplerChannel(this);
348                        if (pChannel == NULL)
349                            return;
350                            // Start setting the instrument filename...
351                            pChannel->setInstrument(sPath, 0);
352                        // Before we show it up, may be we'll
353                        // better ask for some initial values?
354                        if (!pChannel->channelSetup(this)) {
355                            delete pChannel;
356                            return;
357                        }
358                        // Finally, give it to a new channel strip...
359                            if (!createChannelStrip(pChannel)) {
360                            delete pChannel;
361                            return;
362                            }
363                        // Make that an overall update.
364                        m_iDirtyCount++;
365                        stabilizeForm();
366                    }   // Otherwise, load an usual session file (LSCP script)...
367                    else if (closeSession(true))
368                            loadSessionFile(sPath);
369                    // Make it look responsive...:)
370                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
371            }
372  }  }
373    
374    
# Line 380  bool qsamplerMainForm::newSession (void) Line 433  bool qsamplerMainForm::newSession (void)
433      if (!closeSession(true))      if (!closeSession(true))
434          return false;          return false;
435    
436            // Give us what the server has, right now...
437            updateSession();
438    
439      // Ok increment untitled count.      // Ok increment untitled count.
440      m_iUntitled++;      m_iUntitled++;
441    
# Line 538  bool qsamplerMainForm::loadSessionFile ( Line 594  bool qsamplerMainForm::loadSessionFile (
594              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {              if (::lscp_client_query(m_pClient, sCommand.latin1()) != LSCP_OK) {
595                  appendMessagesClient("lscp_client_query");                  appendMessagesClient("lscp_client_query");
596                  iErrors++;                  iErrors++;
597                    break;
598              }              }
599          }          }
600          // Try to make it snappy :)          // Try to make it snappy :)
# Line 549  bool qsamplerMainForm::loadSessionFile ( Line 606  bool qsamplerMainForm::loadSessionFile (
606    
607      // Have we any errors?      // Have we any errors?
608      if (iErrors > 0)      if (iErrors > 0)
609          appendMessagesError(tr("Some setttings could not be loaded\nfrom \"%1\" session file.\n\nSorry.").arg(sFilename));          appendMessagesError(tr("Session could not be loaded\nfrom \"%1\".\n\nSorry.").arg(sFilename));
610    
611      // Now we'll try to create the whole GUI session.          // Now we'll try to create (update) the whole GUI session.
612      int *piChannelIDs = ::lscp_list_channels(m_pClient);          updateSession();
     if (piChannelIDs == NULL) {  
         appendMessagesClient("lscp_list_channels");  
         appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));  
     }  
       
     // Try to (re)create each channel.  
     m_pWorkspace->setUpdatesEnabled(false);  
     for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {  
         createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));  
         QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);  
     }  
     m_pWorkspace->setUpdatesEnabled(true);  
613    
614      // Save as default session directory.      // Save as default session directory.
615      if (m_pOptions)      if (m_pOptions)
# Line 577  bool qsamplerMainForm::loadSessionFile ( Line 622  bool qsamplerMainForm::loadSessionFile (
622      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));      appendMessages(tr("Open session: \"%1\".").arg(sessionName(m_sFilename)));
623            
624      // Make that an overall update.      // Make that an overall update.
     m_iChangeCount++;  
625      stabilizeForm();      stabilizeForm();
626      return true;      return true;
627  }  }
# Line 615  bool qsamplerMainForm::saveSessionFile ( Line 659  bool qsamplerMainForm::saveSessionFile (
659          if (pChannelStrip) {          if (pChannelStrip) {
660              qsamplerChannel *pChannel = pChannelStrip->channel();              qsamplerChannel *pChannel = pChannelStrip->channel();
661              if (pChannel) {              if (pChannel) {
662                  int iChannelID = pChannel->channelID();                  ts << "# Channel " << iChannel << endl;
                 ts << "# " << pChannelStrip->caption() << endl;  
663                  ts << "ADD CHANNEL" << endl;                  ts << "ADD CHANNEL" << endl;
664                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannelID << " " << pChannel->audioDriver() << endl;                  ts << "SET CHANNEL AUDIO_OUTPUT_TYPE " << iChannel << " " << pChannel->audioDriver() << endl;
665                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannelID << " " << pChannel->midiDriver() << endl;                  ts << "SET CHANNEL MIDI_INPUT_TYPE " << iChannel << " " << pChannel->midiDriver() << endl;
666                  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannelID << " " << pChannel->midiPort() << endl;              //  ts << "SET CHANNEL MIDI_INPUT_PORT " << iChannel << " " << pChannel->midiPort() << endl;
667                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannelID << " ";                  ts << "SET CHANNEL MIDI_INPUT_CHANNEL " << iChannel << " ";
668                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)                  if (pChannel->midiChannel() == LSCP_MIDI_CHANNEL_ALL)
669                      ts << "ALL";                      ts << "ALL";
670                  else                  else
671                      ts << pChannel->midiChannel();                      ts << pChannel->midiChannel();
672                  ts << endl;                  ts << endl;
673                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannelID << endl;                  ts << "LOAD ENGINE " << pChannel->engineName() << " " << iChannel << endl;
674                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannelID << endl;                  ts << "LOAD INSTRUMENT NON_MODAL '" << pChannel->instrumentFile() << "' " << pChannel->instrumentNr() << " " << iChannel << endl;
675                  ts << "SET CHANNEL VOLUME " << iChannelID << " " << pChannel->volume() << endl;                  ts << "SET CHANNEL VOLUME " << iChannel << " " << pChannel->volume() << endl;
676                  ts << endl;                  ts << endl;
677              }              }
678          }          }
# Line 658  bool qsamplerMainForm::saveSessionFile ( Line 701  bool qsamplerMainForm::saveSessionFile (
701  }  }
702    
703    
704    // Session change receiver slot.
705    void qsamplerMainForm::sessionDirty (void)
706    {
707        // Just mark the dirty form.
708        m_iDirtyCount++;
709        // and update the form status...
710        stabilizeForm();
711    }
712    
713    
714  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
715  // qsamplerMainForm -- File Action slots.  // qsamplerMainForm -- File Action slots.
716    
# Line 729  void qsamplerMainForm::fileReset (void) Line 782  void qsamplerMainForm::fileReset (void)
782    
783      // Log this.      // Log this.
784      appendMessages(tr("Sampler reset."));      appendMessages(tr("Sampler reset."));
785    
786            // Make it a new session...
787            newSession();
788  }  }
789    
790    
# Line 799  void qsamplerMainForm::editAddChannel (v Line 855  void qsamplerMainForm::editAddChannel (v
855    
856      // Make that an overall update.      // Make that an overall update.
857      m_iDirtyCount++;      m_iDirtyCount++;
     m_iChangeCount++;  
858      stabilizeForm();      stabilizeForm();
859  }  }
860    
# Line 871  void qsamplerMainForm::editResetChannel Line 926  void qsamplerMainForm::editResetChannel
926      if (pChannelStrip == NULL)      if (pChannelStrip == NULL)
927          return;          return;
928    
929      qsamplerChannel *pChannel = pChannelStrip->channel();      // Just invoque the channel strip procedure.
930      if (pChannel == NULL)      pChannelStrip->channelReset();
931          return;  }
932    
933    
934      // Reset the existing sampler channel.  // Reset all sampler channels.
935      pChannel->resetChannel();  void qsamplerMainForm::editResetAllChannels (void)
936    {
937        if (m_pClient == NULL)
938            return;
939    
940      // And force a deferred update.      // Invoque the channel strip procedure,
941      m_iChangeCount++;          // for all channels out there...
942        m_pWorkspace->setUpdatesEnabled(false);
943        QWidgetList wlist = m_pWorkspace->windowList();
944        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
945            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
946            if (pChannelStrip)
947                    pChannelStrip->channelReset();
948        }
949        m_pWorkspace->setUpdatesEnabled(true);
950  }  }
951    
952    
# Line 931  void qsamplerMainForm::viewMessages ( bo Line 998  void qsamplerMainForm::viewMessages ( bo
998  }  }
999    
1000    
1001    // Show/hide the device configurator form.
1002    void qsamplerMainForm::viewDevices (void)
1003    {
1004        if (m_pOptions == NULL)
1005            return;
1006    
1007        if (m_pDeviceForm) {
1008            m_pOptions->saveWidgetGeometry(m_pDeviceForm);
1009                    m_pDeviceForm->setClient(m_pClient);
1010            if (m_pDeviceForm->isVisible()) {
1011                m_pDeviceForm->hide();
1012            } else {
1013                m_pDeviceForm->show();
1014                m_pDeviceForm->raise();
1015                m_pDeviceForm->setActiveWindow();
1016            }
1017        }
1018    }
1019    
1020    
1021  // Show options dialog.  // Show options dialog.
1022  void qsamplerMainForm::viewOptions (void)  void qsamplerMainForm::viewOptions (void)
1023  {  {
# Line 959  void qsamplerMainForm::viewOptions (void Line 1046  void qsamplerMainForm::viewOptions (void
1046          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;          int     bOldMessagesLimit   = m_pOptions->bMessagesLimit;
1047          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;          int     iOldMessagesLimitLines = m_pOptions->iMessagesLimitLines;
1048          bool    bOldCompletePath    = m_pOptions->bCompletePath;          bool    bOldCompletePath    = m_pOptions->bCompletePath;
1049            bool    bOldInstrumentNames = m_pOptions->bInstrumentNames;
1050          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;          int     iOldMaxRecentFiles  = m_pOptions->iMaxRecentFiles;
1051          // Load the current setup settings.          // Load the current setup settings.
1052          pOptionsForm->setup(m_pOptions);          pOptionsForm->setup(m_pOptions);
# Line 977  void qsamplerMainForm::viewOptions (void Line 1065  void qsamplerMainForm::viewOptions (void
1065                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||                  (!bOldCompletePath &&  m_pOptions->bCompletePath) ||
1066                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))                  (iOldMaxRecentFiles != m_pOptions->iMaxRecentFiles))
1067                  updateRecentFilesMenu();                  updateRecentFilesMenu();
1068                if (( bOldInstrumentNames && !m_pOptions->bInstrumentNames) ||
1069                    (!bOldInstrumentNames &&  m_pOptions->bInstrumentNames))
1070                    updateInstrumentNames();
1071              if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||              if (( bOldDisplayEffect && !m_pOptions->bDisplayEffect) ||
1072                  (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))                  (!bOldDisplayEffect &&  m_pOptions->bDisplayEffect))
1073                  updateDisplayEffect();                  updateDisplayEffect();
# Line 1087  void qsamplerMainForm::helpAbout (void) Line 1178  void qsamplerMainForm::helpAbout (void)
1178      sText += tr("GIG (libgig) file support disabled.");      sText += tr("GIG (libgig) file support disabled.");
1179      sText += "</font></small><br />";      sText += "</font></small><br />";
1180  #endif  #endif
1181    #ifndef CONFIG_INSTRUMENT_NAME
1182        sText += "<small><font color=\"red\">";
1183        sText += tr("LSCP (liblscp) instrument_name support disabled.");
1184        sText += "</font></small><br />";
1185    #endif
1186      sText += "<br />\n";      sText += "<br />\n";
1187      sText += tr("Using") + ": ";      sText += tr("Using") + ": ";
1188      sText += ::lscp_client_package();      sText += ::lscp_client_package();
# Line 1114  void qsamplerMainForm::helpAbout (void) Line 1210  void qsamplerMainForm::helpAbout (void)
1210  void qsamplerMainForm::stabilizeForm (void)  void qsamplerMainForm::stabilizeForm (void)
1211  {  {
1212      // Update the main application caption...      // Update the main application caption...
1213      QString sSessioName = sessionName(m_sFilename);      QString sSessionName = sessionName(m_sFilename);
1214      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1215          sSessioName += '*';          sSessionName += '*';
1216      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessioName));      setCaption(tr(QSAMPLER_TITLE " - [%1]").arg(sSessionName));
1217    
1218      // Update the main menu state...      // Update the main menu state...
1219      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();      qsamplerChannelStrip *pChannelStrip = activeChannelStrip();
# Line 1133  void qsamplerMainForm::stabilizeForm (vo Line 1229  void qsamplerMainForm::stabilizeForm (vo
1229      editRemoveChannelAction->setEnabled(bHasChannel);      editRemoveChannelAction->setEnabled(bHasChannel);
1230      editSetupChannelAction->setEnabled(bHasChannel);      editSetupChannelAction->setEnabled(bHasChannel);
1231      editResetChannelAction->setEnabled(bHasChannel);      editResetChannelAction->setEnabled(bHasChannel);
1232      channelsArrangeAction->setEnabled(bHasChannel);      editResetAllChannelsAction->setEnabled(bHasChannel);
1233      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());      viewMessagesAction->setOn(m_pMessages && m_pMessages->isVisible());
1234        viewDevicesAction->setOn(m_pDeviceForm && m_pDeviceForm->isVisible());
1235        viewDevicesAction->setEnabled(bHasClient);
1236        channelsArrangeAction->setEnabled(bHasChannel);
1237    
1238      // Client/Server status...      // Client/Server status...
1239      if (bHasClient) {      if (bHasClient) {
1240          m_status[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));          m_statusItem[QSAMPLER_STATUS_CLIENT]->setText(tr("Connected"));
1241          m_status[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));          m_statusItem[QSAMPLER_STATUS_SERVER]->setText(m_pOptions->sServerHost + ":" + QString::number(m_pOptions->iServerPort));
1242      } else {      } else {
1243          m_status[QSAMPLER_STATUS_CLIENT]->clear();          m_statusItem[QSAMPLER_STATUS_CLIENT]->clear();
1244          m_status[QSAMPLER_STATUS_SERVER]->clear();          m_statusItem[QSAMPLER_STATUS_SERVER]->clear();
1245      }      }
1246      // Channel status...      // Channel status...
1247      if (bHasChannel)      if (bHasChannel)
1248          m_status[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());          m_statusItem[QSAMPLER_STATUS_CHANNEL]->setText(pChannelStrip->caption());
1249      else      else
1250          m_status[QSAMPLER_STATUS_CHANNEL]->clear();          m_statusItem[QSAMPLER_STATUS_CHANNEL]->clear();
1251      // Session status...      // Session status...
1252      if (m_iDirtyCount > 0)      if (m_iDirtyCount > 0)
1253          m_status[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));          m_statusItem[QSAMPLER_STATUS_SESSION]->setText(tr("MOD"));
1254      else      else
1255          m_status[QSAMPLER_STATUS_SESSION]->clear();          m_statusItem[QSAMPLER_STATUS_SESSION]->clear();
1256    
1257      // Recent files menu.      // Recent files menu.
1258      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);      m_pRecentFilesMenu->setEnabled(bHasClient && m_pOptions->recentFiles.count() > 0);
# Line 1165  void qsamplerMainForm::stabilizeForm (vo Line 1264  void qsamplerMainForm::stabilizeForm (vo
1264    
1265    
1266  // Channel change receiver slot.  // Channel change receiver slot.
1267  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip * )  void qsamplerMainForm::channelStripChanged( qsamplerChannelStrip *pChannelStrip )
1268  {  {
1269      // Flag that we're update those channel strips.          // Add this strip to the changed list...
1270      m_iChangeCount++;          if (m_changedStrips.containsRef(pChannelStrip) == 0)
1271                    m_changedStrips.append(pChannelStrip);
1272    
1273      // Just mark the dirty form.      // Just mark the dirty form.
1274      m_iDirtyCount++;      m_iDirtyCount++;
1275      // and update the form status...      // and update the form status...
# Line 1176  void qsamplerMainForm::channelStripChang Line 1277  void qsamplerMainForm::channelStripChang
1277  }  }
1278    
1279    
1280    // Grab and restore current sampler channels session.
1281    void qsamplerMainForm::updateSession (void)
1282    {
1283            // Retrieve the current channel list.
1284            int *piChannelIDs = ::lscp_list_channels(m_pClient);
1285            if (piChannelIDs == NULL) {
1286                    if (::lscp_client_get_errno(m_pClient)) {
1287                            appendMessagesClient("lscp_list_channels");
1288                            appendMessagesError(tr("Could not get current list of channels.\n\nSorry."));
1289                    }
1290                    return;
1291            }
1292    
1293            // Try to (re)create each channel.
1294            m_pWorkspace->setUpdatesEnabled(false);
1295            for (int iChannel = 0; piChannelIDs[iChannel] >= 0; iChannel++) {
1296                    // Check if theres already a channel strip for this one...
1297                    if (!channelStrip(piChannelIDs[iChannel]))
1298                            createChannelStrip(new qsamplerChannel(this, piChannelIDs[iChannel]));
1299                    // Make it visibly responsive...
1300                    QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
1301            }
1302            m_pWorkspace->setUpdatesEnabled(true);
1303    }
1304    
1305    
1306  // Update the recent files list and menu.  // Update the recent files list and menu.
1307  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )  void qsamplerMainForm::updateRecentFiles ( const QString& sFilename )
1308  {  {
# Line 1220  void qsamplerMainForm::updateRecentFiles Line 1347  void qsamplerMainForm::updateRecentFiles
1347  }  }
1348    
1349    
1350    // Force update of the channels instrument names mode.
1351    void qsamplerMainForm::updateInstrumentNames (void)
1352    {
1353        // Full channel list update...
1354        QWidgetList wlist = m_pWorkspace->windowList();
1355        if (wlist.isEmpty())
1356            return;
1357    
1358        m_pWorkspace->setUpdatesEnabled(false);
1359        for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1360            qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1361            if (pChannelStrip)
1362                pChannelStrip->updateInstrumentName(true);
1363        }
1364        m_pWorkspace->setUpdatesEnabled(true);
1365    }
1366    
1367    
1368  // Force update of the channels display font.  // Force update of the channels display font.
1369  void qsamplerMainForm::updateDisplayFont (void)  void qsamplerMainForm::updateDisplayFont (void)
1370  {  {
# Line 1397  qsamplerChannelStrip *qsamplerMainForm:: Line 1542  qsamplerChannelStrip *qsamplerMainForm::
1542          QWidgetList wlist = m_pWorkspace->windowList();          QWidgetList wlist = m_pWorkspace->windowList();
1543          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {          for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1544              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);              pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1545          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();                          if (pChannelStrip) {
1546              y += pChannelStrip->parentWidget()->frameGeometry().height();                          //  y += pChannelStrip->height() + pChannelStrip->parentWidget()->baseSize().height();
1547                                    y += pChannelStrip->parentWidget()->frameGeometry().height();
1548                            }
1549          }          }
1550      }      }
1551    
# Line 1432  qsamplerChannelStrip *qsamplerMainForm:: Line 1579  qsamplerChannelStrip *qsamplerMainForm::
1579          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();          int iHeight = pChannelStrip->parentWidget()->frameGeometry().height();
1580          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);          pChannelStrip->parentWidget()->setGeometry(0, y, iWidth, iHeight);
1581      }      }
1582        
1583            // This is pretty new, so we'll watch for it closely.
1584            channelStripChanged(pChannelStrip);
1585    
1586      // Return our successful reference...      // Return our successful reference...
1587      return pChannelStrip;      return pChannelStrip;
1588  }  }
# Line 1450  qsamplerChannelStrip *qsamplerMainForm:: Line 1600  qsamplerChannelStrip *qsamplerMainForm::
1600  {  {
1601      QWidgetList wlist = m_pWorkspace->windowList();      QWidgetList wlist = m_pWorkspace->windowList();
1602      if (wlist.isEmpty())      if (wlist.isEmpty())
1603          return 0;          return NULL;
1604    
1605      return (qsamplerChannelStrip *) wlist.at(iChannel);      return (qsamplerChannelStrip *) wlist.at(iChannel);
1606  }  }
1607    
1608    
1609    // Retrieve a channel strip by sampler channel id.
1610    qsamplerChannelStrip *qsamplerMainForm::channelStrip ( int iChannelID )
1611    {
1612            QWidgetList wlist = m_pWorkspace->windowList();
1613            if (wlist.isEmpty())
1614                    return NULL;
1615            
1616            for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1617                    qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1618                    if (pChannelStrip) {
1619                            qsamplerChannel *pChannel = pChannelStrip->channel();
1620                            if (pChannel && pChannel->channelID() == iChannelID)
1621                                    return pChannelStrip;
1622                    }
1623            }
1624    
1625            // Not found.
1626            return NULL;
1627    }
1628    
1629    
1630  // Construct the windows menu.  // Construct the windows menu.
1631  void qsamplerMainForm::channelsMenuAboutToShow (void)  void qsamplerMainForm::channelsMenuAboutToShow (void)
1632  {  {
# Line 1524  void qsamplerMainForm::timerSlot (void) Line 1695  void qsamplerMainForm::timerSlot (void)
1695      }      }
1696            
1697          // Refresh each channel usage, on each period...          // Refresh each channel usage, on each period...
1698      if (m_pClient && (m_iChangeCount > 0 || m_pOptions->bAutoRefresh)) {      if (m_pClient && (m_changedStrips.count() > 0 || m_pOptions->bAutoRefresh)) {
1699          m_iTimerSlot += QSAMPLER_TIMER_MSECS;          m_iTimerSlot += QSAMPLER_TIMER_MSECS;
1700          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {          if (m_iTimerSlot >= m_pOptions->iAutoRefreshTime && m_pWorkspace->isUpdatesEnabled())  {
1701              m_iTimerSlot = 0;              m_iTimerSlot = 0;
1702              m_iChangeCount = 0;              // Update the channel information for each pending strip...
1703                for (qsamplerChannelStrip *pChannelStrip = m_changedStrips.first();
1704                        pChannelStrip;
1705                                                    pChannelStrip = m_changedStrips.next()) {
1706                                    // If successfull, remove from pending list...
1707                                    if (pChannelStrip->updateChannelInfo())
1708                        m_changedStrips.remove(pChannelStrip);
1709                            }
1710                // Update the channel stream usage for each strip...
1711              QWidgetList wlist = m_pWorkspace->windowList();              QWidgetList wlist = m_pWorkspace->windowList();
1712              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {              for (int iChannel = 0; iChannel < (int) wlist.count(); iChannel++) {
1713                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);                  qsamplerChannelStrip *pChannelStrip = (qsamplerChannelStrip *) wlist.at(iChannel);
1714                  if (pChannelStrip && pChannelStrip->isVisible()) {                  if (pChannelStrip && pChannelStrip->isVisible())
1715                      // If we can't make it clean, try next time.                      pChannelStrip->updateChannelUsage();
                     if (!pChannelStrip->updateChannelUsage())  
                         m_iChangeCount++;  
                 }  
1716              }              }
1717          }          }
1718      }      }
# Line 1729  bool qsamplerMainForm::startClient (void Line 1905  bool qsamplerMainForm::startClient (void
1905      // Log success here.      // Log success here.
1906      appendMessages(tr("Client connected."));      appendMessages(tr("Client connected."));
1907    
1908            // Hard-notify device configuration form,
1909            // if visible, that we're ready...
1910            if (m_pDeviceForm && m_pDeviceForm->isVisible())
1911                m_pDeviceForm->setClient(m_pClient);
1912                
1913      // Is any session pending to be loaded?      // Is any session pending to be loaded?
1914      if (!m_pOptions->sSessionFile.isEmpty()) {      if (!m_pOptions->sSessionFile.isEmpty()) {
1915          // Just load the prabably startup session...          // Just load the prabably startup session...
# Line 1749  void qsamplerMainForm::stopClient (void) Line 1930  void qsamplerMainForm::stopClient (void)
1930      if (m_pClient == NULL)      if (m_pClient == NULL)
1931          return;          return;
1932    
1933            // Hard-notify device configuration form,
1934            // if visible, that we're running out...
1935            if (m_pDeviceForm && m_pDeviceForm->isVisible())
1936                m_pDeviceForm->setClient(NULL);
1937    
1938      // Log prepare here.      // Log prepare here.
1939      appendMessages(tr("Client disconnecting..."));      appendMessages(tr("Client disconnecting..."));
1940    

Legend:
Removed from v.344  
changed lines
  Added in v.433

  ViewVC Help
Powered by ViewVC