diff --git a/src/connectdlg.cpp b/src/connectdlg.cpp index 1fb04bfc90..b83c484ca3 100644 --- a/src/connectdlg.cpp +++ b/src/connectdlg.cpp @@ -124,6 +124,7 @@ bool CMappedTreeWidgetItem::operator<( const QTreeWidgetItem& other ) const CConnectDlg::CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteRegList, const bool bNEnableIPv6, QWidget* parent ) : CBaseDlg ( parent, Qt::Dialog ), + savedServer ( nullptr ), pSettings ( pNSetP ), strSelectedAddress ( "" ), strSelectedServerName ( "" ), @@ -205,6 +206,10 @@ CConnectDlg::CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteR 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,10 +281,11 @@ CConnectDlg::CConnectDlg ( CClientSettings* pNSetP, const bool bNewShowCompleteR 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 ); + // connect when pressing Enter in the Server Address box + QObject::connect ( cbxServerAddr->lineEdit(), &QLineEdit::returnPressed, this, &CConnectDlg::OnConnectClicked ); + // check boxes QObject::connect ( chbExpandAll, &QCheckBox::stateChanged, this, &CConnectDlg::OnExpandAllStateChanged ); @@ -332,6 +338,7 @@ void CConnectDlg::RequestServerList() strSelectedServerName = ""; // clear server list view + savedServer = nullptr; lvwServers->clear(); // update list combo box (disable events to avoid a signal) @@ -443,6 +450,7 @@ void CConnectDlg::SetServerList ( const CHostAddress& InetAddr, const CVectorclear(); // add list item for each server in the server list @@ -661,13 +669,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() { @@ -1187,3 +1188,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 a8aa8be694..d051706661 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; + CClientSettings* pSettings; QTimer TimerPing; @@ -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 ); } diff --git a/src/connectdlgbase.ui b/src/connectdlgbase.ui index f12cdbe39a..2545ab45e2 100644 --- a/src/connectdlgbase.ui +++ b/src/connectdlgbase.ui @@ -63,9 +63,6 @@ QAbstractItemView::NoEditTriggers - - true - Server Name