From ca9ff6086b048c544a971cc6e681044bd28d592c Mon Sep 17 00:00:00 2001 From: Oleg Samarin Date: Fri, 31 Dec 2021 14:18:53 +0300 Subject: [PATCH] Separated file GOSettingsMidiDeviceList https://github.com/GrandOrgue/grandorgue/issues/885 --- src/grandorgue/CMakeLists.txt | 1 + .../settings/GOSettingsMidiDeviceList.cpp | 125 +++++++++++++++++ .../settings/GOSettingsMidiDeviceList.h | 66 +++++++++ .../settings/SettingsMidiDevices.cpp | 130 ++---------------- src/grandorgue/settings/SettingsMidiDevices.h | 47 +------ 5 files changed, 203 insertions(+), 166 deletions(-) create mode 100644 src/grandorgue/settings/GOSettingsMidiDeviceList.cpp create mode 100644 src/grandorgue/settings/GOSettingsMidiDeviceList.h diff --git a/src/grandorgue/CMakeLists.txt b/src/grandorgue/CMakeLists.txt index 37b3dc965..2d21dda81 100644 --- a/src/grandorgue/CMakeLists.txt +++ b/src/grandorgue/CMakeLists.txt @@ -147,6 +147,7 @@ GOPanelView.cpp settings/GOMidiDeviceConfig.cpp settings/GOMidiDeviceConfigList.cpp settings/GOPortFactory.cpp +settings/GOSettingsMidiDeviceList.cpp settings/GOSettingsPorts.cpp settings/SettingsArchives.cpp settings/SettingsAudioGroup.cpp diff --git a/src/grandorgue/settings/GOSettingsMidiDeviceList.cpp b/src/grandorgue/settings/GOSettingsMidiDeviceList.cpp new file mode 100644 index 000000000..4bd05203e --- /dev/null +++ b/src/grandorgue/settings/GOSettingsMidiDeviceList.cpp @@ -0,0 +1,125 @@ +/* +* Copyright 2006 Milan Digital Audio LLC +* Copyright 2009-2021 GrandOrgue contributors (see AUTHORS) +* License GPL-2.0 or later (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html). +*/ + +#include "GOSettingsMidiDeviceList.h" + +GOSettingsMidiDeviceList::GOSettingsMidiDeviceList( + const ptr_vector& ports, + GOMidiDeviceConfigList& configListPersist, + wxWindow* parent, + wxWindowID id +): + m_parent(parent), m_Ports(ports), m_ConfList(configListPersist) +{ + m_LbDevices = new wxCheckListBox( + parent, id, wxDefaultPosition, wxSize(100, 100) + ); + m_LbDevices->Bind( + wxEVT_CHECKLISTBOX, + &GOSettingsMidiDeviceList::OnChecked, + this + ); + Init(); +} + +void GOSettingsMidiDeviceList::ClearDevices() +{ + // We cann't use lbDevices->Clear() because it disables the event handler + for (int i = m_LbDevices->GetCount() - 1; i >= 0; i--) + m_LbDevices->Delete(i); + m_ListedConfs.clear(); +} + +void GOSettingsMidiDeviceList::Init() +{ + ClearDevices(); + m_ConfListTmp.Clear(); +} + +void GOSettingsMidiDeviceList::RefreshDevices( + const GOPortsConfig& portsConfig, + const bool isToAutoEnable, + const GOSettingsMidiDeviceList* pOutDevList +) +{ + ClearDevices(); + for (GOMidiPort* port : m_Ports) + if ( + port->IsToUse() + && portsConfig.IsEnabled(port->GetPortName(), port->GetApiName()) + ) + { + const wxString physicalName = port->GetName(); + GOMidiDeviceConfig* const pConf + = m_ConfList.FindByPhysicalName(physicalName); + GOMidiDeviceConfig* pConfTmp + = m_ConfListTmp.FindByPhysicalName(physicalName); + + if (! pConfTmp) + pConfTmp = pConf + ? m_ConfListTmp.Append( + *pConf, pOutDevList ? &pOutDevList->m_ConfListTmp : NULL + ) + : m_ConfListTmp.Append( + port->GetDefaultLogicalName(), + port->GetDefaultRegEx(), + isToAutoEnable, + physicalName + ); + + m_ListedConfs.push_back(pConfTmp); + + const int i = m_LbDevices->Append(physicalName); + + if (pConfTmp->m_IsEnabled) + m_LbDevices->Check(i); + } +} + +unsigned GOSettingsMidiDeviceList::GetDeviceCount() const +{ + return m_LbDevices->GetCount(); +} + +GOMidiDeviceConfig& + GOSettingsMidiDeviceList::GetSelectedDeviceConf() + const +{ + return GetDeviceConf(m_LbDevices->GetSelection()); +} + +void GOSettingsMidiDeviceList::OnSelected(wxCommandEvent& event) +{ +} + +void GOSettingsMidiDeviceList::OnChecked(wxCommandEvent& event) +{ + unsigned i = (unsigned) event.GetInt(); + + GetDeviceConf(i).m_IsEnabled = m_LbDevices->IsChecked(i); +} + +void GOSettingsMidiDeviceList::Save( + const GOSettingsMidiDeviceList* pOutDevList +) +{ + for (GOMidiDeviceConfig* pDevConfTmp : m_ListedConfs) + { + GOMidiDeviceConfig* pDevConf = m_ConfList.FindByPhysicalName( + pDevConfTmp->m_PhysicalName + ); + const GOMidiDeviceConfigList* pOutConfList + = pOutDevList ? & pOutDevList->m_ConfList : NULL; + + if (pDevConf) + { + pDevConf->Assign(*pDevConfTmp); + if (pOutConfList) + pOutConfList->MapOutputDevice(*pDevConfTmp, *pDevConf); + } else + m_ConfList.Append(*pDevConfTmp, pOutConfList); + } +} diff --git a/src/grandorgue/settings/GOSettingsMidiDeviceList.h b/src/grandorgue/settings/GOSettingsMidiDeviceList.h new file mode 100644 index 000000000..64a363972 --- /dev/null +++ b/src/grandorgue/settings/GOSettingsMidiDeviceList.h @@ -0,0 +1,66 @@ +/* +* Copyright 2006 Milan Digital Audio LLC +* Copyright 2009-2021 GrandOrgue contributors (see AUTHORS) +* License GPL-2.0 or later (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html). +*/ + +#ifndef GOSETTINGSMIDIDEVICELIST_H +#define GOSETTINGSMIDIDEVICELIST_H + +#include +#include +#include + +#include "ptrvector.h" + +#include "midi/ports/GOMidiPort.h" + +#include "GOMidiDeviceConfigList.h" +#include "GOPortsConfig.h" + +class GOSettingsMidiDeviceList +{ +private: + wxWindow* m_parent; + const ptr_vector& m_Ports; + GOMidiDeviceConfigList& m_ConfList; + GOMidiDeviceConfig::List m_ListedConfs; + wxCheckListBox* m_LbDevices; + + // temporary storage for configs when edited + GOMidiDeviceConfigList m_ConfListTmp; + + void ClearDevices(); + + void OnChecked(wxCommandEvent& event); + +public: + GOSettingsMidiDeviceList( + const ptr_vector& ports, + GOMidiDeviceConfigList& configListPersist, + wxWindow* parent, + wxWindowID id + ); + + wxCheckListBox* GetListbox() const { return m_LbDevices; } + + void Init(); + + void RefreshDevices( + const GOPortsConfig& portsConfig, + const bool isToAutoEnable, + const GOSettingsMidiDeviceList* pOutDevList = NULL + ); + + unsigned GetDeviceCount() const; + GOMidiDeviceConfig& GetDeviceConf(unsigned i) const { return *m_ListedConfs[i]; } + GOMidiDeviceConfig& GetSelectedDeviceConf() const; + + void OnSelected(wxCommandEvent& event); + + void Save(const GOSettingsMidiDeviceList* pOutDevList = NULL); +}; + + +#endif /* GOSETTINGSMIDIDEVICELIST_H */ + diff --git a/src/grandorgue/settings/SettingsMidiDevices.cpp b/src/grandorgue/settings/SettingsMidiDevices.cpp index d5586bd8b..194dd5f8d 100644 --- a/src/grandorgue/settings/SettingsMidiDevices.cpp +++ b/src/grandorgue/settings/SettingsMidiDevices.cpp @@ -7,7 +7,6 @@ #include "SettingsMidiDevices.h" #include -#include #include #include #include @@ -25,125 +24,6 @@ BEGIN_EVENT_TABLE(SettingsMidiDevices, wxPanel) EVT_BUTTON(ID_INOUTDEVICE, SettingsMidiDevices::OnInOutDeviceClick) END_EVENT_TABLE() -SettingsMidiDevices::MidiDeviceListSettings::MidiDeviceListSettings( - const ptr_vector& ports, - GOMidiDeviceConfigList& configListPersist, - wxWindow* parent, - wxWindowID id -): - m_Ports(ports), m_ConfList(configListPersist) -{ - m_LbDevices = new wxCheckListBox( - parent, id, wxDefaultPosition, wxSize(100, 100) - ); - m_LbDevices->Bind( - wxEVT_CHECKLISTBOX, - &SettingsMidiDevices::MidiDeviceListSettings::OnChecked, - this - ); -} - -void SettingsMidiDevices::MidiDeviceListSettings::ClearDevices() -{ - // We cann't use lbDevices->Clear() because it disables the event handler - for (int i = m_LbDevices->GetCount() - 1; i >= 0; i--) - m_LbDevices->Delete(i); -} - -void SettingsMidiDevices::MidiDeviceListSettings::Init() -{ - ClearDevices(); - m_ConfListTmp.Clear(); -} - -void SettingsMidiDevices::MidiDeviceListSettings::RefreshDevices( - const GOPortsConfig& portsConfig, - const bool isToAutoEnable, - const MidiDeviceListSettings* pOutDevList -) -{ - ClearDevices(); - for (GOMidiPort* port : m_Ports) - if ( - port->IsToUse() - && portsConfig.IsEnabled(port->GetPortName(), port->GetApiName()) - ) - { - const wxString physicalName = port->GetName(); - GOMidiDeviceConfig* const pConf - = m_ConfList.FindByPhysicalName(physicalName); - GOMidiDeviceConfig* pConfTmp - = m_ConfListTmp.FindByPhysicalName(physicalName); - - if (! pConfTmp) - pConfTmp = pConf - ? m_ConfListTmp.Append( - *pConf, pOutDevList ? &pOutDevList->m_ConfListTmp : NULL - ) - : m_ConfListTmp.Append( - port->GetDefaultLogicalName(), - port->GetDefaultRegEx(), - isToAutoEnable, - physicalName - ); - - const int i = m_LbDevices->Append(physicalName, pConfTmp); - - if (pConfTmp->m_IsEnabled) - m_LbDevices->Check(i); - } -} - -unsigned SettingsMidiDevices::MidiDeviceListSettings::GetDeviceCount() const -{ - return m_LbDevices->GetCount(); -} - -GOMidiDeviceConfig& SettingsMidiDevices::MidiDeviceListSettings::GetDeviceConf( - unsigned i -) const -{ - return * (GOMidiDeviceConfig*) m_LbDevices->GetClientData(i); -} - -GOMidiDeviceConfig& - SettingsMidiDevices::MidiDeviceListSettings::GetSelectedDeviceConf() - const -{ - return GetDeviceConf(m_LbDevices->GetSelection()); -} - -void SettingsMidiDevices::MidiDeviceListSettings::OnChecked(wxCommandEvent& event) -{ - unsigned i = (unsigned) event.GetInt(); - - GetDeviceConf(i).m_IsEnabled = m_LbDevices->IsChecked(i); -} - -void SettingsMidiDevices::MidiDeviceListSettings::Save( - const MidiDeviceListSettings* pOutDevList -) -{ - for (int l = m_LbDevices->GetCount(), i = 0; i < l; i++) - { - GOMidiDeviceConfig* pDevConfTmp - = (GOMidiDeviceConfig*) m_LbDevices->GetClientData(i); - GOMidiDeviceConfig* pDevConf = m_ConfList.FindByPhysicalName( - pDevConfTmp->m_PhysicalName - ); - const GOMidiDeviceConfigList* pOutConfList - = pOutDevList ? & pOutDevList->m_ConfList : NULL; - - if (pDevConf) - { - pDevConf->Assign(*pDevConfTmp); - if (pOutConfList) - pOutConfList->MapOutputDevice(*pDevConfTmp, *pDevConf); - } else - m_ConfList.Append(*pDevConfTmp, pOutConfList); - } -} - SettingsMidiDevices::SettingsMidiDevices( GOSettings& settings, GOMidi& midi, wxWindow* parent ): @@ -152,10 +32,16 @@ SettingsMidiDevices::SettingsMidiDevices( m_Settings(settings), m_Midi(midi), m_InDevices( - m_Midi.GetInDevices(), m_Settings.m_MidiIn, this, ID_INDEVICES + m_Midi.GetInDevices(), + m_Settings.m_MidiIn, + this, + ID_INDEVICES ), m_OutDevices( - m_Midi.GetOutDevices(), m_Settings.m_MidiOut, this, ID_OUTDEVICES + m_Midi.GetOutDevices(), + m_Settings.m_MidiOut, + this, + ID_OUTDEVICES ) { wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); diff --git a/src/grandorgue/settings/SettingsMidiDevices.h b/src/grandorgue/settings/SettingsMidiDevices.h index 1c812d808..78321fe60 100644 --- a/src/grandorgue/settings/SettingsMidiDevices.h +++ b/src/grandorgue/settings/SettingsMidiDevices.h @@ -7,14 +7,12 @@ #ifndef SETTINGSMIDIDEVICES_H #define SETTINGSMIDIDEVICES_H -#include - #include #include -#include "GOMidiDeviceConfigList.h" #include "GOPortsConfig.h" #include "GOSettings.h" +#include "GOSettingsMidiDeviceList.h" #include "GOSettingsPorts.h" class wxButton; @@ -39,47 +37,8 @@ class SettingsMidiDevices : public wxPanel, GOSettingsPorts GOSettings& m_Settings; GOMidi& m_Midi; - class MidiDeviceListSettings - { - private: - const ptr_vector& m_Ports; - GOMidiDeviceConfigList& m_ConfList; - wxCheckListBox* m_LbDevices; - - // temporary storage for configs when edited - GOMidiDeviceConfigList m_ConfListTmp; - - void ClearDevices(); - - public: - MidiDeviceListSettings( - const ptr_vector& ports, - GOMidiDeviceConfigList& configListPersist, - wxWindow* parent, - wxWindowID id - ); - - wxCheckListBox* GetListbox() const { return m_LbDevices; } - - void Init(); - - void RefreshDevices( - const GOPortsConfig& portsConfig, - const bool isToAutoEnable, - const MidiDeviceListSettings* pOutDevList = NULL - ); - - unsigned GetDeviceCount() const; - GOMidiDeviceConfig& GetDeviceConf(unsigned i) const; - GOMidiDeviceConfig& GetSelectedDeviceConf() const; - - void OnChecked(wxCommandEvent& event); - - void Save(const MidiDeviceListSettings* pOutDevList = NULL); - }; - - MidiDeviceListSettings m_InDevices; - MidiDeviceListSettings m_OutDevices; + GOSettingsMidiDeviceList m_InDevices; + GOSettingsMidiDeviceList m_OutDevices; wxCheckBox* m_AutoAddInput; wxCheckBox* m_CheckOnStartup;