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

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

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

revision 1716 by schoenebeck, Tue Mar 11 16:01:44 2008 UTC revision 2038 by capela, Thu Jan 7 18:42:26 2010 UTC
# Line 2  Line 2 
2  //  //
3  /****************************************************************************  /****************************************************************************
4     Copyright (C) 2008, Christian Schoenebeck     Copyright (C) 2008, Christian Schoenebeck
5       Copyright (C) 2010, rncbc aka Rui Nuno Capela. All rights reserved.
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 21  Line 22 
22    
23  #include "qsamplerAbout.h"  #include "qsamplerAbout.h"
24  #include "qsamplerDeviceStatusForm.h"  #include "qsamplerDeviceStatusForm.h"
25    
26  #include "qsamplerMainForm.h"  #include "qsamplerMainForm.h"
27    
28  #include <QGridLayout>  #include <QGridLayout>
29    
 #define MIDI_OFF_COLOR                  Qt::darkGreen  
 #define MIDI_ON_COLOR                   Qt::green  
30    
31  namespace QSampler {  namespace QSampler {
32    
# Line 34  namespace QSampler { Line 34  namespace QSampler {
34  // QSampler::MidiActivityLED -- Graphical indicator for MIDI activity.  // QSampler::MidiActivityLED -- Graphical indicator for MIDI activity.
35  //  //
36    
37  MidiActivityLED::MidiActivityLED(QString text, QWidget* parent) : QLabel(text, parent) {  // MIDI activity pixmap common resources.
38  #if CONFIG_EVENT_DEVICE_MIDI  int      MidiActivityLED::g_iMidiActivityRefCount = 0;
39          setPalette(MIDI_OFF_COLOR);  QPixmap *MidiActivityLED::g_pMidiActivityLedOn    = NULL;
40          setAutoFillBackground(true);  QPixmap *MidiActivityLED::g_pMidiActivityLedOff   = NULL;
41  #else  
42          setText("X");  
43          setToolTip("MIDI Activity Disabled\n(at compile time)");  MidiActivityLED::MidiActivityLED ( QString sText, QWidget *pParent )
44            : QLabel(sText, pParent)
45    {
46            if (++g_iMidiActivityRefCount == 1) {
47                    g_pMidiActivityLedOn  = new QPixmap(":/icons/ledon1.png");
48                    g_pMidiActivityLedOff = new QPixmap(":/icons/ledoff1.png");
49            }
50    
51            setPixmap(*g_pMidiActivityLedOff);
52    #ifndef CONFIG_EVENT_DEVICE_MIDI
53            setToolTip("MIDI Activity disabled");
54  #endif  #endif
55          timer.setSingleShot(true);          m_timer.setSingleShot(true);
56          QObject::connect(  
57                  &timer, SIGNAL(timeout()),          QObject::connect(&m_timer,
58                  this, SLOT(midiDataCeased())                  SIGNAL(timeout()),
59                    SLOT(midiActivityLedOff())
60          );          );
61  }  }
62    
63  void MidiActivityLED::midiDataArrived() {  MidiActivityLED::~MidiActivityLED (void)
64  #if CONFIG_EVENT_DEVICE_MIDI  {
65          setPalette(MIDI_ON_COLOR);          if (--g_iMidiActivityRefCount == 0) {
66          timer.start(50);                  if (g_pMidiActivityLedOn)
67  #endif                          delete g_pMidiActivityLedOn;
68                    g_pMidiActivityLedOn = NULL;
69                    if (g_pMidiActivityLedOff)
70                            delete g_pMidiActivityLedOff;
71                    g_pMidiActivityLedOff = NULL;
72            }
73  }  }
74    
75  void MidiActivityLED::midiDataCeased() {  
76  #if CONFIG_EVENT_DEVICE_MIDI  void MidiActivityLED::midiActivityLedOn (void)
77          setPalette(MIDI_OFF_COLOR);  {
78  #endif          setPixmap(*g_pMidiActivityLedOn);
79            m_timer.start(100);
80    }
81    
82    
83    void MidiActivityLED::midiActivityLedOff (void)
84    {
85            setPixmap(*g_pMidiActivityLedOff);
86  }  }
87    
88    
89  //-------------------------------------------------------------------------  //-------------------------------------------------------------------------
90  // QSampler::DeviceStatusForm -- Device status informations window.  // QSampler::DeviceStatusForm -- Device status informations window.
91  //  //
92    
93  std::map<int, DeviceStatusForm*> DeviceStatusForm::instances;  std::map<int, DeviceStatusForm *> DeviceStatusForm::g_instances;
94    
95    
96  DeviceStatusForm::DeviceStatusForm (  DeviceStatusForm::DeviceStatusForm (
97          int DeviceID, QWidget* pParent, Qt::WindowFlags wflags )          int DeviceID, QWidget *pParent, Qt::WindowFlags wflags )
98          : QMainWindow(pParent, wflags)          : QWidget(pParent, wflags)
99  {  {
100          m_pDevice = new Device(Device::Midi, DeviceID);          m_pDevice = new Device(Device::Midi, DeviceID);
101    
102          if (!centralWidget()) setCentralWidget(new QWidget(this));          setLayout(new QGridLayout(/*this*/));
   
         QGridLayout* pLayout = new QGridLayout(centralWidget());  
         centralWidget()->setLayout(pLayout);  
103          updateGUIPorts(); // build the GUI          updateGUIPorts(); // build the GUI
104    
105          m_pVisibleAction = new QAction(this);          m_pVisibleAction = new QAction(this);
# Line 88  DeviceStatusForm::DeviceStatusForm ( Line 110  DeviceStatusForm::DeviceStatusForm (
110                  QString("MIDI Device ID: ") +                  QString("MIDI Device ID: ") +
111                  QString::number(m_pDevice->deviceID())                  QString::number(m_pDevice->deviceID())
112          );          );
113          QObject::connect(  
114                  m_pVisibleAction, SIGNAL(toggled(bool)),          QObject::connect(m_pVisibleAction,
115                  this, SLOT(setVisible(bool))                  SIGNAL(toggled(bool)),
116                    SLOT(setVisible(bool))
117          );          );
118    
119          setWindowTitle(m_pDevice->deviceName() + " Status");          setWindowTitle(tr("%1 Status").arg(m_pDevice->deviceName()));
120  }  }
121    
122  void DeviceStatusForm::updateGUIPorts() {  
123    void DeviceStatusForm::updateGUIPorts (void)
124    {
125          // refresh device informations          // refresh device informations
126          m_pDevice->setDevice(m_pDevice->deviceType(), m_pDevice->deviceID());          m_pDevice->setDevice(m_pDevice->deviceType(), m_pDevice->deviceID());
127          DevicePortList ports = m_pDevice->ports();          DevicePortList ports = m_pDevice->ports();
128    
129          // clear the GUI          // clear the GUI
130          QGridLayout* pLayout = (QGridLayout*) centralWidget()->layout();          QGridLayout *pLayout = static_cast<QGridLayout *> (layout());
131          for (int i = pLayout->count() - 1; i >= 0; --i) {          for (int i = pLayout->count() - 1; i >= 0; --i) {
132                  QLayoutItem* pItem = pLayout->itemAt(i);                  QLayoutItem *pItem = pLayout->itemAt(i);
133                  if (!pItem) continue;                  if (pItem) {
134                  pLayout->removeItem(pItem);                          pLayout->removeItem(pItem);
135                  if (pItem->widget()) delete pItem->widget();                          if (pItem->widget())
136                  delete pItem;                                  delete pItem->widget();
137                            delete pItem;
138                    }
139          }          }
140          midiActivityLEDs.clear();  
141            m_midiActivityLEDs.clear();
142    
143          // rebuild the GUI          // rebuild the GUI
144          for (int i = 0; i < ports.size(); ++i) {          for (int i = 0; i < ports.size(); ++i) {
145                  QLabel* pLabel =                  QLabel *pLabel
146                          new QLabel(QString("MIDI port \"") + ports[i]->portName() + "\": ");                          = new QLabel(tr("MIDI port %1").arg(ports[i]->portName()));
147                  pLabel->setToolTip(QString("Device ID ") + QString::number(ports[i]->portID()));                  pLabel->setToolTip(tr("Device ID %1").arg(ports[i]->portID()));
148                  pLayout->addWidget(pLabel, i, 0, Qt::AlignLeft);                  pLayout->addWidget(pLabel, i, 0, Qt::AlignLeft);
149                  MidiActivityLED* pLED = new MidiActivityLED();                  MidiActivityLED *pLED = new MidiActivityLED();
150                  midiActivityLEDs.push_back(pLED);                  m_midiActivityLEDs.push_back(pLED);
151                  pLayout->addWidget(pLED, i, 1);                  pLayout->addWidget(pLED, i, 1);
152          }          }
153  }  }
154    
155  DeviceStatusForm::~DeviceStatusForm() {  
156    DeviceStatusForm::~DeviceStatusForm (void)
157    {
158          if (m_pDevice) delete m_pDevice;          if (m_pDevice) delete m_pDevice;
159  }  }
160    
161  QAction* DeviceStatusForm::visibleAction() {  
162    QAction* DeviceStatusForm::visibleAction (void)
163    {
164          return m_pVisibleAction;          return m_pVisibleAction;
165  }  }
166    
167  void DeviceStatusForm::closeEvent(QCloseEvent* event) {  void DeviceStatusForm::closeEvent ( QCloseEvent *pCloseEvent )
168    {
169          m_pVisibleAction->setChecked(false);          m_pVisibleAction->setChecked(false);
170          event->accept();  
171            pCloseEvent->accept();
172  }  }
173    
174  void DeviceStatusForm::midiArrived(int iPort) {  
175          if (uint(iPort) >= midiActivityLEDs.size()) return;  void DeviceStatusForm::midiArrived ( int iPort )
176          midiActivityLEDs[iPort]->midiDataArrived();  {
177            if (uint(iPort) >= m_midiActivityLEDs.size())
178                    return;
179    
180            m_midiActivityLEDs[iPort]->midiActivityLedOn();
181  }  }
182    
183  DeviceStatusForm* DeviceStatusForm::getInstance(int iDeviceID) {  
184          std::map<int, DeviceStatusForm*>::iterator iter =  DeviceStatusForm *DeviceStatusForm::getInstance ( int iDeviceID )
185                  instances.find(iDeviceID);  {
186          return (iter != instances.end()) ? iter->second : NULL;          std::map<int, DeviceStatusForm *>::iterator iter
187                    = g_instances.find(iDeviceID);
188            return ((iter != g_instances.end()) ? iter->second : NULL);
189  }  }
190    
191  const std::map<int, DeviceStatusForm*>& DeviceStatusForm::getInstances() {  
192          return instances;  const std::map<int, DeviceStatusForm *>& DeviceStatusForm::getInstances (void)
193    {
194            return g_instances;
195  }  }
196    
197  void DeviceStatusForm::deleteAllInstances() {  void DeviceStatusForm::deleteAllInstances (void)
198          for (  {
199                  std::map<int, DeviceStatusForm*>::iterator iter = instances.begin();          std::map<int, DeviceStatusForm *>::iterator iter = g_instances.begin();
200                  iter != instances.end(); ++iter          for ( ; iter != g_instances.end(); ++iter) {
         ) {  
201                  iter->second->hide();                  iter->second->hide();
202                  delete iter->second;                  delete iter->second;
203          }          }
204          instances.clear();  
205            g_instances.clear();
206  }  }
207    
208  void DeviceStatusForm::onDevicesChanged() {  
209    void DeviceStatusForm::onDevicesChanged (void)
210    {
211          MainForm* pMainForm = MainForm::getInstance();          MainForm* pMainForm = MainForm::getInstance();
212          if (pMainForm && pMainForm->client()) {          if (pMainForm && pMainForm->client()) {
213                  std::set<int> deviceIDs =                  std::set<int> deviceIDs
214                          Device::getDeviceIDs(pMainForm->client(), Device::Midi);                          = Device::getDeviceIDs(pMainForm->client(), Device::Midi);
215                  // hide and delete status forms whose device has been destroyed                  // hide and delete status forms whose device has been destroyed
216                  for (                  std::map<int, DeviceStatusForm *>::iterator iter = g_instances.begin();
217                          std::map<int, DeviceStatusForm*>::iterator iter = instances.begin();                  for ( ; iter != g_instances.end(); ++iter) {
                         iter != instances.end(); ++iter  
                 ) {  
218                          if (deviceIDs.find(iter->first) == deviceIDs.end()) {                          if (deviceIDs.find(iter->first) == deviceIDs.end()) {
219                                  iter->second->hide();                                  iter->second->hide();
220                                  delete iter->second;                                  delete iter->second;
221                                  instances.erase(iter);                                  g_instances.erase(iter);
222                          }                          }
223                  }                  }
224                  // create status forms for new devices                  // create status forms for new devices
225                  for (                  std::set<int>::iterator it = deviceIDs.begin();
226                          std::set<int>::iterator iter = deviceIDs.begin();                  for ( ; it != deviceIDs.end(); ++iter) {
227                          iter != deviceIDs.end(); ++iter                          if (g_instances.find(*it) == g_instances.end()) {
228                  ) {                                  // What style do we create these forms?
229                          if (instances.find(*iter) == instances.end()) {                                  Qt::WindowFlags wflags = Qt::Window
230                                  DeviceStatusForm* pStatusForm =                                          | Qt::CustomizeWindowHint
231                                          new DeviceStatusForm(*iter);                                          | Qt::WindowTitleHint
232                                  instances[*iter] = pStatusForm;                                          | Qt::WindowSystemMenuHint
233                                            | Qt::WindowMinMaxButtonsHint
234                                            | Qt::WindowCloseButtonHint;
235                                    Options *pOptions = pMainForm->options();
236                                    if (pOptions && pOptions->bKeepOnTop)
237                                            wflags |= Qt::Tool;
238                                    // Create the form, giving it the device id.
239                                    DeviceStatusForm *pStatusForm
240                                            = new DeviceStatusForm(*it, NULL, wflags);
241                                    g_instances[*it] = pStatusForm;
242                          }                          }
243                  }                  }
244          }          }
245  }  }
246    
247  void DeviceStatusForm::onDeviceChanged(int iDeviceID) {  
248          DeviceStatusForm* pForm = DeviceStatusForm::getInstance(iDeviceID);  void DeviceStatusForm::onDeviceChanged ( int iDeviceID )
249          if (!pForm) return;  {
250          pForm->updateGUIPorts();          DeviceStatusForm *pStatusForm
251                    = DeviceStatusForm::getInstance(iDeviceID);
252            if (pStatusForm)
253                    pStatusForm->updateGUIPorts();
254  }  }
255    
256    
257  } // namespace QSampler  } // namespace QSampler
258    
259  // end of qsamplerDeviceStatusForm.cpp  // end of qsamplerDeviceStatusForm.cpp

Legend:
Removed from v.1716  
changed lines
  Added in v.2038

  ViewVC Help
Powered by ViewVC