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

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

  ViewVC Help
Powered by ViewVC