diff --git a/src/audio/inputdevicemodel.cpp b/src/audio/inputdevicemodel.cpp index 96b72546f877fce7bae34fa7dabef781ed0ccd09..f9b7a4f06d506c12aec69505e55a1709f6cc1701 100644 --- a/src/audio/inputdevicemodel.cpp +++ b/src/audio/inputdevicemodel.cpp @@ -31,6 +31,7 @@ public: InputDeviceModelPrivate(Audio::InputDeviceModel* parent); QStringList m_lDeviceList; mutable QItemSelectionModel* m_pSelectionModel; + QModelIndex currentDevice() const; private: Audio::InputDeviceModel* q_ptr; @@ -62,6 +63,7 @@ d_ptr(new InputDeviceModelPrivate(this)) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList (); + connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload())); } ///Destructor @@ -123,10 +125,21 @@ QItemSelectionModel* Audio::InputDeviceModel::selectionModel() const return d_ptr->m_pSelectionModel; } +///Return the current ringtone device +QModelIndex InputDeviceModelPrivate::currentDevice() const +{ + ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); + const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex(); + const int idx = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::INPUT)].toInt(); + if (idx >= m_lDeviceList.size()) + return QModelIndex(); + return q_ptr->index(idx,0); +} + ///Set the current input device void InputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) { - if (index.isValid()) { + if (index.isValid() and index != currentDevice()) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); configurationManager.setAudioInputDevice(index.row()); } @@ -135,7 +148,6 @@ void InputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) ///Reload input device list void Audio::InputDeviceModel::reload() { - const int currentRow = selectionModel()->currentIndex().row(); ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); beginResetModel(); d_ptr->m_lDeviceList = configurationManager.getAudioInputDeviceList (); @@ -144,7 +156,7 @@ void Audio::InputDeviceModel::reload() emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0)); // Restore the selection - d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect); + selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect); } #include <inputdevicemodel.moc> diff --git a/src/audio/inputdevicemodel.h b/src/audio/inputdevicemodel.h index 539b3bd4f9c2314ec7787029868c592844484732..0b17442f774baae469123b38197d59bd31b98100 100644 --- a/src/audio/inputdevicemodel.h +++ b/src/audio/inputdevicemodel.h @@ -46,7 +46,7 @@ public: //Getters QItemSelectionModel* selectionModel() const; - //Mutator +public Q_SLOTS: void reload(); private: diff --git a/src/audio/outputdevicemodel.cpp b/src/audio/outputdevicemodel.cpp index b08433eb004c1d229d58b5722b9fb252f2a680ee..d1b55e59f86f253650624ea971dae6ba6b13384a 100644 --- a/src/audio/outputdevicemodel.cpp +++ b/src/audio/outputdevicemodel.cpp @@ -32,6 +32,7 @@ public: OutputDeviceModelPrivate(Audio::OutputDeviceModel* parent); QStringList m_lDeviceList; mutable QItemSelectionModel* m_pSelectionModel; + QModelIndex currentDevice() const; private: Audio::OutputDeviceModel* q_ptr; @@ -53,6 +54,7 @@ d_ptr(new OutputDeviceModelPrivate(this)) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList(); + connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload())); } ///Destructor @@ -125,10 +127,21 @@ QItemSelectionModel* Audio::OutputDeviceModel::selectionModel() const return d_ptr->m_pSelectionModel; } +///Return the current ringtone device +QModelIndex OutputDeviceModelPrivate::currentDevice() const +{ + ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); + const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex(); + const int idx = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::OUTPUT)].toInt(); + if (idx >= m_lDeviceList.size()) + return QModelIndex(); + return q_ptr->index(idx,0); +} + ///Set the current output device void OutputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) { - if (index.isValid()) { + if (index.isValid() and index != currentDevice()) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); configurationManager.setAudioOutputDevice(index.row()); } @@ -137,8 +150,6 @@ void OutputDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) ///reload output devices list void Audio::OutputDeviceModel::reload() { - const int currentRow = selectionModel()->currentIndex().row(); - ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); beginResetModel(); d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList(); @@ -147,7 +158,7 @@ void Audio::OutputDeviceModel::reload() emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0)); // Restore the selection - d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect); + selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect); } diff --git a/src/audio/outputdevicemodel.h b/src/audio/outputdevicemodel.h index 03fb6b7fe80840ad5a2a927330b623caefbaf199..2495113aa348529006e0a156c90a4b071c783191 100644 --- a/src/audio/outputdevicemodel.h +++ b/src/audio/outputdevicemodel.h @@ -46,12 +46,12 @@ public: //Getters QItemSelectionModel* selectionModel() const; - //Mutator - void reload(); - //Static methods static void playDTMF(const QString& str); +public Q_SLOTS: + void reload(); + private: QScopedPointer<OutputDeviceModelPrivate> d_ptr; Q_DECLARE_PRIVATE(OutputDeviceModel) diff --git a/src/audio/ringtonedevicemodel.cpp b/src/audio/ringtonedevicemodel.cpp index b9698dccc6f5ea18bc9cbc396192891687ebca22..72b9167c4f32887049b14fe5ff172356a52302d7 100644 --- a/src/audio/ringtonedevicemodel.cpp +++ b/src/audio/ringtonedevicemodel.cpp @@ -31,6 +31,7 @@ public: RingtoneDeviceModelPrivate(Audio::RingtoneDeviceModel* parent); QStringList m_lDeviceList; mutable QItemSelectionModel* m_pSelectionModel; + QModelIndex currentDevice() const; private: Audio::RingtoneDeviceModel* q_ptr; @@ -51,6 +52,7 @@ d_ptr(new RingtoneDeviceModelPrivate(this)) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList(); + connect(&configurationManager, SIGNAL(audioDeviceEvent()), this, SLOT(reload())); } ///Destructor @@ -124,20 +126,20 @@ QItemSelectionModel* Audio::RingtoneDeviceModel::selectionModel() const } ///Return the current ringtone device -QModelIndex Audio::RingtoneDeviceModel::currentDevice() const +QModelIndex RingtoneDeviceModelPrivate::currentDevice() const { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); const QStringList currentDevices = configurationManager.getCurrentAudioDevicesIndex(); const int idx = currentDevices[static_cast<int>(Audio::Settings::DeviceIndex::RINGTONE)].toInt(); - if (idx >= d_ptr->m_lDeviceList.size()) + if (idx >= m_lDeviceList.size()) return QModelIndex(); - return index(idx,0); + return q_ptr->index(idx,0); } ///Set the current ringtone device void RingtoneDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) { - if (index.isValid()) { + if (index.isValid() and index != currentDevice()) { ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); configurationManager.setAudioRingtoneDevice(index.row()); } @@ -146,8 +148,6 @@ void RingtoneDeviceModelPrivate::setCurrentDevice(const QModelIndex& index) ///Reload ringtone device list void Audio::RingtoneDeviceModel::reload() { - const int currentRow = selectionModel()->currentIndex().row(); - ConfigurationManagerInterface& configurationManager = ConfigurationManager::instance(); beginResetModel(); d_ptr->m_lDeviceList = configurationManager.getAudioOutputDeviceList(); @@ -156,7 +156,7 @@ void Audio::RingtoneDeviceModel::reload() emit dataChanged(index(0,0),index(d_ptr->m_lDeviceList.size()-1,0)); // Restore the selection - d_ptr->m_pSelectionModel->setCurrentIndex(index(currentRow,0), QItemSelectionModel::ClearAndSelect); + selectionModel()->setCurrentIndex(d_ptr->currentDevice(), QItemSelectionModel::ClearAndSelect); } diff --git a/src/audio/ringtonedevicemodel.h b/src/audio/ringtonedevicemodel.h index d052f9cee69f2e759b8749c8033b1281fbf8ea50..698c03f9aa440661ee4ab4c2c059cd2e20a10dda 100644 --- a/src/audio/ringtonedevicemodel.h +++ b/src/audio/ringtonedevicemodel.h @@ -44,10 +44,9 @@ public: virtual QHash<int,QByteArray> roleNames() const override; //Getters - QModelIndex currentDevice() const; QItemSelectionModel* selectionModel() const; - //Mutator +public Q_SLOTS: void reload(); private: diff --git a/xml/configurationmanager-introspec.xml b/xml/configurationmanager-introspec.xml index 202e4cbf83979e3dcf8b0a151e4a00aef0ef844a..cb93b51280ef3f283c6b1e21c6836a513829f362 100644 --- a/xml/configurationmanager-introspec.xml +++ b/xml/configurationmanager-introspec.xml @@ -441,6 +441,10 @@ </arg> </method> + <signal name="audioDeviceEvent" tp:name-for-bindings="audioDeviceEvent"> + <tp:docstring>Signal triggered by changes in the detected audio devices, e.g. a headset being unplugged.</tp:docstring> + </signal> + <method name="getAudioOutputDeviceList" tp:name-for-bindings="getAudioOutputDeviceList"> <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/> <arg type="as" name="list" direction="out">