diff --git a/src/connectdlg.cpp b/src/connectdlg.cpp index 468296205d..c119809bec 100644 --- a/src/connectdlg.cpp +++ b/src/connectdlg.cpp @@ -205,6 +205,10 @@ CConnectDlg::CConnectDlg ( CClient* pNCliP, CClientSettings* pNSetP, const bool cbxServerAddr->setMaxCount ( MAX_NUM_SERVER_ADDR_ITEMS ); cbxServerAddr->setInsertPolicy ( QComboBox::NoInsert ); + // install event filter to catch FocusIn + cbxServerAddr->installEventFilter ( this ); + lvwServers->installEventFilter ( this ); + // set up list view for connected clients (note that the last column size // must not be specified since this column takes all the remaining space) #ifdef ANDROID @@ -276,8 +280,6 @@ CConnectDlg::CConnectDlg ( CClient* pNCliP, CClientSettings* pNSetP, const bool QObject::connect ( edtFilter, &QLineEdit::textEdited, this, &CConnectDlg::OnFilterTextEdited ); // combo boxes - QObject::connect ( cbxServerAddr, &QComboBox::editTextChanged, this, &CConnectDlg::OnServerAddrEditTextChanged ); - QObject::connect ( cbxDirectory, static_cast ( &QComboBox::activated ), this, &CConnectDlg::OnDirectoryChanged ); // check boxes @@ -333,6 +335,7 @@ void CConnectDlg::RequestServerList() // clear server list view lvwServers->clear(); + savedServer = nullptr; // update list combo box (disable events to avoid a signal) cbxDirectory->blockSignals ( true ); @@ -661,13 +664,6 @@ void CConnectDlg::OnServerListItemDoubleClicked ( QTreeWidgetItem* Item, int ) } } -void CConnectDlg::OnServerAddrEditTextChanged ( const QString& ) -{ - // in the server address combo box, a text was changed, remove selection - // in the server list (if any) - lvwServers->clearSelection(); -} - void CConnectDlg::OnCustomDirectoriesChanged() { @@ -1195,3 +1191,32 @@ void CConnectDlg::OnCurrentServerItemChanged ( QTreeWidgetItem* current, QTreeWi QAccessible::updateAccessibility ( new QAccessibleAnnouncementEvent ( lvwServers, announcement ) ); #endif } + +bool CConnectDlg::eventFilter ( QObject* obj, QEvent* event ) +{ + if ( obj == cbxServerAddr && event->type() == QEvent::FocusIn ) + { + // check for a selected server before clearing the selection in the list + QList CurSelListItemList = lvwServers->selectedItems(); + + if ( CurSelListItemList.count() > 0 ) + { + // there was a selected item - save it before deselecting + savedServer = GetParentListViewItem ( CurSelListItemList[0] ); + } + // remove selection in the server list (if any) + lvwServers->clearSelection(); + } + + if ( obj == lvwServers && event->type() == QEvent::FocusIn ) + { + if ( savedServer ) + { + // re-select any previously-selected server on regaining focus + lvwServers->setCurrentItem ( savedServer ); + savedServer = nullptr; + } + } + + return QDialog::eventFilter ( obj, event ); +} diff --git a/src/connectdlg.h b/src/connectdlg.h index 2d82a8c454..ad283a3a35 100644 --- a/src/connectdlg.h +++ b/src/connectdlg.h @@ -127,6 +127,9 @@ class CConnectDlg : public CBaseDlg, private Ui_CConnectDlgBase void EmitCLServerListPingMes ( const CHostAddress& haServerAddress, const bool bNeedVersion ); void UpdateDirectoryComboBox(); + bool eventFilter ( QObject* obj, QEvent* event ) override; + CMappedTreeWidgetItem* savedServer; + CClient* pClient; CClientSettings* pSettings; @@ -145,7 +148,6 @@ class CConnectDlg : public CBaseDlg, private Ui_CConnectDlgBase public slots: void OnServerListItemDoubleClicked ( QTreeWidgetItem* Item, int ); - void OnServerAddrEditTextChanged ( const QString& ); void OnDirectoryChanged ( int iTypeIdx ); void OnFilterTextEdited ( const QString& ) { UpdateListFilter(); } void OnExpandAllStateChanged ( int value ) { ShowAllMusicians ( value == Qt::Checked ); }