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

Legend:
Removed from v.1703  
changed lines
  Added in v.2459

  ViewVC Help
Powered by ViewVC